一、FreeRTOS的互斥量
FreeRTOS中的互斥量是一种特殊的二值信号量,它的本质上也是信号量。互斥量支持对临界资源的独占式处理,并具有以下特性:
- 支持互斥量所有权:一个任务可以持有一个互斥量并防止其他任务获取它,只有持有互斥量的任务才能访问临界资源。
- 支持递归访问:同一任务可以多次获取互斥量,而不会导致死锁。
- 支持防止优先级翻转:当一个低优先级任务持有互斥量时,高优先级任务不能获取该互斥量,从而避免了优先级翻转的问题。
互斥量的使用可以通过FreeRTOS提供的Semaphore API进行操作。例如,创建一个互斥量可以使用函数xSemaphoreCreateMutex(),获取互斥量可以使用函数xSemaphoreTake(),释放互斥量可以使用函数xSemaphoreGive()。
二、下面是一个使用FreeRTOS互斥量的简单例子:
#include "FreeRTOS.h"
#include "task.h"
#include "semphr.h"
// 定义互斥量
SemaphoreHandle_t xMutex;
void task1(void *pvParameters) {
while(1) {
// 获取互斥量
xSemaphoreTake(xMutex, portMAX_DELAY);
// 访问临界资源
printf("Task 1: accessing critical resource\n");
// 释放互斥量
xSemaphoreGive(xMutex);
vTaskDelay(pdMS_TO_TICKS(1000));
}
}
void task2(void *pvParameters) {
while(1) {
// 获取互斥量
xSemaphoreTake(xMutex, portMAX_DELAY);
// 访问临界资源
printf("Task 2: accessing critical resource\n");
// 释放互斥量
xSemaphoreGive(xMutex);
vTaskDelay(pdMS_TO_TICKS(1000));
}
}
int main(void) {
// 创建互斥量
xMutex = xSemaphoreCreateMutex();
// 创建任务
xTaskCreate(task1, "Task 1", configMINIMAL_STACK_SIZE, NULL, 1, NULL);
xTaskCreate(task2, "Task 2", configMINIMAL_STACK_SIZE, NULL, 2, NULL);
// 启动调度器
vTaskStartScheduler();
return 0;
}
在该示例中,首先创建了一个互斥量xMutex,并在两个任务中使用它来访问临界资源。其中,任务1和任务2都会获取互斥量,访问临界资源,然后释放互斥量。由于互斥量的特性,同一时刻只有一个任务能够获得该互斥量,从而保证了对临界资源的独占式访问。