STM32 HAL中断回调中应使用xSemaphoreGiveFromISR还是xSemaphoreGive?
FreeRTOS 中断上下文信号量操作问题解答
1. signalFault()的运行上下文判定
只要函数的调用链路起始于中断服务程序,无论中间嵌套多少层回调函数,所有链路内的代码都处于中断上下文,而非任务上下文。
STM32 HAL提供的HAL_I2C_ErrorCallback、HAL_UART_ErrorCallback等外设错误回调,本身就是在外设对应的中断服务函数内部被触发执行的,因此你在回调中调用的signalFault()完全运行在ISR上下文环境中。
2. 信号量释放API的选择
FreeRTOS针对中断上下文和任务上下文设计了完全独立的API集合,两类API禁止跨上下文混用:
- 禁止使用
xSemaphoreGive():该API仅适用于任务上下文,内部包含任务调度相关的阻塞判断逻辑,在中断上下文调用会导致系统调度逻辑混乱,严重时会触发硬件异常、系统崩溃。 - 必须使用
xSemaphoreGiveFromISR():该API是专门为中断上下文设计的信号量释放接口,适配中断的无阻塞运行要求,不会触发非法的任务调度操作。
补充注意:调用
xSemaphoreGiveFromISR()时需要传入pxHigherPriorityTaskWoken参数,若该参数返回值为pdTRUE,需要调用portYIELD_FROM_ISR()宏完成中断退出前的任务切换,保证高优先级任务能及时被调度执行。
内容的提问来源于stack exchange,提问作者Ivan Vnucec
相关产品推荐
相关产品推荐

