您的位置 首页 汽车

AVR单片机研讨(8):GCC-AVR的中止

目录1头文件2中断函数格式3中断向量名称4中断函数的设计着力点5C语言编写ISR的原则注意:本文使用的GCC-AVR版本为WinAVR20100110中

目录

1.头文件
2.中止函数格局
3.中止向量称号
4.中止函数的规划着力点
5.C言语编写ISR的准则
//留意:本文运用的GCC-AVR版别为WinAVR20100110

中止不是C言语的一部分,中止的完结是由编译器完结的。所以,不同版别的编译器的中止的写法有很大的不同;即便同样是WinAVR,不同版别中的中止向量居然都是略有差异的!

1.头文件
假如运用GCC-AVR的中止操作,有必要包含头文件interrupt.h,即:
#include<avr/interrupt.h>
进一步阐明:WinAVR20100110版别现已不支持运用头文件signal.h了,为了向后兼容,假如固执引进signal.h,其实相当于也是引进的interrupt.h。翻开signal.h文件,除了前面一大堆‘没用的’版权信息和阐明,只要如下几行内容:
#ifndef_AVR_SIGNAL_H_
#define_AVR_SIGNAL_H_
//这两句加上最终的#endif是条件界说,防止重复引证的
#warning”This header file is obsolete. Use .”
//这一句【正告】指出,让咱们运用interrupt.h
#include
//这一句告知咱们,即便你忘了或许不知道运用interrupt.h,那么也不会犯错,引证signal.h相当于引如了interrupt.h。不过何须脱了裤子放屁——多此一举呢,直接引证interrupt.h就好了!
#endif

2.中止函数格局

现在官方引荐的中止书写格局就有一种:
ISR(INTERRUPT_vect)//INTERRUPT_vect是中止向量称号
{
//中止处理代码
}
3.中止向量的称号
中止向量的称号在WinAVR的最近几个版别中有所改变,是微调。正是由于是微调,假如不留意,将会呈现难以发现的过错。最好的方法便是翻开检查X:WinAVR-20100110avrincludeavr途径下的你运用的处理器所对应的IO界说头文件。比方我运用的是ATmega16A,我就在此途径下找到了iom16a.h,翻开它,找到
这两句话后面的,便是本类型单片机界说的一切中止。以下便是ATmega16A的中止,悉数照抄如下:
============================开端====================================
#defineINT0_vect_num 1
#defineINT0_vect_VECTOR(1)
#define INT1_vect_num 2
#defineINT1_vect_VECTOR(2)
#define TIMER2_COMP_vect_num 3
#defineTIMER2_COMP_vect_VECTOR(3)
#define TIMER2_OVF_vect_num 4
#defineTIMER2_OVF_vect_VECTOR(4)
#define TIMER1_CAPT_vect_num 5
#defineTIMER1_CAPT_vect_VECTOR(5)
#define TIMER1_COMPA_vect_num 6
#defineTIMER1_COMPA_vect_VECTOR(6)
#define TIMER1_COMPB_vect_num 7
#define TIMER1_COMPB_vect_VECTOR(7)
#define TIMER1_OVF_vect_num 8
#defineTIMER1_OVF_vect_VECTOR(8)
#define TIMER0_OVF_vect_num 9
#defineTIMER0_OVF_vect _VECTOR(9)
#define SPISTC_vect_num 10
#defineSPISTC_vect_VECTOR(10)
#define USARTRXC_vect_num 11
#defineUSARTRXC_vect_VECTOR(11)
#define USARTUDRE_vect_num 12
#defineUSARTUDRE_vect_VECTOR(12)
#define USARTTXC_vect_num 13
#defineUSARTTXC_vect_VECTOR(13)
#define ADC_vect_num 14
#defineADC_vect_VECTOR(14)
#define EE_RDY_vect_num 15
#defineEE_RDY_vect_VECTOR(15)
#define ANA_COMP_vect_num 16
#defineANA_COMP_vect_VECTOR(16)
#define TWI_vect_num 17
#defineTWI_vect_VECTOR(17)
#define INT2_vect_num 18
#defineINT2_vect_VECTOR(18)
#define TIMER0_COMP_vect_num 19
#defineTIMER0_COMP_vect_VECTOR(19)
#define SPM_RDY_vect_num 20
#defineSPM_RDY_vect_VECTOR(20)
#define _VECTOR_SIZE 4
#define _VECTORS_SIZE (21 * _VECTOR_SIZE)
=========================完毕==================================
就以外部中止向量0为例吧。INT0_vect便是中止向量的称号或许写法了。加粗是我处理的,加粗的便是中止向量称号。
比方,写外部中止0的中止处理函数,就有必要这么写:
ISR(INT0_vect)
{
//处理代码
}
再比方串口接纳完结中止函数,就有必要这么写:
ISR(USARTRXC_vect)
{
//处理代码
}
要留意,是USARTRXC_vect,而不是USART_RXC_vect!!!
4.中止函数的规划着力点
运用C言语编写的处理代码,首要考虑中止功能上的处理,而不需求考虑现场维护和康复等问题。编译器会主动参加代码完结中止现场的维护,并在中止完毕时主动康复现场。但假如在中止服务程序中需求修正某些全局变量时,是否需求维护这些变量的初值将由编程员自己决议和施行。
5.C 言语编写ISR的准则
两个字:高效。
更详细的,体现为:
1.代码尽量简略,中止服务着重的是一个“快”字。(中止处理很“快”,是运用中止而不是查询的重要原因)
2.防止在中止内运用函数调用。尽管 GCC-AVR答应在中止里调用其它函数,但为了防止递归调用的问题,此函数有必要为中止服务独家专用。假如非要调用,无妨把本来要写在其它函数内的代码直接写在中止服务程序中。
3.防止在中止内进行数学运算。数学运算将很有或许用到库函数和许多中心变量,就算不呈现递归调用的问题,光在中止进口和出口处为了维护和康复这些中心暂时变量就需求很多的开支,严重影响中止服务的功率。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/qiche/258230.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部