freeRTOS互斥信号量代码示例
时间: 2024-03-14 09:41:13 浏览: 35
当多个任务需要同时访问共享资源时,为了避免数据竞争和不一致性,可以使用互斥信号量来实现任务间的同步和互斥。在FreeRTOS中,可以使用信号量来实现互斥。
下面是一个使用FreeRTOS互斥信号量的代码示例:
```c
#include <FreeRTOS.h>
#include <task.h>
#include <semphr.h>
// 定义一个互斥信号量
SemaphoreHandle_t mutex;
// 共享资源
int sharedResource = 0;
// 任务1
void task1(void *pvParameters) {
while (1) {
// 等待获取互斥信号量
xSemaphoreTake(mutex, portMAX_DELAY);
// 访问共享资源
sharedResource++;
printf("Task 1: sharedResource = %d\n", sharedResource);
// 释放互斥信号量
xSemaphoreGive(mutex);
// 延时一段时间
vTaskDelay(pdMS_TO_TICKS(1000));
}
}
// 任务2
void task2(void *pvParameters) {
while (1) {
// 等待获取互斥信号量
xSemaphoreTake(mutex, portMAX_DELAY);
// 访问共享资源
sharedResource--;
printf("Task 2: sharedResource = %d\n", sharedResource);
// 释放互斥信号量
xSemaphoreGive(mutex);
// 延时一段时间
vTaskDelay(pdMS_TO_TICKS(1000));
}
}
int main(void) {
// 创建互斥信号量
mutex = xSemaphoreCreateMutex();
// 创建任务1
xTaskCreate(task1, "Task 1", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY + 1, NULL);
// 创建任务2
xTaskCreate(task2, "Task 2", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY + 1, NULL);
// 启动调度器
vTaskStartScheduler();
return 0;
}
```
在上面的示例中,我们首先定义了一个互斥信号量`mutex`和一个共享资源`sharedResource`。然后创建了两个任务`task1`和`task2`,它们会交替地访问共享资源。
在每个任务中,首先调用`xSemaphoreTake()`函数来获取互斥信号量,如果互斥信号量不可用,则任务会被阻塞。然后访问共享资源,完成后调用`xSemaphoreGive()`函数释放互斥信号量。
需要注意的是,在FreeRTOS中,互斥信号量只能在同一个任务中被多次获取,否则会导致死锁。因此,在使用互斥信号量时要确保正确的获取和释放顺序。