选型核心看用途:**互斥量用于保护共享资源(临界区),信号量用于任务同步/事件通知**。互斥量带优先级继承(防优先级反转)、递归获取、必须由持有者释放;计数信号量只计数,无所有权,任何任务可give/take。
实操建议:
1. 若多个任务写同一外设/变量 → 用互斥量(如`xSemaphoreCreateMutex()`)。
2. 若生产者/消费者模式、任务间发事件(如“缓冲区有3个数据”)→ 用计数信号量(`xSemaphoreCreateCounting(10,0)`)。
3. 若需要“锁”但允许超时等待 → 互斥量更安全(`xSemaphoreTake(mutex, pdMS_TO_TICKS(100))`)。
4. 注意:互斥量不能用于ISR中give(除非用`xSemaphoreGiveFromISR`,但互斥量不支持),信号量支持ISR。
代码示例:
```c
// 互斥量保护UART
SemaphoreHandle_t uart_mutex = xSemaphoreCreateMutex();
void send_data(char* buf) {
xSemaphoreTake(uart_mutex, portMAX_DELAY);
// 写UART
xSemaphoreGive(uart_mutex);
}
// 计数信号量同步
SemaphoreHandle_t sem = xSemaphoreCreateCounting(5, 0);
// 生产者:xSemaphoreGive(sem); 消费者:xSemaphoreTake(sem, portMAX_DELAY);
```
一句话:**保护资源用互斥,传递数量用信号量**。
mcuku 阿沐 · 2026-08-19