bb36f2c58ccfd1cd
获得 1 次赞
帮助过17人
在MPLAB® XC16 C 编译器用户指南中的要设置中断,必须将一个函数的地址放置在向量表中的一个相应地址处,并且该函数必 须保护它所使用的任何系统资源。它必须使用 RETFIE 处理器指令返回到前台任务。中 断函数可以使用 C 语言编写。将某个 C 函数指定为中断处理程序时,编译器会安排保 护编译器使用的所有系统资源,并使用适当的指令从函数返回。编译器可选择安排使用 中断函数的地址填充中断向量表。 要安排让编译器填充中断向量,使之指向中断函数,请按照向量表中指示的形式命名函 数( 第 14.4.2 节“中断向量表”)。例如,如果定义了以下函数,将会自动填充堆栈错 误向量: void __attribute__((interrupt(auto_psv))) _StackError(void); 请注意使用前导下划线。类似地,如果定义了以下函数,将会自动填充备用堆栈错误向 量: void __attribute__((interrupt(auto_psv)) _AltStackError(void); 同样,请注意使用前导下划线。 对于没有特定处理程序的所有中断向量,将会安装默认的中断处理程序。默认中断处理 程 序 由 链 接 器 提 供,它 只 会 简 单 地 复 位 器 件。应 用 程 序 也 可 以 通 过 声 明 名 为 _DefaultInterrupt 的中断函数来提供默认中断处理程序。每个表中的最后 9 个中断向量没有预定义的硬件函数。可以通过使用向量表中指示的名 称 ( 第 14.4.2 节 “中断向量表”)来填充这些中断的向量,或者也可以使用更适合于 应用程序的名称,而通过使用 interrupt 属性的 irq 或 altirq 参数仍然填充相应的 向量。例如,要指定一个函数应使用主中断向量 52,请使用以下语句: void __attribute__((interrupt(auto_psv, irq(52)))) MyIRQ(void); 类似地,要指定一个函数应使用备用中断向量 53,请使用以下语句: void __attribute__((interrupt(auto_psv, altirq(52)))) MyAltIRQ(void); irq/altirq编号可以为中断请求编号 45至 53之一。如果使用了 interrupt属性的 irq 参数,则编译器会创建外部符号名称 __Interruptn,其中的 n 是向量编号。因此, C 标 识符 _Interrupt45 至 _Interrupt53 是由编译器保留的。按相同的方式,如果使用了 interrupt 属性的 altirq 参数,则编译器会创建外部符号名称 __AltInterruptn, 其中的 n 是向量编号。因此, C 标识符 _AltInterrupt45 至 _AltInterrupt53 是由 编译器保留的。