我正在使用Arduino Mega 2560并且有一个应用程序需要根据调用者传入的参数使用三个不同的定时器之一。我需要能够做到这样的事情:
ISR(TIMERX_COMPA_vect){
foo;
bar;
}
其中X是调用者传入的计时器的编号。我不能使用预处理器foo,因为在设置ISR之前不知道定时器号。
跟进
似乎ISR()是预处理器:avr/interrupt.h如果是这样,我想要做的就行不通。那么......有另一种方法可以“动态地”添加中断服务程序吗?
答案 0 :(得分:0)
基于对硬件中断的一些研究,我试图做的事似乎不可能。一般来说,有five steps to execute an interrupt:
当中断变为有效时,微控制器将执行以下步骤:
微控制器关闭当前正在执行的指令,并将下一条指令(PC)的地址保存在堆栈中。
它还会在内部保存所有中断的当前状态(即不在堆栈中)。
它跳转到中断向量表的内存位置,该表保存中断服务程序的地址。
微控制器从中断向量表中获取ISR的地址并跳转到它。它开始执行中断服务子程序,即RETI(从中断返回)。
执行RETI指令后,微控制器返回到中断位置。首先,它通过将堆栈的顶部字节弹出到PC中,从堆栈中获取程序计数器(PC)地址。然后,它开始从该地址执行。
由于ISR在调用之前必须位于正确的地址(由中断向量指向)(步骤4),因此必须完成#34;在加载到Arduino之前,因此,在运行之前。因此,预处理是最新的,可以在ISR中断向量分配中使用任何类型的变量替换。