freeRTOS使用sem_destory的示例代码
时间: 2024-12-12 16:27:58 浏览: 14
FreeRTOS是一种轻量级嵌入式实时操作系统,它提供了一个高级的同步原语——Semaphore(信号量),用于控制对资源的竞争访问。`vSemaphoreDelete()` 或 `sem_destroy()` 函数通常用于释放之前由 `xSemaphoreCreate()` 创建的信号量。
以下是一个简单的示例代码片段,展示了如何创建、使用以及删除 FreeRTOS 的信号量:
```c
#include "FreeRTOS.h"
#include "semphr.h"
SemaphoreHandle_t mySemaphore; // 定义信号量
void setup() {
// 创建一个信号量,初始计数为0
mySemaphore = xSemaphoreCreateBinary();
if (mySemaphore == NULL) {
// 处理创建失败的情况
printf("Failed to create semaphore.\n");
} else {
printf("Semaphore created successfully.\n");
}
}
// 示例任务A,尝试获取信号量
void taskA(void* arg) {
vTaskDelay(pdMS_TO_TICKS(500)); // 等待一段时间
if (xSemaphoreTake(mySemaphore, portMAX_DELAY)) { // 如果可以立即获取,返回非阻塞
printf("Task A acquired semaphore.\n");
} else {
printf("Task A waiting for semaphore.\n");
}
vSemaphoreGive(mySemaphore); // 释放信号量
}
// 示例任务B,等待任务A释放信号量
void taskB(void* arg) {
while (1) {
if (xSemaphoreTake(mySemaphore, 0)) { // 非阻塞模式,如果信号量可用则获取
printf("Task B acquired semaphore.\n");
break;
}
}
vSemaphoreGive(mySemaphore);
}
int main() {
// 启动两个任务
xTaskCreate(taskA, "TaskA", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY + 1, NULL);
xTaskCreate(taskB, "TaskB", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL);
// 系统主循环
vTaskStartScheduler();
return 0; // 这一行永远不会执行,因为 FreeRTOS 是在调度器中管理任务的
}
// 删除信号量,一般在系统结束前进行,避免内存泄漏
void cleanup() {
if (mySemaphore != NULL) {
vSemaphoreDelete(mySemaphore);
mySemaphore = NULL;
printf("Semaphore deleted.\n");
}
}
```
在这个例子中,`taskA` 和 `taskB` 试图共享一个信号量。当`taskA` 获取到信号量后,`taskB` 就能继续执行;反之亦然。`sem_destroy()` 或 `vSemaphoreDelete()` 在`cleanup`函数里调用,确保资源管理得当。
阅读全文