ZHCUAQ1F july 2015 – april 2023
C/C++ 中断例程与任何其他 C/C++ 函数一样,可以有局部变量和寄存器变量;但是,其在声明时应该不带参数并且应该返回 void。C/C++ 中断例程可在栈上为局部变量分配多达 32K 的空间。例如:
__interrupt void example (void)
{
...
}
如果 C/C++ 中断例程未调用任何其他函数,则只会保存和恢复中断处理程序尝试定义的寄存器。但如果 C/C++ 中断例程调用 了其他函数,这些函数可修改中断处理程序未使用的未知寄存器。因此,如果调用了任何其他函数,例程会保存所有可用寄存器。中断返回指针 (IRP) 的中断分支。请勿直接调用中断处理函数。
可使用 INTERRUPT pragma 或 __interrupt 关键字,直接 通过 C/C++ 函数处理中断。如需更多信息,请分别参见 节 7.9.20 和 节 7.5.4。
您应负责在中断中正确地处理 CSR 中的 AMR 控制寄存器和 SAT 位。默认情况下,编译器不会执行任何额外操作来保存/恢复 AMR 和 SAT 位。c6x.h 头文件中包含了处理 SAT 位和 AMR 寄存器的宏命令。
例如,在一些些手动汇编代码中使用循环寻址(即 AMR 不等于 0)。这些手动汇编代码可以被中断为 C 代码中断服务例程。C 代码中断服务例程假设 AMR 设置为 0。您需要定义一个无符号整型的本地临时变量,并在 C 中断服务例程的起始和终止处调用 SAVE_AMR 和 RESTORE_AMR 宏命令,以在 C 中断服务例程中正确地保存/恢复 AMR。
#include <c6x.h>
__interrupt void interrupt_func()
{
unsigned int temp_amr;
/* define other local variables used inside interrupt */
/* save the AMR to a temp location and set it to 0 */
SAVE_AMR(temp_amr);
/* code and function calls for interrupt service routine */
...
/* restore the AMR for your hand assembly code before exiting */
RESTORE_AMR(temp_amr);
}
如果您需要在 C 中断服务例程中保存/恢复 SAT 位(即当在 C 中断服务例程中发生中断时,您正在执行饱和算术,该例程也可能执行一些饱和算术),可以通过与上述使用 SAVE_SAT 和 RESTORE_SAT 宏命令的示例类似的方式来完成。
如果需要,编译器会保存和恢复 ILC 和 RILC 控制寄存器。
对于浮点架构,您负责处理浮点控制寄存器 FADCR、FAUCR 和 FMCR。如果您正在从浮点控制寄存器中读取位,并且如果中断服务例程(或任何被调用的函数)执行浮点运算,则应保存和恢复相关的浮点控制寄存器。没有为这些寄存器提供宏命令,因为对 unsigned int 临时变量的简单赋值就足够了。