1. Mutex用于保护共享资源。
  2. 任意时刻只有一个任务可以持有Mutex。
  3. Mutex被占用时,其他任务可以阻塞等待。
  4. 高优先级任务也不能强行夺走Mutex。
  5. Mutex应由取得它的任务释放。
  6. 持锁时间应该尽量短。
  7. 不要在持锁期间执行长延时、慢速打印或阻塞操作。
  8. 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