FreeRTOS判断当前程序是否在中断中执行
2019-08-18 本文已影响0人
tianxiaoMCU
FreeRTOS中有些API功能相同,但是会有一个带ISR
版本的用于中断中,就像下图标出的那样。
具体代码如下:
extern __asm uint32_t vPortGetIPSR(void); // 这个函数在FreeRTOS的port.c中可以找到
static __inline bool IS_IRQ(void)
{
if (vPortGetIPSR())
return TRUE;
return FALSE;
}
判断当前程序是否在中断中执行,如果是那就调用带ISR
版本,不然就调用普通版本,这样就不用分别封装两个函数了。
void xxx_func(void)
{
if (IS_IRQ())
{
BaseType_t xHigherPriorityTaskWoken = pdFALSE;
vTaskNotifyGiveFromISR(xTaskHdl, &xHigherPriorityTaskWoken);
portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
}
else
{
xTaskNotifyGive(xTaskHdl);
}
}