c语言编写单片机中断,C语言AVR单片机中断程序写法
中断是CPU的一种核心功能,当CPU外部或内部发生指定事件时,就会触发中断,中断当前CPU正在执行的程序,保存当前状态,程序指针跳转中断服务程序的起始地址开始执行.执行完成后,跳回原程序位置恢复中断前的状态.
每个CPU都有一张中断向量表,可以通过CPU的datasheet手册查找。标准C中并没有规定中断函数的写法,所以中断的语法,是各个编译器自己定义的。
VCC编译器的语法规则如下:
#pragma interrupt_handler adc_isr:15
void adc_isr(void)
{
AdcVal = ADC&0x3FF;
ADMUX = (1
首先使用“#pragma interrupt_handler adc_isr:15”声明中断
其中“#pragma interrupt_handler”是固定的,表示声明后面紧跟的“adc_isr”函数是中断向量号为15的中断服务函数
然后余下的部分就是编写中断服务函数了。
GCC编译器的语法规则如下:
这里照抄一份网上流传的GCC编译器语法
1.头文件
如果使用GCC-AVR的中断操作,必须包括头文件interrupt.h,即 #include
进一步说明:WinAVR20100110版本已经不支持使用头文件signal.h了,为了向后兼容,如果执意引入signal.h,其实相当于也是引入的interrupt.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-20100110\avr\include\avr路径下的你使用的处理器所对应的IO定义头文件。比如我使用的是ATmega16A,我就在此路径下找到了iom16a.h,打开它,找到
这两句话后面的,就是本型号单片机定义的所有中断。以下就是ATmega16A的中断,全部照抄如下:
============================开始====================================
#define INT0_vect_num 1
#define INT0_vect _VECTOR(1) #define INT1_vect_num 2
#define INT1_vect _VECTOR(2) #define TIMER2_COMP_vect_num 3
#define TIMER2_COMP_vect _VECTOR(3) #define TIMER2_OVF_vect_num 4
#define TIMER2_OVF_vect _VECTOR(4) #define TIMER1_CAPT_vect_num 5
#define TIMER1_CAPT_vect _VECTOR(5) #define TIMER1_COMPA_vect_num 6
#define TIMER1_COMPA_vect _VECTOR(6) #define TIMER1_COMPB_vect_num 7
#define TIMER1_COMPB_vect _VECTOR(7) #define TIMER1_OVF_vect_num 8
#define TIMER1_OVF_vect _VECTOR(8) #define TIMER0_OVF_vect_num 9
#define TIMER0_OVF_vect _VECTOR(9) #define SPISTC_vect_num 10
#define SPISTC_vect _VECTOR(10) #define USARTRXC_vect_num 11
#define USARTRXC_vect _VECTOR(11) #define USARTUDRE_vect_num 12
#define USARTUDRE_vect _VECTOR(12) #define USARTTXC_vect_num 13
#define USARTTXC_vect _VECTOR(13) #define ADC_vect_num 14
#define ADC_vect _VECTOR(14) #define EE_RDY_vect_num 15
#define EE_RDY_vect _VECTOR(15) #define ANA_COMP_vect_num 16
#define ANA_COMP_vect _VECTOR(16) #define TWI_vect_num 17
#define TWI_vect _VECTOR(17) #define INT2_vect_num 18
#define INT2_vect _VECTOR(18) #define TIMER0_COMP_vect_num 19
#define TIMER0_COMP_vect _VECTOR(19) #define SPM_RDY_vect_num 20
#define SPM_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.避免在中断内进行数学运算。数学运算将很有可能用到库函数和许多中间变量,就算不出现递归调用的问题,光在中断入口和出口处为了保护和恢复这些中间临时变量就需要大量的开销,严重影响中断服务的效率。
c语言编写单片机中断,C语言AVR单片机中断程序写法相关推荐
- c语言计算二次函数顶点坐标,C语言编写一个求一元二次方程的实根的程序。 编辑一个小程序去做一元二次方程的求解(b^24ac)...
导航:网站首页 > C语言编写一个求一元二次方程的实根的程序. 编辑一个小程序去做一元二次方程的求解(b^2>4ac) C语言编写一个求一元二次方程的实根的程序. 编辑一个小程序去做一元二 ...
- python新年有趣代码_搞几款由“Python”语言编写的“有趣、恶搞、好玩”的程序代码!...
下载好向圈APP可以快速联系圈友 您需要 登录 才可以下载或查看,没有帐号?立即注册 x 为提高大家对"Python"编程语言的学习兴趣,今天给大家分享几款有趣的Python程序代 ...
- c语言编写闹钟主程序流程图,基于STC15W4K58S4单片机的电子万年历设计源码与报告(数码管显示)...
基于STC15W4K58S4单片机的电子万年历(数码管显示)该压缩包包含源码TXT文件 源工程文件(Keil uVision4文件)和课程设计报告 电子时钟的设计 -单片机综合设计报告 目录 1 任 ...
- atmega16单片机c语言程序设计经典实例pdf,《AVR单片机C语言程序设计实例精粹》.pdf...
AutodeskAsiaPteLtd主编的<AutodeskRevitStructure2012应用宝典>是对AutodeskRevitStructure2012进行全面介绍的权威用书.全 ...
- 用C语言编写万年历6,C语言编写万年历
<C语言编写万年历>由会员分享,可在线阅读,更多相关<C语言编写万年历(8页珍藏版)>请在人人文库网上搜索. 1.C语言编写万年历 [要求]:1 程序运行后,首先在屏幕上显示主 ...
- c语言编写系统服务程序,C语言Windows服务程序编写-ServiceMain
C语言编写的Windows服务程序,可以类比Linux/Unix环境下的daemon进程. 一下是VS2010环境下的demo: // windows_service.cpp : 定义控制台应用程序的 ...
- c语言编写计算机软件,基于C语言的计算机软件编程分析.doc
基于C语言的计算机软件编程分析.doc 基于C语言的计算机软件编程分析 摘要:C语言是一种重要的编程语言,在当今IT业的运用十分广泛.使用C语言来编写的程序简单.直接.准确,极大地推动了计算机软件的更 ...
- 用c语言编写字母循环,C语言输入循环字母
广告 提供50多种云计算产品,包括云服务器和云. 创建一站式云产品试用服务,以帮助开发人员和企业以零门槛进入云环境. 是否有一种简单的方法来调用c脚本,以查看用户是否输入了英文字母中的字母?我在想这样 ...
- c语言编写五子棋报告,c语言报告五子棋.pdf
C 语言课程设计报告 c 题目: 简单的 五子棋 设计者: 方阳 专业班级: 软件工程1303班 学号: 311309060324 指导老师: 刘洁 所属系部: 计算机学院 2014年6月25 日 河 ...
- 用c语言编写实心菱形,C语言编写内置菱形的程序
C语言编写内置菱形的程序 最近迷上了用C语言编写图形的输出程序,有矩形的.三角形.等腰三角形,平行四边形.菱形.沙漏形.今天尝试着将菱形内置到矩形中,结果成功了,下面将快乐分享给大家,也希望广大C程序 ...
最新文章
- Eclipse 安装 lombok
- 三星s轻奢android+p,三星Galaxy S轻奢版5月21日将至:骁龙660处理器+安卓8.0
- Kotlin实战指南十五:协程泄漏
- 【算法】二分图的判定
- javascript乘法和加法_js 大整数加法、乘法、除法
- Exception in thread main java.lang.UnsupportedClassVersionError的另类解决办法
- [转] Asp.net Session常见问题集锦
- mysql 三表inner join_MySql的join(连接)查询 (三表 left join 写法)
- C++ container member map
- C# LINQ查询方法及Select()查询方法应用
- 管理感悟:减少代码量的好办法
- Atitit 理财之道 信用卡账单管理之道 attilax总结 1. 信用卡账单管理 信用卡账单信息的目的,解决一下问题	2 1.1. 账单记录明细可追溯,原则上保留五十年 可按照时间 银行 卡
- 20120902 07
- flask爱家租房项目开发(十二)
- 微信公众号回复服务器参数错误,为什么微信文章网址在浏览器访问提示参数错误...
- 从本地管理员到域管理员提权
- 智商黑洞(门萨Mensa测试)10
- python boxplot 画盒须图
- 根据IP获取城市代码
- You may need to configure your browser or application to trust the Charles Root Certificate. See SSL