分享一些 FreeRTOS 计数信号量的高级应用案例以C语言示例
时间: 2024-09-20 12:16:01 浏览: 29
FreeRTOS是一种轻量级实时操作系统内核,它提供了丰富的同步原语,其中计数信号量(Counting Semaphore)就是一种常用的资源管理工具。计数信号量可以控制对公共资源的访问,比如在处理并发任务时,当资源可用(计数值大于0)时,多个任务可以同时获取;资源耗尽(计数值为0)时,只有等待的最优先任务才能继续。
下面是一个简单的C语言示例,展示如何在FreeRTOS环境中使用计数信号量:
```c
#include "FreeRTOS.h"
#include "semphr.h"
// 定义一个全局计数信号量
SemaphoreHandle_t xSemaphore = NULL;
void vTaskOne(void* pvParameters) {
// 获取信号量
if (xSemaphore == NULL) {
xSemaphore = xSemaphoreCreateCounting(SEMAPHORE_MAX_COUNT, 0); // 初始化为0,表示资源开始不可用
}
if(xSemaphoreTake(xSemaphore, portMAX_DELAY)) { // 如果当前资源不可用,阻塞并等待
printf("Task One got semaphore.\n");
// 在这里执行需要访问资源的任务...
vSemaphoreGive(xSemaphore); // 使用完资源后释放
} else {
printf("Task One couldn't get semaphore, resource is already in use.\n");
}
}
void vTaskTwo(void* pvParameters) {
// 同样尝试获取信号量
if(xSemaphoreTake(xSemaphore, portMAX_DELAY)) {
printf("Task Two got semaphore too.\n");
// 可能会冲突,因为任务一也持有信号量
vSemaphoreGive(xSemaphore);
} else {
printf("Task Two waited for semaphore to be free.\n");
}
}
int main() {
// 创建两个任务
xTaskCreate(vTaskOne, "Task One", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY + 1, NULL);
xTaskCreate(vTaskTwo, "Task Two", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY + 1, NULL);
// 开始调度
vTaskStartScheduler();
return 0;
}
```
在这个例子中,`vTaskOne` 和 `vTaskTwo` 都试图获取相同的信号量。如果资源可用,它们都会成功获取;如果资源已被占用,它们会进入阻塞状态直到资源释放。这就是计数信号量在并发环境下的基本应用。