在FreeRTOS中,递归互斥锁(Recursive Mutex)是一种特殊类型的互斥锁,允许同一个任务多次获取锁而不会导致死锁。配置和使用递归互斥锁的步骤如下:
### 1. 配置FreeRTOS
确保你的FreeRTOS配置文件(通常是`FreeRTOSConfig.h`)中启用了互斥锁功能。通常情况下,这个功能是默认启用的,但你可以检查以下配置项:
#define configUSE_MUTEXES 1
### 2. 创建递归互斥锁
使用`xSemaphoreCreateRecursiveMutex`函数创建一个递归互斥锁。
#include "FreeRTOS.h"
#include "semphr.h"// 创建递归互斥锁
SemaphoreHandle_t xRecursiveMutex;void createRecursiveMutex() {xRecursiveMutex = xSemaphoreCreateRecursiveMutex();if (xRecursiveMutex == NULL) {// 处理创建失败的情况}
}
### 3. 获取递归互斥锁
使用`xSemaphoreTakeRecursive`函数获取递归互斥锁。
void taskFunction() {if (xSemaphoreTakeRecursive(xRecursiveMutex, portMAX_DELAY) == pdPASS) {// 成功获取锁,执行需要保护的代码}
}
### 4. 释放递归互斥锁
使用`xSemaphoreGiveRecursive`函数释放递归互斥锁。
void taskFunction() {if (xSemaphoreTakeRecursive(xRecursiveMutex, portMAX_DELAY) == pdPASS) {// 成功获取锁,执行需要保护的代码// 释放锁xSemaphoreGiveRecursive(xRecursiveMutex);}
}
### 5. 示例代码
以下是一个完整的示例代码,展示了如何创建和使用递归互斥锁:
#include "FreeRTOS.h"
#include "task.h"
#include "semphr.h"SemaphoreHandle_t xRecursiveMutex;void vTask1(void *pvParameters) {for (;;) {if (xSemaphoreTakeRecursive(xRecursiveMutex, portMAX_DELAY) == pdPASS) {// 成功获取锁,执行需要保护的代码// 可以多次获取递归锁if (xSemaphoreTakeRecursive(xRecursiveMutex, portMAX_DELAY) == pdPASS) {// 执行需要保护的代码// 释放锁xSemaphoreGiveRecursive(xRecursiveMutex);}// 释放锁xSemaphoreGiveRecursive(xRecursiveMutex);}vTaskDelay(pdMS_TO_TICKS(100));}
}void createRecursiveMutex() {xRecursiveMutex = xSemaphoreCreateRecursiveMutex();if (xRecursiveMutex == NULL) {// 处理创建失败的情况}
}int main(void) {// 初始化硬件和其他必要的设置// 创建递归互斥锁createRecursiveMutex();// 创建任务xTaskCreate(vTask1, "Task 1", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY + 1, NULL);// 启动调度器vTaskStartScheduler();// 如果代码运行到这里,说明调度器启动失败for (;;);
}
通过以上步骤,你可以在FreeRTOS中成功配置和使用递归互斥锁。