您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# 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进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。