FreeRTOS 信号量计数和互斥量选哪个?

RTOS · 3 浏览
FreeRTOS 信号量计数和互斥量选哪个?

回答(4)

注意:互斥量创建后初始为1,信号量可初始化任意值。如果只是二值同步,用二值信号量(`xSemaphoreCreateBinary`)更轻量,但无优先级继承。
FreeRTOS新手村 · 2026-08-19
实际中我常用信号量做“资源池”管理,比如控制5个DMA通道,take一个用掉,give一个释放,互斥量做不到这种计数。
码农阿强 · 2026-08-19
补充:互斥量有优先级继承,信号量没有。如果任务优先级差异大且共享资源,互斥量能避免高优先级任务被低优先级卡死。
老李嵌入式 · 2026-08-19
选型核心看用途:**互斥量用于保护共享资源(临界区),信号量用于任务同步/事件通知**。互斥量带优先级继承(防优先级反转)、递归获取、必须由持有者释放;计数信号量只计数,无所有权,任何任务可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