一.为什么没有了INTERRUPT?
void XXX_vect(void) __attribute__((interrupt));
void XXX_vect(void)
{
}
即上面方式定义的中断程序可以再次被中断,XXX_vect 是中断例程名字,下面将说明。
二.可使用第二套中断名
三.用户未定义中断的截获
#include <avr/interrupt.h>
ISR(BADISR_vect){
这个服务程序是可选的,并不是强制用户处理未定义中断,如果不定义那结果就是产生未定义中断时复位。因为发生未定义中断往往就是用户程序的错误。
四.中断替换
当两个中断使用同一个服务程序时可例用中断替换宏ISR_ALIAS(vector,target_vector)此时服务程序只写一个。例如:
#include
ISR(INT0_vect)
{
PORTB = 42;
}
ISR_ALIAS(INT1_vect, INT0_vect);
当INT1 中断发生时就会执行INT0 的中断程序。Avr-libc 建议不要大量使用这个宏。用ISR实现中断嵌套也很简单
ISR(INT0_vect,ISR_NOBLOCK)
{
}
综上所述,新版GCCAVR在一些普通的实际应用中,我们使用中断的基本模式如下:
#include <avr/interrupt.h>
ISR(xxx_vect){
其中xxx_vect是对应器件的中断向量,在头文件iomxx.h中有说明,比如器件ATmega16对应的是iom16.h。
关于中断的帮助,用户在编译程序时可以查看对应的help文件avr-libc-user-manual,可以通过AVR GCC的help进入。