freertos的二值信号量的使用例子
时间: 2024-07-28 22:01:06 浏览: 54
FreeRTOS是一个实时操作系统(RTOS),它支持二进制信号量作为同步机制。二进制信号量是一种基本的互斥资源管理工具,用于控制对共享资源的访问。在FreeRTOS中,二进制信号量有三种状态:0(未被获取),1(已获取),负数(等待队列中等待获取的线程数量)。
以下是一个简单的使用例子:
```c
SemaphoreHandle_t xSemaphore = NULL; // 初始化一个二进制信号量
// 创建信号量
xSemaphoreCreateBinary(&xSemaphore);
// 线程A获取信号量
if (xSemaphoreTake(xSemaphore, portMAX_DELAY)) {
printf("Thread A acquired semaphore.\n");
// 执行需要保护的代码...
vTaskDelay(pdMS_TO_TICKS(1000)); // 模拟任务延迟
xSemaphoreGive(xSemaphore); // 释放信号量
}
// 线程B尝试获取信号量
if (xSemaphoreTake(xSemaphore, pdTIMEOUT) == pdFALSE) {
printf("Thread B timed out waiting for semaphore.\n");
} else {
printf("Thread B acquired semaphore after Thread A released it.\n");
// 同样执行需要保护的代码...
xSemaphoreGive(xSemaphore);
}
```
在这个例子中,`xSemaphoreTake`函数用于尝试获取信号量。如果当前信号量可用(即状态为1),则线程A会获得并将信号量置为0;如果信号量已被其他线程获取(状态为0),那么线程A会被阻塞直到信号量变为可用。`pdTIMEOUT`参数表示B线程设置了一个超时,如果没有在规定时间内获取到,则返回`pdFALSE`,并打印出相应的信息。
阅读全文