一、先明确两个核心概念互斥信号量带优先级继承 PI专门解决优先级反转只阻塞争夺同一共享资源的任务中断、无关任务正常运行高优先级任务只会等占用资源的低优先级任务不会被中等优先级任务拦截。全局关中断临界区暴力规避优先级反转不推荐进入临界区关闭所有中断调度器停止工作所有任务、所有硬件中断全部冻结不管和共享资源有没有关系一律不能抢占。任务模型统一例子场景两套方案对比三个任务优先级 H高优先级10 M中优先级5 L低优先级1 共享资源串口打印缓冲区全局共享资源 时序流程低优先级任务 L 先运行拿到串口资源L 正在操作资源时中等优先级 M 就绪紧接着高优先级任务 H 就绪也需要串口资源。场景 1使用【带优先级继承的互斥信号量】处理共享资源// 创建带优先级继承的互斥锁 osMutexNew(mutex_uart, OS_MUTEX_PRIO_INHERIT); // 低优先级任务 L(prio1) void Task_L(void) { while(1) { osMutexAcquire(mutex_uart, OS_WAIT_FOREVER); // 操作共享串口资源耗时较长10ms UART_SendBigBuffer(); osMutexRelease(mutex_uart); osDelay(10); } } // 中优先级任务 M(prio5)不使用串口 void Task_M(void) { while(1) { // 自身独立运算不碰共享资源 DataCalc(); osDelay(5); } } // 高优先级任务 H(prio10)需要串口 void Task_H(void) { while(1) { osMutexAcquire(mutex_uart, OS_WAIT_FOREVER); UART_SendShortMsg(); osMutexRelease(mutex_uart); osDelay(20); } }时序运行过程L 运行获取互斥锁开始操作串口M 就绪M 优先级高于 L正常情况下会抢占 L 但 L 持有带 PI 互斥锁系统临时把 L 的优先级提升到和 H 一样10M 优先级 5 临时提升后的 L 优先级 10M 无法抢占 L此时 H 就绪申请互斥锁失败进入阻塞L 不受 M 干扰持续执行完串口操作释放互斥锁L 优先级恢复为 1H 立刻抢占 CPU执行自己的串口逻辑优点表现中断全程开启传感器、外部按键、定时器中断正常响应无关任务不受影响M 只是无法抢占 LH 以外其他高优先级任务正常调度只约束争夺串口的任务系统实时性几乎无损不存在长时间屏蔽硬件中断中断延迟极小。最终结果完美消除优先级反转中等优先级 M 不会卡在中间阻断高优先级 H。场景 2使用【全局关中断临界区】保护共享资源暴力方案伪代码逻辑// 无信号量直接关全局中断保护串口 #define ENTER_CRITICAL() __disable_irq() #define EXIT_CRITICAL() __enable_irq() // 低优先级任务 L(prio1) void Task_L(void) { while(1) { ENTER_CRITICAL(); // 关闭全部中断调度器停止 // 操作共享串口耗时10ms UART_SendBigBuffer(); EXIT_CRITICAL(); // 打开中断恢复调度 osDelay(10); } } // 中优先级任务 M(prio5) void Task_M(void) { while(1) { DataCalc(); osDelay(5); } } // 高优先级任务 H(prio10) void Task_H(void) { while(1) { ENTER_CRITICAL(); UART_SendShortMsg(); EXIT_CRITICAL(); osDelay(20); } }时序运行过程L 运行进入临界区关闭全局中断M 就绪但中断关闭任务切换依赖 SysTick 中断调度器失效M 完全无法抢占 LH 紧接着就绪同样无法抢占只能原地等待 L 退出临界区整个 10ms 临界区内所有中断、所有任务全部冻结L 执行完串口打开中断调度器恢复H 立刻运行。表面效果确实不会出现 M 抢占 L看似解决了优先级反转。致命缺点对比互斥信号量所有硬件中断全部卡死如果此时有紧急外部中断故障告警、脉冲采集会丢失数据设备失控无关任务也被阻塞哪怕有另一个完全不用串口的超高优先级任务也必须等临界区结束临界区耗时越长系统最大中断延迟越大直接破坏实时性指标仅适合微秒级极短寄存器操作不能用于耗时较长的资源访问。