我在FreeRTOS中实现了一个故障任务,它接受一个用作故障标志的二进制信号量。该故障标志由HAL_I2C_ErrorCallback或HAL_UART_ErrorCallback等STM32 HAL错误回调函数触发。如果发生错误,错误回调函数将调用signalFault()函数,该函数将通过提供二进制信号量来引发故障标志。
我的问题是:我的signalFault()函数是否被视为中断服务例程,因为它在HAL ISR错误回调中被调用?是否需要在signalFault()函数中调用xSemaphoreGiveFromISR()或xSemaphoreGive()函数来抛出故障标志?
发布于 2021-11-08 23:52:42
如果您不信任我们,那么简单地检查您是否在中断中。它将是100%安全的。
int isInISR( void )
{
return ( portNVIC_INT_CTRL_REG & portVECTACTIVE_MASK );
}在你的代码中:
if(isInISR()) xSemaphoreGiveFromISR(...);
else xSemaphoreGive(...);发布于 2021-11-08 08:54:15
当然,如果调用上下文是ISR,则应该使用xSemaphoreGiveFromISR。从ISR调用的函数仍然是ISR的一部分。
https://stackoverflow.com/questions/69880020
复制相似问题