3

在我们的 PIC32MX 上使用 FreeRTOS 之前,我们能够通过简单地使用 ISR 来处理中断,例如:

void __ISR(_INTERRUPT_1_VECTOR, ipl7auto) {
    // Handle interrupt here
}

但是自从向我们介绍 FreeRTOS 后,我的讲师就让我们使用程序集包装器来处理中断。我们使用一个属性将中断向量绑定到我们要处理中断的函数,然后使用一些程序集来保存上下文,而不是这样:

void __attribute__((interrupt(ipl5), vector (_EXTERNAL_2_VECTOR))) vEXT2InterruptWrapper (void);

为什么我们需要在 FreeRTOS 中执行此操作?

4

2 回答 2

3

__ISR只是一个预处理器。它将扩展到编译器/链接器需要知道您希望该函数成为 ISR 的任何内容。

宏可能会自动执行任何必要的汇编级操作(例如保存寄存器状态),以便您继续处理来自 C 语言的中断。

于 2014-05-07T22:56:35.560 回答
2

好吧,当使用抢占式 RTOS 时,中断处理程序通常需要通过操作系统退出,这样如果它们发出信号量或事件的信号,任何等待它的线程都可以“立即”准备好。这就需要检测interrupt-return何时退出顶层中断,并返回RTOS内核而不是被中断的线程。这需要一些玩弄,并且需要汇编程序。如果没有抢占式 RTOS,则不需要这些东西。

于 2014-05-09T11:19:23.307 回答