FreeRTOS的递归互斥锁
在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中成功配置和使用递归互斥锁。