GCC-AVR 编写中断服务函数的注意事项

发布者:东土大唐88最新更新时间:2017-11-24 来源: eefocus关键字:GCC-AVR  中断服务函数  注意事项 手机看文章 扫描二维码
随时随地手机看文章

//注意:本文使用的GCC-AVR版本为WinAVR20100110

中断不是C语言的一部分,中断的实现是由编译器实现的。所以,不同版本的编译器的中断的写法有很大的不同;即便同样是WinAVR,不同版本中的中断向量竟然都是略有区别的!


1.头文件
如果使用GCC-AVR的中断操作,必须包括头文件interrupt.h,即:


  1. #include   



进一步说明:WinAVR20100110版本已经不支持使用头文件signal.h了,为了向后兼容,如果执意引入signal.h,其实相当于也是引入的interrupt.h。打开signal.h文件,除了前面一大堆‘没用的’版权信息和说明,只有如下几行内容:


  1. #ifndef _AVR_SIGNAL_H_  

  2. #define _AVR_SIGNAL_H_  

  3. //这两句加上最后的#endif是条件定义,防止重复引用的  

  4. #warning "This header file is obsolete.  Use ."  

  5. //这一句【警告】指出,让我们使用interrupt.h  

  6. #include   

  7. //这一句告诉我们,即使你忘了或者不知道使用interrupt.h,那么也不会出错,引用signal.h相当于引如了interrupt.h。不过何必脱了裤子放屁——多此一举呢,直接引用interrupt.h就好了!  

  8. #endif   


2.中断函数格式
现在官方推荐的中断书写格式就有一种:


  1. ISR(INTERRUPT_vect)//INTERRUPT_vect是中断向量名称  

  2. {  

  3. //中断处理代码  

  4. }  


3.中断向量的名称
中断向量的名称在WinAVR的最近几个版本中有所变化,是微调。正是因为是微调,如果不注意,将会出现难以发现的错误。最好的办法就是打开查看X:\WinAVR-20100110\avr\include\avr路径下的你使用的处理器所对应的IO定义头文件。比如我使用的是ATmega16A,我就在此路径下找到了iom16a.h,打开它,找到
这两句话后面的,就是本型号单片机定义的所有中断。以下就是ATmega16A的中断,全部照抄如下:


  1. ============================开始====================================  

  2. #define INT0_vect_num  1  

  3. #define INT0_vect      _VECTOR(1)    

  4. #define INT1_vect_num  2  

  5. #define INT1_vect      _VECTOR(2)    

  6. #define TIMER2_COMP_vect_num  3  

  7. #define TIMER2_COMP_vect      _VECTOR(3)    

  8. #define TIMER2_OVF_vect_num  4  

  9. #define TIMER2_OVF_vect      _VECTOR(4)    

  10. #define TIMER1_CAPT_vect_num  5  

  11. #define TIMER1_CAPT_vect      _VECTOR(5)    

  12. #define TIMER1_COMPA_vect_num  6  

  13. #define TIMER1_COMPA_vect      _VECTOR(6)    

  14. #define TIMER1_COMPB_vect_num  7  

  15. #define TIMER1_COMPB_vect      _VECTOR(7)    

  16. #define TIMER1_OVF_vect_num  8  

  17. #define TIMER1_OVF_vect      _VECTOR(8)    

  18. #define TIMER0_OVF_vect_num  9  

  19. #define TIMER0_OVF_vect      _VECTOR(9)    

  20. #define SPISTC_vect_num  10  

  21. #define SPISTC_vect      _VECTOR(10)    

  22. #define USARTRXC_vect_num  11  

  23. #define USARTRXC_vect      _VECTOR(11)    

  24. #define USARTUDRE_vect_num  12  

  25. #define USARTUDRE_vect      _VECTOR(12)    

  26. #define USARTTXC_vect_num  13  

  27. #define USARTTXC_vect      _VECTOR(13)    

  28. #define ADC_vect_num  14  

  29. #define ADC_vect      _VECTOR(14)    

  30. #define EE_RDY_vect_num  15  

  31. #define EE_RDY_vect      _VECTOR(15)    

  32. #define ANA_COMP_vect_num  16  

  33. #define ANA_COMP_vect      _VECTOR(16)    

  34. #define TWI_vect_num  17  

  35. #define TWI_vect      _VECTOR(17)    

  36. #define INT2_vect_num  18  

  37. #define INT2_vect      _VECTOR(18)    

  38. #define TIMER0_COMP_vect_num  19  

  39. #define TIMER0_COMP_vect      _VECTOR(19)    

  40. #define SPM_RDY_vect_num  20  

  41. #define SPM_RDY_vect      _VECTOR(20)    

  42.   

  43. #define _VECTOR_SIZE 4  

  44. #define _VECTORS_SIZE (21 * _VECTOR_SIZE)  

  45. =========================结束==================================  


