互斥锁(Mutex)
使用流程
- 此时有一个变量,存在多个任务,各自会针对该变量进行长达 10ms / 15ms 的处理。
- 给出一个互斥锁。
- Task1:开锁->操作10ms->关锁
- Task2:开锁->操作15ms->关锁
- 在 Task1/2 关锁前 Task2/1 无法对变量进行操作,此时 Task2/1 会进行阻塞
代码示例
在代码中,使用了 vTaskDelay来模拟变量的处理花费的时间,而不是作为阻塞作用
因为互斥锁本身是有阻塞作用的
#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "freertos/semphr.h"
SemaphoreHandle_t xMutex;
int sharedResource = 0;
void vTask1(void *pvParameters) {
while(1) {
if(xSemaphoreTake(xMutex, portMAX_DELAY)) {
sharedResource++;
vTaskDelay(10 / portTICK_PERIOD_MS);
xSemaphoreGive(xMutex);
}
}
}
void vTask2(void *pvParameters) {
while(1) {
if(xSemaphoreTake(xMutex, portMAX_DELAY)) {
sharedResource--;
vTaskDelay(15 / portTICK_PERIOD_MS);
xSemaphoreGive(xMutex);
}
}
}
void app_main() {
xMutex = xSemaphoreCreateMutex();
xTaskCreate(vTask1, "Task1", 2048, NULL, 2, NULL);
xTaskCreate(vTask2, "Task2", 2048, NULL, 2, NULL);
}
License:
CC BY 4.0