FreeRTOS判断当前程序是否在中断中执行

2019-08-18  本文已影响0人  tianxiaoMCU

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);
    }   
}
上一篇 下一篇

猜你喜欢

热点阅读