检测FreeRTOS中的ISR方法调用

时间:2014-07-14 22:26:37

标签: interrupt freertos

是否可以确定是从ISR(中断服务请求)的上下文还是在运行时的任务中调用FreeRTOS中的方法?也许现有的函数已经存在,或者可能编写一种以某种方式检查堆栈的方法?

1 个答案:

答案 0 :(得分:1)

有两种方法可以做到这一点。我使用的是Cortex-M7微控制器。因此,我并非100%确定这适用于您的Cortex-M3。但是值得检查数据表。

第一种方法 检查Cortex-M内核的CPU寄存器。通常你有通常的R0-R12 CPU寄存器,SP(堆栈指针),LR(链接寄存器)和PC(程序计数器)。有一些额外的特殊' CPU寄存器,更具体地说:PSR,PRIMASK,FAULTMASK,BASEPRI和CONTROL。对于Cortex-M7核心来说就是这样。 现在考虑PSR寄存器。 PSR寄存器代表"程序状态寄存器"。其中有一个位域ISR_NUMBER [8:0]。如果它的值为0,则CPU处于"线程模式"。线程模式是正常的非中断模式。如果该值非零,则CPU正在执行中断。什么中断? ISR_NUMBER [8:0]中的值告诉您中断号。 读取PSR寄存器的值并非易事。您需要使用特定的汇编指令来执行此操作。在C中没有快速的方法。您将需要MSR(将常规移至特殊注册表)和MRS(移动特殊注册到一般注册表)指令。当然,内联汇编可以将它顺利地放在你的C代码中: - )

第二种方法 还有第二种方法。与前一个不同,您不需要读出CPU寄存器。相反,第二种方法要求你读出一般'一般'寄存器(就像你的微控制器中有几千个)。寄存器I指的是ICSR(中断控制和状态)寄存器。该寄存器位于SCB"系统控制块"中。寄存器有一个名为VECTACTIVE [8:0]的位域。同样,该位域包含活动中断的编号。如果该值为0,则CPU处于线程模式,这意味着当前没有正在运行的中断。

希望这有帮助。