INT中断服务程序
- 格式:pdf
- 大小:117.43 KB
- 文档页数:21
第一讲:第六章I/O接口原理-接口、端口、编址回顾:微机系统的层次结构,CPU、主机、接口电路及外部设备之间的结构关联,输入/输出的一般概念。
重点和纲要:微机系统主机与外部设备之间的数据传送,包括I/O端口的寻址方式,输入/输出的传送控制方式。
讲授内容:6. 1 输入/输出数据的传输控制方式一、输入/输出的一般概念1.引言输入/输出是微机系统与外部设备进行信息交换的过程。
输入/输出设备称为外部设备,与存储器相比,外部设备有其本身的特点,存储器较为标准,而外部设备则比较复杂,性能的离散性比较大,不同的外部设备,其结构方式不同,有机械式、电动式、电子式等;输入/输出的信号类型也不相同,有数字信号,也有模拟信号;有电信号,也有非电信号;输入/输出信息的速率也相差很大。
因此,CPU与外部设备之间的信息交换技术比较复杂。
CPU与外设之间的信息交换,是通过它们之间接口电路中的I/O端口来进行的,由于同一个外部设备与CPU之间所要传送的信息类型不同,方向不同,作用也不一样(例如数据信息、状态信息、控制信息、输入/输出等),所以接口电路中可以设置多个端口来分别处理这些不同的信息。
2.输入/输出端口的寻址方式微机系统采用总线结构形式,即通过一组总线来连接组成系统的各个功能部件(包括CPU、内存、I/O端口),CPU、内存、I/O端口之间的信息交换都是通过总线来进行的,如何区分不同的内存单元和I/O端口,是输入/输出寻址方式所要讨论解决的问题。
根据微机系统的不同,输入/输出的寻址方式通常有两种形式:(1).存储器对应的输入、输出寻址方式这种方式又称为存储器统一编址寻址方式或存储器映象寻址方式。
方法:把外设的一个端口与存储器的一个单元作同等对待,每一个I/O端口都有一个确定的端口地址,CPU与I/O端口之间的信息交换,与存储单元的读写过程一样,内存单元与I/O端口的不同,只在于它们具有不同的的地址。
中断和中断处理程序1. 中断Linux内核要对连接到计算机上的所有硬件设备进⾏管理,⾸先要能和它们互相通信。
从所周知,处理器的速度跟外围硬件设备的速度往往不在⼀个数量级上。
所以,需要⼀种机制,如果轮询(polling)是⼀种解决办法,可以让内核定期对设备的状态进⾏查询,然后做出相应的处理,但这让内核做了不少⽆⽤功。
更好的办法是由我们来提供⼀种机制,让硬件在需要的时候再向内核发出信号。
这就是中断机制。
中断本质上是⼀种特殊的电信号,由硬件设备⽣成,并直接送⼊中断控制器的输⼊引脚上,再由中断控制器向处理器发送相应的信号,处理器⼀经检测到此信号,便中断⾃⼰当前⼯作转⽽处理中断,最后由OS来负责处理新到来的数据。
中断是异步的。
什么是中断?简单地说就是CPU在忙着作⾃⼰的事情,这时候硬件(⽐如说键盘按了⼀下)触发了⼀个电信号,这个信号通过中断线到达中断控制器i8259A,i8259A接受到这个信号后,向CPU发送INT信号申请CPU来执⾏刚才的硬件操作,并且将中断类型号也发给CPU,此时CPU保存当前正在做的事情(REST指令把程序计数器PC中的下⼀条待执⾏的指令的内存地址保存到栈)的情景现场,然后去处理这个申请,根据中断类型号找到它的中断向量(即中断程序在内存中的地址),然后去执⾏这段程序(这段程序已经写好,在内存中),执⾏完后再向i8259A发送⼀个INTA信号表⽰其已经处理完刚才的申请。
此时CPU就可以继续做它刚才被打断做的事情了,将刚才保存的情景现场恢复出来,CPU继续执⾏接下来下⾯的程序。
不同的设备对应的中断不同,⽽每个中断都通过⼀个唯⼀的数字标识。
这些中断值通常被称为中断请求(IRQ)线。
⽐如,IRQ0是时钟中断,⽽IRQ1是键盘中断。
并不是所有的中断号都这样严格定义,像PCI总线上的设备,中断就是动态分配的。
1.1. 异常与中断异常与中断不同,它在产⽣时必须考虑与处理器时钟同步。
实际上,异常也称为同步中断。
关于中断的详细阐述,包括如何写中断服务程序关于中断⼀个完整的中断过程由中断请求、中断判优及屏蔽、中断响应、中断处理及中断返回五个部分组成。
在8086/8088微机系统中,中断源的优先权由⾼到低的顺序依次为:除零数、INT n、INT o、NMI(⾮屏蔽中断)、INTR、单步执⾏中断.8259A芯⽚的外部特征:(1)⽚选取信号(CS)(2)写信号(WR)(3)读信号(RD)(4)D0~D7:8条数据总线(5)GND:地信号(6)Vcc:+5V电源(7)INT:中断请求信号(8)中断响应信号(9)IR0~IR7:8个中断请求输⼊信号(10)A0:地址选择信号(11)SP/EN:从⽚编程/允许缓冲器信号(12)CAS0~CAS2:这三条信号是8259A级连时构成8259A的主从式级连结构当CPU完成对8259A的初始化操作后,8259A即进⼊操作状态,通过INT端⼝向CPU提出中断申请,8259A从数据总线D7~D0输出当前服务对象的中断类型号N,CPU截获该中断向量并响应该中断,完成⼀次中断操作。
在IBM PC及其兼容机中,通过CPU的NMI(⾮屏蔽中断)和两个8259A可编程中断控制器芯⽚为系统提供了16级中断,硬件中断结构如图1所⽰1,两⽚8259A构成主从式级联控制结构,与CPU相连的称为主⽚,下⼀层的称为从⽚,从⽚中断请求信号INT与主⽚的IRQ2相连。
IBM PC机中保留给⽤户可随意编程的中断号有IRQ10、IRQ11、IRQ12和IRQ15,这些中断信号都在8259A从⽚上。
IBM PC机中由8259A管理的16级中断均有规定的中断向量存储地址,主⽚中IRQ0-IRQ7分别对应08H-0FH,从⽚中IRQ8-IRQ15分别对应70H-77H(如串⼝1 对应为0CH(12),⽤oldvect=getvect(0x0B)保存原来的中断向量)。
主⽚的中断控制寄存器ICR和中断屏蔽寄存器IMR的⼝地址分别为20H和21H,从⽚的相应寄存器⼝地址分别为A0H和A1H。
8086中断举例一、8086中有个中断向量表,其中有256个中断,每个中断占4个字节,总共1K大小。
二、中断程序的编写主要就是将程序的偏移地址和段地址装载到向量表中。
装载的方法有两种。
方法1:直接装入法。
xorax,ax ; 将AX置零movds,ax;将段初始化为0段,不一定要使用ds段寄存器movax,offset int60 ; 取得中断服务程序的入口地址的偏移量mov ds:[0180h],ax ; 将偏移地址装入中断向量表,60H*4=0180Hmovax,seg int60 ; 取得中断服务程序的入口地址的段地址mov ds:[0180h+2],ax ; 将段地址装入中断向量表8086下的中断服务子程序例程:data segmentinfo db "This is an Interruption service program!",0ah,0dh,'$'data endsSTACK SEGMENT stackSTA DB 50 DUP(?)TOP EQU LENGTH STASTACK ENDScode segmentassumecs:code,ds:data,SS:STACKstart:movax,datamovds,axMOV AX,STACKMOV SS,AXMOV SP,TOPpush ds; ======== 装载中断服务程序的入口地址到中断向量表中========== xorax,axmovds,axmovax,offset printmov ds:[0198h],axmovax,seg printmov ds:[0198h+2],axpop dsint 66h ; 触发中断(软件中断的方式)中断向量号:66H mov ah,4ch ; 返回DOSint 21h; ============= 中断服务程序============ printproc farmovdx,offset info ; 显示一段文字信息mov ah,09hint 21hiret ; 中断返回print endpcode endsend start调试过程需要观察的几个关键点:(1)ISP入口地址装载进中断向量表后的状态(2)在即将触发中断时,CS,IP的变化(3)在中断返回执行IRET时,CS,IP的变化(理解恢复现场)(4)注意堆栈的变化,SP和SS方法2 :push ds; ======== 装载中断服务程序的入口地址到中断向量表中========== mov dx,seg print ; ds:dx(CS:IP)mov ds,dxmov dx,offset printmov al,66h ;中断类型号mov ah,25hint 21h ;装中断向量表pop ds中断向量服务程序入口地址服务程序入口地址中断向量。
中断例程的说明
中断例程:INT_LED
利用中断按键INTKEY(接INT5)
当按键动作,在中断服务程序中依次点亮LED灯,并在LCD提示。
键盘中断:
首先是对中断中用到一个结构体的设置, 结构体中各成员变量的意义见结构体的定义, 这一步是在函数ISR_Init()中完成的, 这个函数在ISR.C中, 主要是对中断中用到的寄存器进行初始化, 这些寄存器包括: INTMOD, INTMSK, INTSUBMSK, SRCPND, INTPND。
其次是在主函数中完成对键盘中断服务函数和中断偏移量(INTOFFSET)的关联. 这是在函数Key_init()中完成的, 此函数在KeyBoard.c中. 中断服务函数和中断偏移量(INTOFFSET)的关联是通过函数SetISR_Interrupt(IRQ_EINT5, Key_ISR_5, NULL)来完成的
有了这一步的关联以后当查询到中断偏移量是IRQ_EINT5时就会根据此偏移量调用键盘中断服务函数Key_ISR_5.
有了上面两步的初始化工作以后, 当有键盘按下时就会发生IRQ中断,
过程是先跳转到startup.s中的b IRQ_Handler处, 然后保存寄存器r0-r12, lr跳转到函数ISR_IrqHandler中, 在这个函数中查询中断向量的偏移量, 根据这个偏移量调用相应的中断服务函数.
执行完中断服务函数后再跳转回startup.s中的DMFD sp!, {r0-r12, lr}处,恢复执行中断服务函数之前的状态, 继续执行发生中断服务前的下一条指令.
至此中断过程结束, 在中断服务函数中依次点亮LED灯,并在LCD提示。
.。
INT 10H 是由BIOS 对屏幕及显示器所提供的服务程序,而后倚天公司针对倚天中文提供了许多服务程序,这些服务程序也加挂在INT 10H 内。
使用INT 10H 中断服务程序时,先指定AH 寄存器为下表编号其中之一,该编号表示欲调用的功用,而其他寄存器的详细说明,参考表后文字,当一切设定好之后再调用INT 10H。
底下是它们的说明:13 显示字符串ES:BP = 串地址CX = 串长度DH, DL = 起始行列BH = 页号AL = 0,BL = 属性串:Char,char,……,charAL = 1,BL = 属性串:Char,char,……,charAL = 2串:Char,attr,……,char,attrAL = 3串:Char,attr,……,char,attr光标返回起始位置光标跟随移动光标返回起始位置光标跟随串移动AH=00HAH=00/INT 10H 是用来设定显示模式的服务程序,AL 寄存器表示欲设定的模式:AH=01H您可以把光标想成一个小的矩形,平时这个矩形扁平位于某字底部,但藉由此功能可以改变其大小与位置。
光标起始处与终止处分别由CL 与CH 的0 到4 位表示,参考下图:而CH 的第7 位必须是0,第5、6 位表示光标属性:位 6 位 5 属性0 0 正常0 1 隐形1 01 1 闪烁缓慢AH=02H此功能是设定光标位置,位置用DH、DL 表示,DH 表示列号,DL 表示行号。
由左至右称之为『列』,屏幕最上面一列为第零列,紧靠第零列的下一列称为第一列……;由上而下称之为『行』,屏幕最左边一行称之为第零行,紧靠第零行右边的一行为第一行。
故最左边,最上面的位置为DH=0 且DL=0;最左边第二列,DH=1,DL=0。
如果是文字模式时,BH 为欲改变光标位置的显示页,如果是图形模式,BH 要设为0。
以行列来说明DH、DL 之意义,小木偶常常搞混,底下以座标方式解释。
在文字模式下,字符的位置类似数学直角座标系的座标,但是Y 轴方向相反,Y 轴是以屏幕最上面为零,越下面越大,直到24 为止,存于DH 内。
stc8系列单片机前5个中断源的中断子函数框架中断是单片机中一种重要的事件处理机制,能够在系统发生某个指定的事件时,立即打断当前的程序执行,转而执行中断服务程序。
STC8系列单片机提供了多种中断源,本文将介绍其中前5个中断源的中断子函数框架。
一、外部中断0外部中断0是通过INT0引脚触发的中断源。
当INT0引脚的电平发生变化时,可触发外部中断0。
以下是外部中断0的中断子函数框架:```Cvoid INT0_ISR() interrupt 0{// 中断服务程序的代码// ...}```二、外部中断1外部中断1是通过INT1引脚触发的中断源。
当INT1引脚的电平发生变化时,可触发外部中断1。
以下是外部中断1的中断子函数框架:```Cvoid INT1_ISR() interrupt 2{// 中断服务程序的代码// ...}```三、定时器0中断定时器0中断是使用定时器0作为中断源。
定时器0可以设定一个计时周期,当计时器溢出时,会触发定时器0中断。
以下是定时器0中断的中断子函数框架:```Cvoid TIMER0_ISR() interrupt 1{// 中断服务程序的代码// ...}```四、定时器1中断定时器1中断是使用定时器1作为中断源。
定时器1可以设定一个计时周期,当计时器溢出时,会触发定时器1中断。
以下是定时器1中断的中断子函数框架:```Cvoid TIMER1_ISR() interrupt 3{// 中断服务程序的代码// ...}```五、串口中断串口中断是通过串口通信接收和发送数据时触发的中断源。
当接收到数据或发送完成时,可触发串口中断。
以下是串口中断的中断子函数框架:```Cvoid UART_ISR() interrupt 4{// 判断中断类型if (RI){// 接收中断// 中断服务程序的代码// ...}else if (TI){// 发送中断// 中断服务程序的代码// ...}}```总结:以上是STC8系列单片机前5个中断源的中断子函数框架。
第四章中断类例4-1 P104假设外部中断0和外部中断1均为下降沿触发,当外部中断0发生时,P0端口的电平反向,当外部中断1发生时,P1端口的电平反向。
#include<reg51.h>void IS0(void) interrupt 0{ P0=~P0;} //P0端口反向void IS1(void) interrupt 2{ P1=~P1;} //P1端口反向void main( ){ P0=0x00; P1=0xFF;IT0=1; IT1=1;EX0=1; EX1=1; EA=1;while(1);}【例4-9】外部中断示例在本实例中,首先通过P1.7口点亮发光二极管D1,然后外部输入一脉冲串,则发光二极管D1亮、暗交替。
#include<reg51.h>sbit P1_7=P1^7;void interrupt0( ) interrupt 0 using 2 //外部中断0{ P1_7=!P1_7;}void main( ){ EA=1; //开中断IT0=1; //外部中断0脉冲触发EX0=1; //外部中断0P1_7=0;do{ }while(1);}如果有3个脉冲,则灯亮、暗交替一次,可如下面编程:#include<reg51.h>Sbit P17=P1^7;unsigned char i=3;void main( ){ EA=1; IT0=1; EX0=1;P17=0;do{ }while(1); }void interrupt0( ) interrupt 0{ i=i-1;if(i==0){ P17=!P17; i=3;}}【例4-10】如图4-18所示,8只LED阴极接至单片机P0口,两开关S0、S1分别接至单片机引脚P3.2()和P3.3()。
编写程序控制LED状态。
按下S0后,点亮8只LED;按下S1后,变为闪烁状态。
#include<reg51.h>sbit P32=P3^2;void delay(unsigned int d) //定义延时子函数{ while(--d>0);}void main( ){ P0=0xFF; //熄灭LEDIT0=1; IT1=1; //外中断0、1脉冲触发方式EA=1; EX0=1; EX1=1; //开中断for( ; ; ) //延时等待中断发生{;}}void INT0_ISR( ) interrupt 0//外中断0中断服务函数{ P0=0x00;}void INT1_ISR( ) interrupt 2//外中断1中断服务函数{ while(P32!=0) //如果有外部中断0,则退出{ delay(5000);P0=0x00;delay(5000);P0=0xFF;}}定时类【例4-16】设单片机的fosc=12MHz,要求在P1.0上产生周期为2ms的方波。
1.函数波形发生器流程图主程序流程T0中断服务程序流程2. 255秒定时器流程主程序流程图INT0中断服务程序流程T1中断服务程序流程T0中断服务程序流程3. 比例电压变换器流程主程序流程图4. 模拟电压显示器流程主程序流程图注:P1口和P3.0-P3.3接12个LED 灯,其中P3.3接最高位灯L12,P1.0接最低位灯L0。
5. 脉冲计数器流程主程序流程图T1中断服务程序流程图T0中断服务程序流程图6. 水塔水位控制器流程主程序流程图T0中断服务程序流程图T1中断服务程序流程图7. 占空比可调的方波发生器流程主程序流程图T0中断服务程序流程图注:T0的中断服务程序编制过程中必须注意使程序所有流程的执行时间小于100μS 。
否则,输出波形的频率不符合题目的要求8. 双机通过串行接口互传数据流程主程序流程图T0中断服务程序流程图串口中断服务程序流程图9. 花样流水灯流程主程序流程图T0中断服务程序流程图注:在主程序中由于仅使用了8bit运算,故实际A/D采样值为255时,得到的延时时间间隔为1280mS。
若要完全符合题意,则需要使用16bit的算术运算才能满足要求。
10. 模拟电压比较器流程主程序流程图T0中断服务程序流程图T1中断服务程序流程图11. 利用PWM 信号实现直流小电机的调速流程主程序流程图注:在程序的编制过程中,必须仔细调整延时37微秒的延时子程序的延时时间,使输出波形的频率满足题目要求。
12. 调频信号发生器流程主程序流程图T0中断服务程序流程图注:该程序编制过程中须注意,T0中断服务程序与主程序均使用0区的工作寄存器。
另外,T0的中断服务程序中最长流程的执行时间必须小于50微秒13. 频率计主程序流程图T1中断服务程序流程图动态显示子程序流程图主程序流程图14. 电子钟T0中断服务程序流程图INT0中断服务程序流程图动态显示子程序流程图15. 数字电压表主程序流程图T0中断服务程序流程图动态显示子程序流程图16. 数字跑表主程序流程图INT0中断服务程序流程图T0中断服务程序流程图动态显示子程序流程图17. 步进电机驱动器主程序流程图INT0中断服务程序流程T0中断服务程序流程。
第1篇一、实验目的1. 理解中断系统的基本概念和工作原理。
2. 掌握中断源、中断向量、中断服务程序等基本概念。
3. 学习使用Keil软件进行中断程序的编写和调试。
4. 熟悉中断在微机系统中的应用。
二、实验原理中断系统是微机系统中重要的组成部分,它允许CPU在执行程序的过程中,响应外部事件或内部事件,从而实现多任务处理。
中断系统主要包括以下几个部分:1. 中断源:产生中断请求的设备或事件,如外部设备、定时器、软件中断等。
2. 中断向量:中断服务程序的入口地址,用于CPU在响应中断时找到相应的服务程序。
3. 中断服务程序:处理中断请求的程序,完成中断处理任务。
4. 中断优先级:不同中断源的优先级不同,用于确定中断响应的顺序。
三、实验设备与软件1. 实验设备:单片机实验板、计算机、Keil软件、Proteus仿真软件。
2. 实验软件:Keil uVision4、Proteus 8.0。
四、实验内容1. 外部中断实验(1)使用外部中断0(INT0)实现按键控制LED灯的亮灭。
(2)使用外部中断1(INT1)实现按键控制LED灯的闪烁。
2. 定时器中断实验(1)使用定时器0产生1秒的定时中断,实现LED灯的闪烁。
(2)使用定时器1产生1秒的定时中断,实现按键输入的计数。
3. 软件中断实验(1)使用软件中断实现按键输入的字符显示。
(2)使用软件中断实现按键输入的字符加密显示。
五、实验步骤1. 在Keil软件中创建一个新项目,选择合适的单片机型号。
2. 根据实验要求,编写中断服务程序,设置中断向量。
3. 在Proteus软件中搭建实验电路,包括单片机、按键、LED灯等。
4. 将Keil软件编译后的程序下载到单片机中。
5. 在Proteus软件中运行仿真,观察实验结果。
六、实验结果与分析1. 外部中断实验(1)按键按下时,LED灯亮;按键松开时,LED灯灭。
(2)按键按下时,LED灯闪烁;按键松开时,LED灯停止闪烁。
vxworks中断服务程序中断服务程序用来处理来自硬件的中断,是设备驱动程序的重要组成部分。
为及时响应外部中断,防止中断丢失.中断服务程序应该尽量的小,只把最必要的任务放在中断服务程序里面执行。
一般在系统启动,硬件设备成功初始化之后将ISR与中断向量挂上:也可以在系统启动后的任何时刻挂中断向量。
调试中经常采用后一种方式。
在VxWorks中有两个不同的函数可提供挂中断:intCon nect和pciIntConnect。
两者的区别是intConnect使用的中断向量是独占的,pc ilntConnect则可在各个不同的ISR之间共享中断向量。
实际上pcilntConnect内部调用了intConnect函数,在内部使用一个链表来管理多个不同的ISR。
pcil ntConnect要求每次进入ISR都要检查硬件的寄存器,证实中断的确是由ISR服务的硬件产生。
如果硬件的寄存器表明该硬件并未产生中断,则ISR立即退出,以让挂在同一个中断向量上的其它ISR有机会检查是否有中断产生。
pcilnt Lib.c中的代码清楚的说明了这个问题:void pciInt (int irq ){ PCLlNT RTN *pRtn;for(pRm=(PCI_INT_RTN*)DLL_FIRST(&pcilntList[irq]);pRtn!=NULL;pRtn=(PCI_INT_RTN*)DLL_NEXT(&pRtn->node)) (*pRtn->routine)(pRtn->parameter);}当PCI总线上有中断发生时,系统调用void pcilnt(int irq)函数,再由pciI nt使用内部的链表来依次调用挂在该中断上的ISR。
如果某个ISR不能正常退出,就会影响到其它ISR的运行。
在调试时为了检查中断向量是否已经和ISR 可靠的连接上,可以在命令行上或程序中直接调用pciInt来查看ISR是否被触发。
单片机跳转语句单片机跳转语句是在单片机程序中用来控制程序执行流程的重要语句。
下面将列举一些常用的单片机跳转语句,并对其功能进行简要介绍,以便读者更好地理解和应用。
1. 无条件跳转语句(jmp):该语句用于无条件地跳转到指定的地址,使程序执行从该地址开始。
可以用于实现程序的循环、分支等功能。
2. 条件跳转语句(jxx):该语句根据条件是否满足来决定是否跳转到指定的地址。
常用的条件包括相等、不相等、大于、小于等。
3. 跳转到子程序(call):该语句用于跳转到指定的子程序地址,并将当前程序的返回地址保存在栈中。
在子程序执行完毕后,使用返回指令(ret)可以跳转回调用该子程序的地址。
4. 跳转到中断服务程序(int):该语句用于触发中断,并跳转到中断服务程序的入口地址。
中断服务程序用于处理外部中断或异常情况。
5. 退出程序(exit):该语句用于结束当前程序的执行,并返回操作系统或上一级程序。
可以用于程序执行完毕后的清理工作或错误处理。
6. 跳转到指定的标签(goto):该语句用于直接跳转到程序中的指定标签处。
标签通常用来标记程序中的特定位置,以方便跳转和调试。
7. 跳转到循环开头(continue):该语句用于跳过循环体中余下的语句,直接进入下一次循环的执行。
常用于循环中的条件判断失败时,跳过当前循环体的执行。
8. 跳转到循环结束(break):该语句用于跳出当前循环,结束循环的执行。
通常与循环条件结合使用,用于在满足特定条件时提前结束循环。
9. 跳转到异常处理(exception):该语句用于在程序执行过程中发生异常时跳转到异常处理程序。
异常处理程序通常用于处理非预期的错误情况,如除零错误、越界访问等。
10. 跳转到错误处理(error):该语句用于在程序执行过程中发生错误时跳转到错误处理程序。
错误处理程序通常用于处理预期的错误情况,如输入错误、文件读写错误等。
通过以上列举的单片机跳转语句,可以实现程序的流程控制、条件判断、循环、子程序调用等功能。
单片机中断程序设计中断是单片机控制器(MCU)中重要的功能之一,它是单片机与外部硬件设备通信处理的一种方式。
在中断的处理中,当发生某一事件时,单片机立即停止正在运行的程序,然后调用该事件对应的中断服务程序。
当该中断服务程序执行完毕后,重新回到原来被中断的程序中继续运行。
在单片机的中断程序设计中,中断向量表是一个重要的概念,在这篇文章中我们将介绍单片机中断程序设计的基本流程和一些注意事项。
一、中断服务程序的编写在单片机中断程序设计中,中断服务程序通常在程序中单独定义。
中断服务程序的名称是由中断号决定的,例如INT0中断对应的中断服务程序的名称为INT0_ISR。
它的基本格式如下:```void interrupt ISR名称(void){中断服务程序的代码语句}```中断服务程序通常会进行一些操作,以处理中断触发时的事件。
例如,当从串口接收到数据时,中断服务程序需要读取接收缓冲区中的数据并处理。
二、中断优先级分配当多个中断同时发生时,如何处理中断事件是一个需要考虑的问题。
单片机中可以通过设置中断优先级实现多个中断间的优先级分配。
当多个中断发生时,单片机会按中断优先级从高到低的顺序进行处理。
在实际应用中,需要根据具体的应用需求进行中断优先级的分配设置。
三、中断向量表中断向量表是一个非常重要的概念,在单片机中,每一个中断都与中断向量表中的一个向量地址相对应。
当中断事件发生时,MCU会自动跳转到对应的向量地址,从而执行相应的中断服务程序。
中断向量表通常存储在单片机的程序存储器中,其结构体如下:```//中断向量表结构体struct interrupt_Vector_Table{void interrupt (*int0_isr)();void interrupt (*int1_isr)();void interrupt (*int2_isr)();//...其他中断服务程序的指针};//中断向量表在程序存储器中的地址#define INTERRUPT_VECTOR_ADDRESS 0x0000//中断向量表变量定义interrupt_Vector_Table __at (INTERRUPT_VECTOR_ADDRESS)interrupt_Vector_Table_content;```需要注意的是,有些单片机包含了一个默认的中断向量表,其中会包括一些通用的中断服务程序。