前期版别的avr-libc 对中止服务程序的书写供给了两个宏SIGNAL 和INTERRUPT,而且需求包括两个头文件:avr/signal.h 和avr/interrupt.h。新版(如2007 版WINAVR)中,INTERRUPT 宏不再可用,而主张用ISR 宏代替SIGNAL宏,ISR 和SIGNAL 是一回事,但今后的版别中SIGNAL 宏将会逐步被丢掉,所以新的程序主张运用ISR,也便是运用ISR作为中止服务函数名,下面将举例阐明一些详细的中止运用。
一.为什么没有了INTERRUPT?
INTERRUPT 宏是各中止嵌套有关的,当中止程序得到履行时AVR 的硬件将大局的中止答应符号铲除,其它中止无法再产生,当中止程序退出时主动被答应。而INTERRUPT宏让编译器所做的便是在中止程序的入口处刺进一个SEI 指令,退出处刺进一个CLI 指令,使得中止能够嵌套,或许这关于一般的程序含义不大,INTERRUPT 才被去掉的。但是依然能够运用下面的办法完成INTERRUPT 宏的功用:
void XXX_vect(void) __attribute__((interrupt));
void XXX_vect(void)
{
//程序
}
即上面办法界说的中止程序能够再次被中止,XXX_vect 是中止例程姓名,下面将阐明。
二.可运用第二套中止名
前期版别的avr-libc 中中止例程名为SIG_最初,从avr-libc 1.4.0 版开端第二套中止称号,它以_vect 为后缀。由于在器材手册里用比方用TIMER2 COMP表明定时器2比较匹配中止,新的办法更挨近手册,称可查libc 手册或器材对应io.h 文件。
三.用户未界说中止的截获
下如书中所说前期版别中用户未界说服务程序的中止产生时体系就会复位,而新版别能够截获这种中止了,运用如下:
#include
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
ISR(xxx_vect){ // 服务程序}
其间xxx_vect是对应器材的中止向量,在头文件iomxx.h中有阐明,比方器材ATmega16对应的是iom16.h。
关于中止的协助,用户在编译程序时能够检查对应的help文件avr-libc-user-manual,能够经过AVR GCC的help进入。