您好,登录后才能下订单哦!
密码登录
            
            
            
            
        登录注册
            
            
            
        点击 登录注册 即表示同意《亿速云用户服务条款》
        # Task中二进制信号量怎么用
## 1. 二进制信号量概述
二进制信号量(Binary Semaphore)是嵌入式实时操作系统(RTOS)中最基础的同步机制之一,特别适用于任务间的简单同步和互斥访问。与计数信号量不同,二进制信号量只有两种状态:
- **0(不可用)**
- **1(可用)**
其核心特点是:
- 轻量级,占用资源少
- 解决任务间"生产者-消费者"问题
- 实现临界资源互斥访问
## 2. 二进制信号量的典型应用场景
### 2.1 任务同步
```c
// 示例:任务A完成后通知任务B
void TaskA(void *p) {
    while(1) {
        // 执行操作...
        xSemaphoreGive(binSem); // 释放信号量
    }
}
void TaskB(void *p) {
    while(1) {
        xSemaphoreTake(binSem, portMAX_DELAY); // 等待信号量
        // 收到信号后执行操作...
    }
}
// 保护共享资源
void AccessResource(void) {
    xSemaphoreTake(mutexSem, portMAX_DELAY);
    // 临界区操作
    xSemaphoreGive(mutexSem);
}
#include "FreeRTOS.h"
#include "semphr.h"
SemaphoreHandle_t xBinarySemaphore;
void vCreateSemaphore(void) {
    /* 创建二进制信号量 */
    xBinarySemaphore = xSemaphoreCreateBinary();
    
    /* 创建后初始状态为0,通常需要手动释放 */
    xSemaphoreGive(xBinarySemaphore);
}
| API函数 | 参数说明 | 返回值 | 
|---|---|---|
xSemaphoreTake() | 
xSemaphore: 信号量句柄 xTicksToWait: 阻塞时间  | 
pdTRUE: 获取成功 pdFALSE: 超时  | 
xSemaphoreGive() | 
xSemaphore: 信号量句柄 | pdTRUE: 释放成功 pdFALSE: 失败  | 
xSemaphoreGiveFromISR() | 
xSemaphore: 信号量句柄 pxHigherPriorityTaskWoken: 是否需要上下文切换  | 
同上 | 
// 硬件中断中释放信号量
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) {
    BaseType_t xHigherPriorityTaskWoken = pdFALSE;
    xSemaphoreGiveFromISR(btnSem, &xHigherPriorityTaskWoken);
    portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
}
// 任务中等待按键
void KeyProcessTask(void *p) {
    while(1) {
        if(xSemaphoreTake(btnSem, pdMS_TO_TICKS(100)) {
            // 处理按键事件
        }
    }
}
SemaphoreHandle_t uartSem;
void UART_Send(const char *data) {
    xSemaphoreTake(uartSem, portMAX_DELAY);
    HAL_UART_Transmit(&huart1, (uint8_t*)data, strlen(data), 100);
    xSemaphoreGive(uartSem);
}
现象:多次Give但只生效一次
解决方案:
- 检查是否在Give前信号量已为1状态
- 改用计数信号量(xSemaphoreCreateCounting)
优化建议:
graph TD
    A[高优先级任务] -->|等待| B[信号量]
    C[低优先级任务] -->|持有| B
    D[中优先级任务] --> 可能抢占C
| 机制 | 适用场景 | 特点 | 
|---|---|---|
| 二进制信号量 | 简单同步 | 只有0/1两种状态 | 
| 互斥量 | 资源保护 | 支持优先级继承 | 
| 事件组 | 多条件触发 | 可同时等待多个事件 | 
sem前缀,如semUart、semButton
#define SEM_WT_TIME pdMS_TO_TICKS(100)
if(xSemaphoreTake(sem, SEM_WT_TIME) == pdTRUE) {
   // 成功获取
}
if(xSemaphoreGive(sem) != pdPASS) {
   // 错误处理代码
}
StaticSemaphore_t xSemaphoreBuffer;
xBinarySemaphore = xSemaphoreCreateBinaryStatic(&xSemaphoreBuffer);
二进制信号量作为RTOS的基础同步原语,其正确使用对系统稳定性至关重要。建议开发者: 1. 充分理解信号量的状态变化机制 2. 通过实际项目积累调试经验 3. 必要时使用FreeRTOS的Trace功能分析信号量使用情况 “`
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。