信号量释放失败问题

        最近多线程编程中, 碰到信号量释放失败问题, 导致无限等待形成死锁, 幸亏在写代码的时候对释放动作返回值作了判断, 一看Log就知道是这个原因!

        跟了一下, 是因为不同线程使用了相同的内核命名, 导致不同线程操作同一内核对象同步出错.

### 中断释放信号量导致程序卡死的原因 当中断处理函数尝试释放RTOS中的二值信号量时,如果该中断的抢占优先级设置过高,则可能导致RTOS内核无法正常调度其他任务。具体来说,在STM32CubeMX FreeRTOS环境中,当按键触发外部中断(EXTI),并试图通过此中断来改变系统的状态或唤醒等待的任务时,过高的抢占优先级会阻止FreeRTOS内核及时响应和切换到高优先级的任务上[^2]。 由于RTOS依赖于可预测的时间片分配机制来进行多任务管理,一旦某个事件的发生频率超过了系统能够有效处理的速度,就可能造成某些操作被无限期延迟甚至完全忽略。对于基于中断的工作流程而言,这意味着尽管硬件已经完成了相应的动作(例如按钮按下),但由于软件层面未能得到适当的通知,最终使得整个进程陷入停滞状态——即所谓的“卡死”。 ### 解决方案 为了防止这种情况发生,应当调整引起问题的那个特定外设所关联的NVIC (Nested Vectored Interrupt Controller) 的配置参数: 1. **降低抢占优先级**:将引发冲突的中断源(如上述案例中的`EXTI0_IRQn`)的抢占优先级设定为较低数值(比如7)。这样可以确保即使有更高优先级别的异常请求到来,也不会妨碍RTOS本身的运作逻辑。 ```c HAL_NVIC_SetPriority(EXTI0_IRQn, 7, 0); ``` 2. **启用对应的IRQ通道**:确保相关联的中断向量已经被激活以便接收来自对应GPIO端口的变化通知 ```c HAL_NVIC_EnableIRQ(EXTI0_IRQn); ``` 通过对这些关键点做出修改之后,就能有效地缓解因为不当设置而引起的资源竞争状况,并让应用程序恢复正常的运行秩序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值