SDCC 使用中断
SDCC允许使用C语言编写中断服务程序,并提供了一些扩展关键字。
void timer_isr (void) __interrupt (1) __using (1)
{
}
__interrupt关键字后面的可选数字是该例程将服务的中断号。如果存在,则编译器将在指定的中断号的中断向量表中插入对该例程的调用。如果您的项目中有多个源文件,中断服务例程可以存在于任何一个文件中,但是原型必须存在于包含主函数的文件中或被包含在其中。可选的(8051特定的)关键字__using可以用来告诉编译器在为该函数生成代码时使用指定的寄存器组。
常见问题
如果中断更改了其他函数访问了的变量,这些变量必须声明为 volatile
如果对变量的访问不是原子性的,则在访问期间必须禁用中断来保护。例如在 8 位的 CPU 上,对于 16 位或32位的变量访问显然不是原子性的,应该禁用中断来保护,但是如果使用 8 位的变量也不能保证安全.
中断服务中保存了返回值和使用的寄存器,他们都被储存在堆栈中,因此必须要有足够的空间。如果没有足够的空间,变量、寄存器等都会被破坏。