freertos 互斥锁
时间: 2023-09-29 17:07:16 浏览: 104
FreeRTOS 互斥锁(Mutex)可以用来保护共享资源,以避免多个任务同时访问该资源而导致的数据竞争。
在 FreeRTOS 中,互斥锁是通过 xSemaphoreCreateMutex 函数创建的。该函数返回一个 SemaphoreHandle_t 类型的句柄,表示创建的互斥锁。
使用互斥锁时,需要先通过 xSemaphoreTake 函数获取互斥锁,然后对共享资源进行操作,并在操作完成后通过 xSemaphoreGive 函数释放互斥锁。这样可以确保在任何时刻只有一个任务能够访问共享资源。
下面是一个简单的示例代码,演示了如何使用 FreeRTOS 互斥锁来保护共享资源:
```c
SemaphoreHandle_t xMutex;
void task1(void *params)
{
while (true) {
// 获取互斥锁
xSemaphoreTake(xMutex, portMAX_DELAY);
// 访问共享资源
shared_resource++;
// 释放互斥锁
xSemaphoreGive(xMutex);
vTaskDelay(1000 / portTICK_PERIOD_MS);
}
}
void task2(void *params)
{
while (true) {
// 获取互斥锁
xSemaphoreTake(xMutex, portMAX_DELAY);
// 访问共享资源
shared_resource--;
// 释放互斥锁
xSemaphoreGive(xMutex);
vTaskDelay(1000 / portTICK_PERIOD_MS);
}
}
int main(void)
{
// 创建互斥锁
xMutex = xSemaphoreCreateMutex();
// 创建任务
xTaskCreate(task1, "Task1", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY + 1, NULL);
xTaskCreate(task2, "Task2", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY + 1, NULL);
// 启动调度器
vTaskStartScheduler();
return 0;
}
```
在上面的示例中,共享资源是一个变量 shared_resource,两个任务分别对其进行加一和减一操作。通过使用互斥锁来保护共享资源,可以确保两个任务不会同时访问该变量,避免了数据竞争的问题。
阅读全文