就以外部中断向量0为例吧。INT0_vect就是中断向量的名称或者写法了。加粗是我处理的,加粗的就是中断向量名称。
比如,写外部中断0的中断处理函数,就必须这么写:


  1. ISR(INT0_vect)  

  2. {  

  3. //处理代码  

  4. }  


再比如串口接收完成中断函数,就必须这么写:


  1. ISR(USARTRXC_vect)  

  2. {  

  3. //处理代码  

  4. }  


要注意,是USARTRXC_vect,而不是USART_RXC_vect!!!


4.中断函数的设计着力点
使用C语言编写的处理代码,主要考虑中断功能上的处理,而不需要考虑现场保护和恢复等问题。编译器会自动加入代码实现中断现场的保护,并在中断结束时自动恢复现场。但如果在中断服务程序中需要修改某些全局变量时,是否需要保护这些变量的初值将由编程员自己决定和实施。


5.C 语言编写ISR的原则
两个字:高效。
更具体的,体现为:
1.代码尽量简短,中断服务强调的是一个“快”字。(中断处理很“快”,是使用中断而不是查询的重要原因)
2.避免在中断内使用函数调用。虽然 GCC-AVR允许在中断里调用其它函数,但为了避免递归调用的问题,此函数必须为中断服务独家专用。如果非要调用,不妨把原本要写在其它函数内的代码直接写在中断服务程序中。
3.避免在中断内进行数学运算。数学运算将很有可能用到库函数和许多中间变量,就算不出现递归调用的问题,光在中断入口和出口处为了保护和恢复这些中间临时变量就需要大量的开销,严重影响中断服务的效率。


关键字:GCC-AVR  中断服务函数  注意事项 引用地址:GCC-AVR 编写中断服务函数的注意事项

上一篇:AVR的_USART
下一篇:AVR-GCC开发5种软件组合

推荐阅读最新更新时间:2024-03-16 15:46

变频器在高温下的注意事项
  1、认真监视并记录变频器人机界面上的各显示参数,发现异常应即时反映。   2、认真监视并记录变频室的环境温度,环境温度应在-5℃~40℃之间。移相变压器的温升不能超过130℃。   3、夏季温度较高时,应加强变频器安装场地的通风散热。确保周围空气中不含有过量的尘埃,酸、盐、腐蚀性及爆炸性气体。   4、夏季是多雨季节,应防止雨水进入变频器内部(例如雨水顺风道出风口进入)。   5、变频器柜门上的过滤网通常每周应清扫一次;如工作环境灰尘较多,清扫间隔还应根据实际情况缩短。   6、变频器正常运行中,一张标准厚度的A4纸应能牢固的吸附在柜门进风口过滤网上。   7、变频室必须保持干净整洁,应根据现场实际情况随时清扫。   8、变频室
