在中断操作中,C中断可以使用,无论函数定义在文件的什么地方,必须用一个附注(pragma)在函数定义之前通知编译器这个函数是一个中断操作:
#pragma interrupt_handler<name>:<vector number>*
“vector number”中断的向量号,注意向量号是从1开始的,那是复位向量。这个附注有两个作用:对中断操作函数,编译器生成RETI指令代替RET指令,而且保存和恢复在函数中用过的全部寄存器;编译器生成以向量号和目标MCU为基础的中断向量。
例如:
编译器生成的指令为
rjmp_timer_handler ;对普通AVR单片机MCU
或者
jmp_timer_handler ;对Mega单片机MCU
上述指令定位在0x06(字节地址,针对普通装置)和0x0c(字节地址,针对Mega装置)。Mega使用2个字作为中断向量,非Mega使用1字作为中断向量。如果希望对多个中断入口使用同一个中断操作,可以在一个interrupt_handler附注中放置多个用空格分开的名称,分别带有多个不同的向量号。例如:
#pragma interrupt_handler timer_ovf:7 timer_ovf:8
汇编中断操作,可以用汇编语言写中断操作。如果在汇编操作内部调用C函数,无论如何要小心。汇编程序要保存和恢复挥发寄存器(参考汇编界面),C函数不做这些工作。(www.xing528.com)
如果使用汇编中断操作,那么必须自己定义向量。使用“abs”属性描述绝对区域,用“.org”来声明rjmp或jmp指令的正确地址。注意这个“.org”声明使用的是字节地址。
;对全部除ATmega以外的MCU
.area vectors(abs);中断向量
.org 0x6
rjmp_timer
;对ATmega MCU
.area vectors(abs);中断向量
.org 0xC
jmp_timer
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。