如何根据参数指定中断向量?

How do I specify an interrupt vector based on a parameter?

我正在使用 Arduino Mega 2560 并有一个应用程序需要根据调用者传入的参数使用三个不同的计时器之一。我需要能够做这样的事情:

ISR(TIMERX_COMPA_vect){
  foo;
  bar;
}

其中X为调用方传入的定时器编号。我不能使用预处理器 foo,因为在设置 ISR 之前不知道计时器编号。

跟进

看来 ISR() 是预处理器:avr/interrupt.h 如果是这样,我想做的事情将行不通。那么...有没有另一种添加中断服务程序的方法"on the fly?"

根据对硬件中断的一些研究,我试图做的似乎不可能。一般来说有five steps to execute an interrupt:

当中断激活时,微控制器将执行以下步骤:

  1. 单片机关闭当前正在执行的指令,将下一条指令(PC)的地址存入栈

  2. 它还在内部保存所有中断的当前状态(即不在堆栈上)。

  3. 它跳转到中断向量table的内存位置,其中包含中断服务例程的地址。

  4. 微控制器从中断向量table获取ISR的地址并跳转到它。它开始执行中断服务子程序,即RETI(return from interrupt).

  5. 执行RETI指令后,微控制器returns到被中断的位置。首先,它通过将堆栈的顶部字节弹出到 PC 中来从堆栈中获取程序计数器 (PC) 地址。然后,它从那个地址开始执行。

由于 ISR 在被调用(第 4 步)之前必须处于正确的地址(由中断向量指向),因此在加载到 Arduino 之前它必须是 "completed",因此,在运行-时间。所以预处理是最新的,可以在 ISR 中断向量分配中使用任何类型的变量替换。