[嵌入式]
如何用数字万用表测量二极管,二极管测量方法与注意事项
用数字万用表测量二极管的方式 用UT6OE测二极管时的联接方式,如下图: 图:用UT6OE测二极管的联接方式,用UT6OE测二极管的联接原理图  用数字万用表测量二极管时,具体精确测量的是二极管的正方向工作电压值,而指南针数字万用表则测的是二极管正反面向电阻器的值,应用过指南针数字万用表测二极管的阅读者,尽量留意这一差别。 一、数据万用表测量二极管的方式 1、将红直流电流表插进 HzVm 插口,黑直流电流表插进 COM 插口,红直流电流表旋光性为 黑直流电流表旋光性为 - 。 2、将作用测量范围电源开关放置15-2 精确测量档,再按SELECT键挑选迸大二极管检测作用,红直流电流表接被测二极管正级,黑直流电流表接被测
[测试测量]
如何用数字万用表测量二极管,二极管测量方法与<font color='red'>注意事项</font>
外测液位开关安装注意事项及仪表调试问题
外测液位开关工作原理: 外测液位开关的工作原理是通过仪表测量探头发射超声波,并检测其在容器壁中的余振信号,当液体漫过探头时,此余振信号的幅值会变小,这个改变被仪表检测到后输出一个开关信号。通过这种原理,可以监测储罐高低液位,并在高低液位测量点,输出开关信号,及时提醒仪表维护人员,停止进液和加液,有效防止泄漏等安全事故的发生。 外测液位开关的应用: ELL-SA外测液位开关是一种利用“变频超声波技术”实现的非接触式液位开关,主要用于监测储罐液面,实现储罐高低液位报警控制作用,随着测量技术的更新和迭代,外测液位开关也被广泛应用于管道存液(是否有液)的测量,外测液位开关从罐壁外测量,不接触罐内介质,属于一种从罐外检测液位的完全非
[测试测量]
外测液位开关安装<font color='red'>注意事项</font>及仪表调试问题
MSP430的C语言编写注意事项
============================================================================================================================== 微处理器一般用于特定环境和特定用途,出于成本、功耗和体积的考虑,一般都要求尽量节省使用资源,并且,由于微处理器硬件一般都不支持有符号数、浮点数的运算,且运算位有限,因此,分配变量时必须仔细。另外要说明的是,速度和存储器的消耗经常是2个不可兼顾的目标,在多数情况下,编程者必须根据实际情况作出权衡和取舍。 需要注意的事项如下: 1) 通常在满足运算需求的前提下,尽量选择为变量定义字节
[单片机]
集成稳压器的分类及使用注意事项
  集成稳压器按出线端子多少和使用情况大致可分为三端固定式、二端可调式、多端可调式及单片开关式等几种 。   多端可调式是早期集成稳压器产品,其输出功率小,引出端多,使用不太方便,但精度高,价格便宜。   二端固定式集成稳压器是将取样电阻、补偿电容、保护电路、大功率调整管等都集成在同一芯片上,使整个集 成电路块只有输人、输出和公共3个引出端,使用非常方便,因此获得广泛应用。它的缺点是输出电压固定,所以 必须生产各种输出电压、电流规格的系列产品,代表产晶是78XX和79XX。   三端可调式集成稳压器只需外接两只电阻即可获得各种输出电压。代表产品有LM317/LM337等。   开关式集成稳压电源是最近几年发展的一种稳压电源
[电源管理]
使用PWM输出方式驱动有刷直流电机 : 损耗和注意事项
使用PWM输出方式驱动有刷直流电机:损耗的思路 由于PWM驱动是脉冲驱动,因此其功耗仅是一个周期内电机的电压施加(导通)期间的功耗和电流再生(关断)期间的功耗的平均值。严格来讲,如下图所示,可以分电压施加期间(红色)、电流再生期间(蓝色)和转换期间(黄色)三种状态的功耗来考虑。通常,稳态期间的损耗为传导损耗,开/关转换期间的损耗为开关损耗。 ●施加电压期间的功耗 (a)图显示了施加电压时的开关(MOSFET)状态。由于电流流过两个MOSFET导通的路径,因此这里的损耗为导通的MOSFET的导通电阻之和×电流的平方。 ●电流再生期间的功耗 如上一篇文章中所述,有四种电流再生的方法,并且电流路径不同损耗也不同。 在(b)和(e
[嵌入式]
使用PWM输出方式驱动有刷直流电机 : 损耗和<font color='red'>注意事项</font>
1102示波器使用方法_示波器的测量技巧及使用注意事项
测量简单信号 下面用DS1000示波器来观测电路中的一个未知信号,迅速显示和测量信号的频率和峰峰值。 (1)迅速显示该未知信号 迅速显示该未知信号的方法如下: 1)将探头衰减系数设定为“10X”,并将探头上的开关设定为“10X”。 2)将通道1的探头连接到电路被测点。 3)按下AUTO按钮。 示波器将自动设置使波形显示达到最佳。在此基础上,用户可以进一步调节垂直、水平挡位,直至波形的显示符合你的要求。 (2)用示波器进行自动测量峰峰值 示波器可对大多数显示信号进行自动测量。下面用DS1000示波器来测量信号的峰峰值,具体操作方法如下: 1)先按下MEASURE按钮以显示自动测量菜单。 2)按
[测试测量]
1102示波器使用方法_示波器的测量技巧及使用<font color='red'>注意事项</font>
光源照明的设计原则及注意事项
照明的目的是增强对比度。设计 光源 照明的第一步是确定区域间的不同,然后用光源来突出这些不同之处。   1 光源照明设计的基本因素   主要有4个基本因素要重点考虑:   1.1 镜头的视场   在照明系统的设计中,应根据被测对象的尺寸确定镜头的视场。而后,再根据镜头视场的大小决定最佳的照明系统。   1.2 照明系统与工件的间距   在设计系统中,需全面的了解镜头到工作的距离,照明系统到工件的距离,从而确定光源与工件的距离。   1.3 工件的外形、条件和颜色   照明的选择是由工件表面的形状、平坦度、光滑程度等条件决定的。最佳的照明颜色(红、兰、绿、白)可通过检测工作或被检测区域的颜色来决定。   1.4 成像物
[电源管理]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved