FreeRTOS 互斥锁使用示例
在 FreeRTOS 中,互斥锁用于保护临界区,确保在同一时刻只有一个任务可以访问共享资源。以下是一个简单的示例,展示如何使用互斥锁。
代码示例
#include "FreeRTOS.h"
#include "semphr.h"
// 定义互斥锁句柄
SemaphoreHandle_t xMutex;
// 宏定义
#define LOCK() xSemaphoreTake(xMutex, portMAX_DELAY) // 请求互斥锁
#define UNLOCK() xSemaphoreGive(xMutex) // 释放互斥锁
#define CREATE_MUTEX() xMutex = xSemaphoreCreateMutex() // 创建互斥锁
// 任务函数
void task_function(void *pvParameters) {
for (;;) {
// 请求互斥锁
LOCK(); // 直接调用 LOCK
// 在临界区执行操作,例如访问共享资源
// 释放互斥锁
UNLOCK(); // 直接调用 UNLOCK
}
}
// 创建互斥锁和任务
void create_mutex_and_task() {
// 创建互斥锁
if (CREATE_MUTEX() != NULL) {
// 创建任务
xTaskCreate(task_function, "TaskName", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL);
}
}
说明
互斥锁句柄:
SemaphoreHandle_t xMutex;:定义一个互斥锁句柄,用于后续的锁管理。
宏定义:
LOCK(): 使用 xSemaphoreTake() 请求互斥锁,任务在获取不到锁时将阻塞。
UNLOCK(): 使用 xSemaphoreGive() 释放互斥锁。
CREATE_MUTEX(): 调用 xSemaphoreCreateMutex() 创建互斥锁,并将其赋值给 xMutex。
任务函数:
task_function(): 任务的主体,负责请求和释放互斥锁,在临界区内执行对共享资源的操作。
创建互斥锁和任务:
create_mutex_and_task(): 封装了互斥锁的创建和任务的创建逻辑,确保互斥锁成功创建后才创建任务。
注意事项
确保在使用互斥锁时,适当地管理锁的获取和释放,以避免死锁和其他并发问题。
在设计任务时,要考虑临界区的大小,以减少持锁时间,提高系统效率。