在PIC32MX上使用FreeRTOS之前,我们只需使用ISR即可处理中断:
void __ISR(_INTERRUPT_1_VECTOR, ipl7auto) {
// Handle interrupt here
}
但是自从我们向FreeRTOS介绍之后,我的导师让我们使用程序集包装器来处理中断。我们使用一个属性将中断向量绑定到我们想要处理中断的函数,然后使用一些程序集来保存上下文以及不喜欢的内容:
void __attribute__((interrupt(ipl5), vector (_EXTERNAL_2_VECTOR))) vEXT2InterruptWrapper (void);
为什么我们需要在FreeRTOS中执行此操作?
答案 0 :(得分:3)
__ISR
只是一个预处理器macro。它将扩展到编译器/链接器所需的任何内容,以便知道您希望该函数是ISR。
宏可能会自动执行任何程序集级别的操作(如保存寄存器状态),以便您继续使用C语言处理中断。
答案 1 :(得分:2)
好吧,当使用抢占式RTOS时,中断处理程序通常需要通过操作系统退出,这样如果他们发出了信号量或事件信号,任何等待它的线程都可以“立即”准备好。这需要检测中断返回何时退出最高级别的中断并返回到RTOS内核而不是中断线程。这需要一些麻烦,并且需要汇编程序。如果没有抢占式RTOS,则不需要这样的东西。