一、信号量的创建
二进制信号量和计数型信号量使用的函数,核心操作函数(xSemaphoreGive()/xSemaphoreTake())是通用的,但创建函数不同,
// 释放信号量(二进制/计数型通用)
xSemaphoreGive(xSemaphore);
// 获取信号量(二进制/计数型通用)
xSemaphoreTake(xSemaphore, xTicksToWait);
1、包含头文件
#include "semphr.h" // 信号量核心头文件
2、定义信号量句柄
SemaphoreHandle_t xMySemaphore; // 信号量句柄
3、调用创建函数
| 信号量类型 | 创建函数 | 说明 |
|---|---|---|
| 二进制信号量 | xSemaphoreCreateBinary() | 初始为空,用于任务同步 |
| 计数型信号量 | xSemaphoreCreateCounting(uxMaxCount, uxInitialCount) | 初始计数值可配置,用于资源计数 |
| 互斥量(特殊二值信号量) | xSemaphoreCreateMutex() | 用于资源互斥访问,支持优先级继承 |
二进制信号量创建:
xMySemaphore = xSemaphoreCreateBinary();
计数型信号量创建
// 最大计数值5,初始计数值0
xMySemaphore = xSemaphoreCreateCounting(5, 0);
4、检查创建结果
if(xMySemaphore == NULL) {
// 创建失败(如内存不足),需错误处理
}
二、信号量的基本使用 释放(Give)和获取(Take)
1、释放信号量(Give)
通过xSemaphoreGive()释放信号量(二进制信号量置为 “满”,计数型信号量计数值 + 1):
BaseType_t xStatus;
// 释放信号量(成功返回pdPASS,失败返回errQUEUE_FULL)
xStatus = xSemaphoreGive(xMySemaphore);
if(xStatus == pdPASS) {
// 信号量释放成功
}
2、获取信号量(Take)
通过xSemaphoreTake()获取信号量(二进制信号量置为 “空”,计数型信号量计数值 - 1):
BaseType_t xStatus;
// 获取信号量:阻塞10个tick,超时返回失败
xStatus = xSemaphoreTake(
xMySemaphore, // 目标信号量句柄
10 // 阻塞超时时间(portMAX_DELAY为永久阻塞)
);
if(xStatus == pdPASS) {
// 获取成功,执行需要同步/保护的操作
} else {
// 超时未获取到信号量
}
三、注意
二进制信号量:任务同步(如按键触发 LED 动作)
释放方:事件发生时(按键按下)调用xSemaphoreGive();
获取方:等待事件时调用xSemaphoreTake(),获取到后执行动作。
计数型信号量:资源计数(如空闲缓冲区数量、可用打印机数量)
资源可用时:释放信号量(计数值 + 1);
申请资源时:获取信号量(计数值 - 1),计数值为 0 时阻塞等待。
554

被折叠的 条评论
为什么被折叠?



