1

我已经在 FreeRTOS 中实现了一个错误任务,该任务将二进制信号量用作错误标志。该故障标志由 STM32 HAL 错误回调函数触发,例如HAL_I2C_ErrorCallbackHAL_UART_ErrorCallback。如果发生错误,错误回调函数将调用signalFault()函数,该函数将通过提供二进制信号量来引发故障标志。

我的问题是:我的signalFault()函数是否被视为中断服务例程 (ISR),因为它在 HAL ISR 错误回调中被调用?我是否需要调用xSemaphoreGiveFromISR()xSemaphoreGive()函数signalFault()来提高故障标志?

4

2 回答 2

1

如果您不信任我们,请检查您是否处于中断状态。这将是 100% 安全的。

int isInISR( void ) 
{
    return ( portNVIC_INT_CTRL_REG & portVECTACTIVE_MASK );
}

并在您的代码中:

if(isInISR()) xSemaphoreGiveFromISR(...);
else xSemaphoreGive(...);
于 2021-11-08T23:52:42.120 回答
0

当然,xSemaphoreGiveFromISR如果调用上下文是 ISR,您应该使用。从 ISR 调用的函数仍然是 ISR 的一部分。

于 2021-11-08T08:54:14.620 回答