FreeRTOS中有些API功能相同,但是会有一个带ISR版本的用于中断中,就像下图标出的那样。
如果自己封的函数需要在中断和任务中都调用,简单点就跟着封装两个函数,一个任务中用,一个中断中用。对于我这种有强迫症的还是觉得不爽,如果有方法能判断当前是否处于中断处理程序中不就好办了?幸运的是FreeRTOS自身就提供了一个相关的函数,有了这个函数就可以判断了。
具体代码如下:
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);
}
}













网友评论