当前位置:首页 > 单片机 > 单片机
[导读]//注意:本文使用的GCC-AVR版本为WinAVR20100110中断不是C语言的一部分,中断的实现是由编译器实现的。所以,不同版本的编译器的中断的写法有很大的不同;即便同样是WinAVR,不同版本中的中断向量竟然都是略有区别的

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

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


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


#include



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


#ifndef_AVR_SIGNAL_H_

#define_AVR_SIGNAL_H_

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

#warning"Thisheaderfileisobsolete.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_num1

#defineINT0_vect_VECTOR(1)

#defineINT1_vect_num2

#defineINT1_vect_VECTOR(2)

#defineTIMER2_COMP_vect_num3

#defineTIMER2_COMP_vect_VECTOR(3)

#defineTIMER2_OVF_vect_num4

#defineTIMER2_OVF_vect_VECTOR(4)

#defineTIMER1_CAPT_vect_num5

#defineTIMER1_CAPT_vect_VECTOR(5)

#defineTIMER1_COMPA_vect_num6

#defineTIMER1_COMPA_vect_VECTOR(6)

#defineTIMER1_COMPB_vect_num7

#defineTIMER1_COMPB_vect_VECTOR(7)

#defineTIMER1_OVF_vect_num8

#defineTIMER1_OVF_vect_VECTOR(8)

#defineTIMER0_OVF_vect_num9

#defineTIMER0_OVF_vect_VECTOR(9)

#defineSPISTC_vect_num10

#defineSPISTC_vect_VECTOR(10)

#defineUSARTRXC_vect_num11

#defineUSARTRXC_vect_VECTOR(11)

#defineUSARTUDRE_vect_num12

#defineUSARTUDRE_vect_VECTOR(12)

#defineUSARTTXC_vect_num13

#defineUSARTTXC_vect_VECTOR(13)

#defineADC_vect_num14

#defineADC_vect_VECTOR(14)

#defineEE_RDY_vect_num15

#defineEE_RDY_vect_VECTOR(15)

#defineANA_COMP_vect_num16

#defineANA_COMP_vect_VECTOR(16)

#defineTWI_vect_num17

#defineTWI_vect_VECTOR(17)

#defineINT2_vect_num18

#defineINT2_vect_VECTOR(18)

#defineTIMER0_COMP_vect_num19

#defineTIMER0_COMP_vect_VECTOR(19)

#defineSPM_RDY_vect_num20

#defineSPM_RDY_vect_VECTOR(20)

#define_VECTOR_SIZE4

#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.避免在中断内进行数学运算。数学运算将很有可能用到库函数和许多中间变量,就算不出现递归调用的问题,光在中断入口和出口处为了保护和恢复这些中间临时变量就需要大量的开销,严重影响中断服务的效率。


本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

摘要:介绍了电缆托架的定义、材质及结构参数,明确了托架应用场合及型式。结合海洋石油环境特点和平台总体布置方案,总结了托架规划的注意事项。在规划方案的基础上,细化了托架设计需参考的相关文件和图纸,详细介绍了托架主通路和分支...

关键字: 型式选择 注意事项 设计思路

摘要:从勘测工作、架线施工、杆塔施工方面,介绍了提高110kV输配电线路施工质量的措施,提出了在施工过程中需要注意的事项,以保障施工人员的人身安全及输配电线路的稳定运行。

关键字: 110kV输配电线路 施工质量 注意事项

摘要:油棕榈树主要种植在马来西亚、印度尼西亚和非洲,并通常在种植园内建立相应的油棕榈厂。随着马来西亚政府对粉尘排放要求的提高,原锅炉尾部配置的多管式旋风除尘器已经不能满足排放要求。据此介绍了油棕榈厂的燃料、飞灰特性和可供...

关键字: 飞灰 电除尘器 注意事项

为增进大家对滤波器的认识,本文将对滤波器的主要分类,以及滤波器的使用注意事项予以介绍。

关键字: 滤波器 指数 注意事项

常看见初学者要求使用_at_,这是一种谬误,把C当作ASM看待了。在C中变量的定位是编译器的事情,初学者只要定义变量和变量的作 用域,编译器就把一个固定地址给这个变量。

关键字: C51 单片机 误区 注意事项

在设计PCB布局图时,必须“ (1) 防止负阻减少”、“ (2) 防止EMI问题”。

关键字: 晶体谐振器 注意事项 PCB

扫频仪将是下述内容的主要介绍对象,通过这篇文章,小编希望大家可以对扫频仪的相关情况以及信息有所认识和了解。

关键字: 扫频仪 主要参数 注意事项

什么是UPS电源?它有什么作用?规范的UPS未加外接电池前,在它的输出功率与负载耗电功率彻底匹配(即全负载)的状况下,一般从市电接连时算起可供电约6-十分钟(详细数值每个类型的UPS阐明书上都有记载)。假定以负载耗电功率...

关键字: 电源 ups 注意事项

如今的USB Type-C线缆允许消费者在功率高达100W的情况下为电池供电的便携式产品充电。

关键字: 热保护 注意事项 USB

你知道LED屏采购的注意事项吗?LED(Light-Emitting-Diode中文意思为发光二极管)是一种能够将电能转化为光能的半导体,它改变了白炽灯钨丝发光与节能灯三基色粉发光的原理,而采用电场发光。据分析,LED的...

关键字: led屏 注意事项 采购
关闭
关闭