- Mutex用于保护共享资源。
- 任意时刻只有一个任务可以持有Mutex。
- Mutex被占用时,其他任务可以阻塞等待。
- 高优先级任务也不能强行夺走Mutex。
- Mutex应由取得它的任务释放。
- 持锁时间应该尽量短。
- 不要在持锁期间执行长延时、慢速打印或阻塞操作。
- Mutex和二值信号量用途不同。
static SemaphoreHandle_t xResourceMutex = NULL;
xResourceMutex = xSemaphoreCreateMutex();
xTaskCreate(vLowPriorityTask,"LowMutex",configMINIMAL_STACK_SIZE,NULL,1,NULL);
xTaskCreate(vHighPriorityTask,"HighMutex",configMINIMAL_STACK_SIZE,NULL,2,NULL);
static void vHighPriorityTask(void *pvParameters)
{
(void)pvParameters;
vTaskDelay(pdMS_TO_TICKS(100));//先让出cpu给到低优先级的任务
for (;;)
{
if (xSemaphoreTake(xResourceMutex, portMAX_DELAY) == pdTRUE)
{
xSemaphoreGive(xResourceMutex);
}
vTaskDelay(pdMS_TO_TICKS(1000));
}
}
static void vLowPriorityTask(void *pvParameters)
{
(void)pvParameters;
for (;;)
{
if (xSemaphoreTake(xResourceMutex, portMAX_DELAY) == pdTRUE)
{
vTaskDelay(pdMS_TO_TICKS(300));//又让出给到高优先级,如果不让出去,高优先级任务也只能阻塞等待
xSemaphoreGive(xResourceMutex);
}
vTaskDelay(pdMS_TO_TICKS(700));
}
}
LOW取得Mutex
Mutex Owner=LOW
HIGH醒来并抢占LOW
HIGH尝试Take
Mutex仍属于LOW
HIGH进入Blocked
LOW恢复运行
LOW完成共享资源操作
LOW执行Give
HIGH恢复Ready
HIGH优先级更高
HIGH抢占LOW
HIGH的Take返回成功
Mutex Owner=HIGH
HIGH修改共享资源
HIGH执行Give