SemaphoreHandle_t
SemaphoreHandle_t是一个通用的信号量句柄类型,可以用于各种类型的信号量,包括二进制信号量、计数信号量和互斥信号量。它是一个void*类型的指针,用于标识一个信号量对象。主要的操作函数包括创建、获取和释放信号量等。例如:
创建信号量:xSemaphoreCreateBinary()、xSemaphoreCreateCounting()、xSemaphoreCreateMutex()等
。
获取信号量:xSemaphoreTake()
。
释放信号量:xSemaphoreGive()
。
**
xSemaphoreCreateBinary()、xSemaphoreCreateCounting() 、xSemaphoreCreateMutex() 是用于创建不同类型的信号量的 API 函数
1. xSemaphoreCreateBinary()
功能:创建一个二值信号量(Binary Semaphore)。
特性:信号量的值只有 0 和 1 两种状态。
常用于任务间同步,或者中断与任务的通信(如事件触发)。
用法:
SemaphoreHandle_t xBinarySemaphore = xSemaphoreCreateBinary();
if (xBinarySemaphore != NULL) {
// 成功创建信号量
xSemaphoreGive(xBinarySemaphore); // 初始状态设为 1(可用)
}
例子:中断触发事件时,通知任务处理:
void ISR_Handler() {
BaseType_t xHigherPriorityTaskWoken = pdFALSE;
xSemaphoreGiveFromISR(xBinarySemaphore, &xHigherPriorityTaskWoken);
portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
}
void TaskFunction(void *pvParameters) {
for (;;) {
if (xSemaphoreTake(xBinarySemaphore, portMAX_DELAY)) {
// 处理中断事件
}
}
}
2. xSemaphoreCreateCounting()
功能:创建一个计数信号量(Counting Semaphore)。
特性:信号量的值可以在一个范围内递增或递减。
常用于管理资源的可用数量,例如线程池或固定资源的并发访问。
用法:
SemaphoreHandle_t xCountingSemaphore = xSemaphoreCreateCounting(5, 0);
if (xCountingSemaphore != NULL) {
// 最大值为 5,初始值为 0
xSemaphoreGive(xCountingSemaphore); // 增加信号量
}
例子:限制任务对资源的并发访问数量:
SemaphoreHandle_t xResourceSemaphore;
void InitResources() {
xResourceSemaphore = xSemaphoreCreateCounting(3, 3); // 最大值和初始值均为 3
}
void TaskFunction(void *pvParameters) {
for (;;) {
if (xSemaphoreTake(xResourceSemaphore, portMAX_DELAY)) {
// 访问资源
vTaskDelay(pdMS_TO_TICKS(100)); // 模拟资源使用
xSemaphoreGive(xResourceSemaphore); // 释放资源
}
}
}
3. xSemaphoreCreateMutex()
功能:创建一个互斥信号量(Mutex)。
特性:互斥信号量是二值信号量的特殊实现,带有任务优先级继承功能。
常用于保护共享资源,防止竞争条件。
用法:
SemaphoreHandle_t xMutex = xSemaphoreCreateMutex();
if (xMutex != NULL) {
// 成功创建互斥信号量
}
例子:保护共享资源的访问:
SemaphoreHandle_t xMutex;
void TaskFunction(void *pvParameters) {
for (;;) {
if (xSemaphoreTake(xMutex, portMAX_DELAY)) {
// 访问共享资源
vTaskDelay(pdMS_TO_TICKS(50)); // 模拟资源使用
xSemaphoreGive(xMutex); // 释放资源
}
}
}
osMutexId_t
有时候可能大家还会看到这种的信号量,这个是CMSIS-RTOS v2 的互斥量句柄类型。用于与 CMSIS-RTOS API 兼容的互斥量操作,它的功能和xSemaphoreCreateMutex()创建的信号量是一样的。
定义:CMSIS-RTOS v2 的互斥量句柄类型。
用途:用于与 CMSIS-RTOS API 兼容的互斥量操作。
代码示例:
osMutexId_t myMutex = osMutexNew(NULL);
if (myMutex != NULL) {
osMutexAcquire(myMutex, osWaitForever);
// 临界区操作
osMutexRelease(myMutex);
}
区别
SemaphoreHandle_t 是 FreeRTOS 原生 API 使用的句柄。
osMutexId_t 是 CMSIS-RTOS 兼容层定义的句柄,适用于 CMSIS 标准库。
*osMutexId_t 和 xSemaphoreCreateMutex() 的作用本质上是相同的,都是用来创建和操作互斥信号量的,它们的主要区别在于 API 层面 和 支持的标准
来源:CMSIS-RTOS API,属于 ARM 定义的标准化接口。
用途:为应用程序提供与不同 RTOS(如 FreeRTOS、RTX)之间的兼容性。*