首页 > 应用 > 单片机应用
[导读]AVRGCC/WinAVR编译环境中断函数的使用方法

早期版本的avr-libc 对中断服务程序的书写提供了两个宏SIGNAL 和INTERRUPT,并且需要包含两个头文件:avr/signal.h 和avr/interrupt.h。新版(如2007 版WINAVR)中,INTERRUPT 宏不再可用,而建议用ISR 宏替代SIGNAL宏,ISR 和SIGNAL 是一回事,但以后的版本中SIGNAL 宏将会逐渐被丢弃,所以新的程序建议使用ISR,也就是使用ISR作为中断服务函数名,下面将举例说明一些具体的中断使用。

本文引用地址: http://www.21ic.com/app/mcu/201712/745941.htm

一.为什么没有了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进入。

换一批

延伸阅读

[单片机应用] S3C2416裸机开发系列十四_GCC下UCGUI的移植(1)

S3C2416裸机开发系列十四_GCC下UCGUI的移植(1)

GUI(图形用户界面)极大地方便了非专业用户的使用,用户无需记忆大量的命令,取而代之的是可以通过窗口、菜单、按键等方式进行操作。在某些场合,设计一款人机界面丰富友好的嵌入式产品能赢得更多的用户。笔者此处就s......

关键字:S3C2416 裸机开发 GCC UCGUI 移植

[单片机应用] AVR单片机IC卡程序

AVR单片机IC卡程序

AVR单片机IC卡程序#include#include#defineucharunsignedchar#defineuintunsignedint//**********定义全局变量*****************......

关键字:单片机 程序 AVR IC

[单片机应用] ICCAVR自动下载程序说明

ICCAVR自动下载程序说明

ICCAVR软件有ISP功能,能过调用STK500完成的,只要设置好参数,在ICCAVR中就可以给芯片编程了,还可以让程序一编译完就自动下载到芯片中,相当方便。在Tools->environmentoption......

关键字:程序 ICCAVR

[单片机应用] AVR单片机(学习ing)—(四)、ATMEGA16的定时/计数器—04

AVR单片机(学习ing)—(四)、ATMEGA16的定时/计数器—04

四、ATMEGA16的定时/计数器四—(04)、0~5V数字电压调整器PWM数字电压调整器由于定时器2(就是上一个实验)只能构成8位的PWM,作为数字电压调整器其精度不够,这里用定时器1构成10位PWM来实现0~5V的数字电压调整值显......

关键字:AVR单片机 ATMEGA16 定时 计数器

[单片机应用] avr单片机proteus仿真第二课:流水灯

avr单片机proteus仿真第二课:流水灯

先实现一个最简单的avr单片机proteus仿真,流水灯。对IO口写数据要先设置DDRxn=0xff,然后才输出PORTxn=输出数据。电路仿真图如下:avr c程序如下:#include #include int main(void){u......

关键字:avr单片机 proteus仿真 流水灯

[消费类电子新闻] 华为的胜诉显现中国创新力量的崛起

华为的胜诉显现中国创新力量的崛起

1月11日,华为诉三星侵犯知识产权案一审宣判,深圳中院知识产权第二庭宣布,被告三星立即停止以制造销售和许诺销售的形式,侵害华为201110269715.3专利权的行为,驳回华为的其他诉讼请求。......

关键字:华为 三星 知识产权

我 要 评 论

网友评论

技术子站

更多

项目外包

更多

推荐博客