宁波欣创电子科技官网
收藏本站
搜索

扫一扫,访问微社区

QQ登录

只需一步,快速开始

注册 找回密码
官方旗舰店新品上线AVR入门提高步步通视频SD卡高清视频教程免费下载AVR单片机十日通全集视频MSP430单片机视频教程

39

主题

39

帖子

151

积分

超级版主

Rank: 8Rank: 8

积分
151

活跃会员推广达人论坛元老

发表于 2013-12-21 22:55:20 | 显示全部楼层 |阅读模式
早期版本的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)
{
      //程序

}

它以_vect 为后缀。因为在器件手册里用比如用TIMER2 COMP表示定时器2比较匹配中断,

新的方法更接近手册,称可查libc 手册或器件对应io.h 文件。

二.可使用第二套中断名
早期版本的avr-libc 中中断例程名为SIG_开头,从avr-libc 1.4.0 版开始第二套中断名称。
三.用户未定义中断的截获
下如书中所说早期版本中用户未定义服务程序的中断发生时系统就会复位,而新版本可
以截获这种中断了,使用如下:  

#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进入。

即上面方式定义的中断程序可以再次被中断,XXX_vect 是中断例程名字。



精品嵌入式产品尽在宁波欣创电子科技官方旗舰店http://avrgcc.taobao.com
您需要登录后才可以回帖 登录 | 立即加入

在线客服

Archiver|手机版| ( 浙ICP备09058229号浙公网安备33020502000039号 )     

返回顶部