- 应 用
- 计算机编程
- 外文名
- Interrupt Request
- 分 类
- 硬性中断、软性中断
- 中文名
- 中断
- 学 科
- 计算机
- 顺 序
- 高级中断优先
-
2021-02-08 16:24:42更多相关内容
-
51单片机学习笔记之中断(外部中断、定时器中断、中断嵌套)
2021-08-03 15:31:41要学习51单片机中断的朋友,拥有这一篇博文就够了,深入浅出,里面包含了寄存器,外部中断、定时器中断、中断嵌套等的讲解,还有代码实战。快一万字,写得不容易,还请大家点赞支持一下,后续持续更新(一)寄存器1....要学习51单片机中断的朋友,拥有这一篇博文就够了,深入浅出,里面包含了寄存器,外部中断、定时器中断、中断嵌套等的讲解,还有代码实战。快一万字,写得不容易,还请大家点赞支持一下,后续持续更新
(一)寄存器
要想学习中断那么首先就要了解寄存器,在这里我们学习一下什么是寄存器,寄存器怎么用。
1.什么是寄存器
寄存器是特殊的RAM,特殊功能寄存器是控制单片机硬件的开关(例如IE)或者是指示单片机状态的信号(例如PSW),通过特殊寄存器你就可以方便的控制整个MCU,并且知道当前的MCU的工作状态。
2.寄存器怎么用
AT89S51单片机中的特殊功能寄存器(SFR)的单元地址映射在片内RAM区的80H~FFH区域中,它共有26个,离散地分布在该区域中。用到哪个寄存器就相应配置哪个寄存器即可。寄存器太多就不一一写出来了,用到再去找就好。
(二)中断
单片机的中断是由单片机片内的中断系统来实现的。当中断请求源(简称中断源)发出中断请求时,如果中断请求被允许的话,单片机暂时中止当前正在执行的主程序,转到中断服务程序处理中断服务请求,处理完中断服务请求后,再回到原来被中止的程序之处(断点),继续执行被中断的主程序。
1.中断允许寄存器IE
EX0
外部中断0允许位。EX0=1,允许外部中断0中断;EX0=0,禁止外部中断0中断。当EX0=1( SETB EX0 )时,同时单片机P3.2引脚上出现中断信号时,单片机中断主程序的执行而“飞”往中断服务子程序,执行完后通过中断返回指令RET 动返回主程序。当EX0=0( CLR EX0)时,即使单片机P3.2引脚上出现中断信程序也不会从主程序“飞” 出去执行,因为此时单片机的CPU相当于被“堵上了耳朵”,根本接收不到P3.2引脚上的中断信号,但是这并不表示这个信号不存在。如果单片机的CPU有空查一下TCON中的IE0位,若为1就说明有中断信号出现过。
ET0
T0溢出中断允许位。ET0=1,允许T0中断;ET0=0,禁止T0中断。
EX1
外部中断1允许位。EX1=1,允许外部中断1中断;EX1=0,禁止外部中断1中断。当EX1=1( SETB EX1)时,并且外部P3.3引脚上出现中断信号时,单片机CPU会中断主程序而去执行相应的中断服务子程序;当EX1=0( CLR EX1)时使外部P3.3引脚上即使出现中断信号,单片机的CPU也不能中断主程序转而去行中断服务子程序。
因此,可以这样认为,EX0和EX1是决定CPU能否感觉到外部引脚P3.2P3.3上的中断信号的控制位。ET1
T1溢出中断允许位。ET1=1,允许T1中断;ET1=0,禁止T1中断。
ES
串行中断允许位。ES=1,允许串行口中断;ES=0,禁止串行口中断。
EA
中断总允许位。EA=1,CPU开放中断;EA=0,CPU禁止所有的中断请求。总允许EA好比一个总开关。EA就相当于每家水管的总闸,如果总闸不开,各个龙头即使开了也不会有水;反过来,如果总闸开了而各个分闸没开也不会有水,所当我们想让P3.2和P3.3引脚上的信号能够中断主程序则必须将EA位设置为0(CLR EA)。
使用方法
(1)整体赋值:IE=0x81;(开启全局中断,打开外部中断0 )。
(2)单独赋值:EA=1;EX0=1;(开启全局中断,打开外部中断0 )。2.中断优先级寄存器IP
PS——串行口中断优先级控制位
PS=1,串行口中断定义为高优先级中断。
PS=0,串行口中断定义为低优先级中断。PT1——定时器/计数器1中断优先级控制位
PT1=1,定时器/计数器1中断定义为高优先级中断。
PT1=0,定时器/计数器1中断定义为低优先级中断。PX1——外部中断1中断优先级控制位
PX1=1,外部中断1定义为高优先级中断。
PX1=0,外部中断1定义为低优先级中断。PT0——定时器/计数器0中断优先级控制位
PT0=1,定时器/计数器0中断定义为高优先级中断。
PT0=0,定时器/计数器0中断定义为低优先级中断。PX0——外部中断0中断优先级控制位
PX0=1,外部中断0定义为高优先级中断。
PX0=0,外部中断0定义为低优先级中断。中断优先级(高到低)
外部中断0
T0溢出中断
外部中断1
T1溢出中断
串行口中断
T2溢出中断(52)3.TCON寄存器
TF1:片内定时器/计数器T1的溢出中断请求标志位。
当启动T1计数后,定时器/计数器T1从初值开始加1计数,当计数溢出时,由硬件自动为TF1置“1”,向CPU申请中断。CPU响应TF1中断时,TF1标志位由硬件自动清零,TF1也可由软件清零。
TF0:片内定时器/计数器T0的溢出中断请求标志位。
功能与TF1相同。
IE1:外部中断请求1的中断请求标志位。
IE1=0,无中断请求。
IE1=1,外部中断1有中断请求。当CPU响应该中断,转向中断服务程序时,由硬件清“0”IE1。IE0: 外部中断请求0的中断请求标志位。
IE0=0,无中断请求。
IE0=1,外部中断0有中断请求。当CPU响应该中断,转向中断服务程序时,由硬件清“0”IE0。IT1:选择外部中断请求1为负跳变触发方式还是电平触发方式。
IT1=0,为电平触发方式,外部中断请求输入信号为低电平有效,并把IE置“1”。转向中断服务程序时,则由硬件自动把IE1清零。
IT1=1,为负跳变触发方式,外部中断请求输入信号电平为从高到低的负跳变有效,,并把IE置“1”。转向中断服务程序时,则由硬件自动把IE1清零。IT0:选择外部中断请求0为负跳变触发还是电平触发方式。
与IT1相似。
4.SCON寄存器
TI:串行口发送中断请求标志位。
当CPU将1字节的数据写入串行口的发送缓冲器SBUF时,就启动一帧串行数据的发送,每发送完一帧串行数据后,硬件把TI中断请求标志位自动置“1”。CPU响应串行口发送中断时,并不能清除TI标志位,TI标志位必须在中断服务程序中用指令对其清零。
RI:串行口接收中断请求标志位。
在串行口接收完一个串行数据帧,硬件自动使RI中断请求标志位置“1”。CPU在响应串行口接收中断时,RI标志位并不清零,必须在中断服务程序中用指令对RI清零。
(三)外部中断
51单片机的外部中断int0对应的引脚为p3.2,外部中断int1对应的引脚为p3.3。
1.外部中断0,按下开关K3,数码管0变1
寄存器配置:
EA=1;//总中断允许 EX0=1;//允许外部中断0 IT0=0;//选择外部中断0为电平触发方式
完整代码:
#include<reg51.h> #define uchar unsigned char sbit key = P3^2; void delay(unsigned int i)//延时函数 { unsigned int j; for(;i>0;i--) for(j=0;j<333;j++){} } void main()//主函数 { EA=1;//总中断允许 EX0=1;//允许外部中断0 IT0=0;//选择外部中断0为电平触发方式 while(1)//循环 {P0=0x3f;}//P0.0口的Led亮 } void key_scan() interrupt 0 //外部中断0的中断服务函数 { if(key==0)//判断是否有按键按下 { delay(10);//延时去抖 if(key==0) { P2=0xfe; P0=0x06; while(!key);//等待按键松开 P2=0xff; P0=0x3f; } } }
2.外部中断1,按下开关K4,数码管0变1
寄存器配置:
EA=1;//总中断允许 EX1=1;//允许外部中断0 IT1=0;//选择外部中断0为电平触发方式
完整代码:
#include<reg51.h> #define uchar unsigned char sbit key = P3^3; void delay(unsigned int i)//延时函数 { unsigned int j; for(;i>0;i--) for(j=0;j<333;j++){} } void main()//主函数 { EA=1;//总中断允许 EX1=1;//允许外部中断0 IT1=0;//选择外部中断0为电平触发方式 while(1)//循环 {P0=0x3f;}//P0.0口的Led亮 } void key_scan() interrupt 1 //外部中断1的中断服务函数 { if(key==0)//判断是否有按键按下 { delay(10);//延时去抖 if(key==0) { P2=0xfe; P0=0x06; while(!key);//等待按键松开 P2=0xff; P0=0x3f; } } }
3.外部中断扩展
寄存器配置:
IT0 = 1;//跳沿触发 IT1 = 1;//跳沿触发 PX1 = 1;//中断1高于中断0 IE = 0x85;/*由低到高:EX1(第3位)=1,EX0 (第0位)= 1,EA (第八位)= 1 IE = 10000101*/
完整代码:
#include<reg52.h> #include<intrins.h> #define uchar unsigned char #define uint unsigned int uint i; void delay(uint xms); void Int(); void Interrupt0(); void Interrupt1(); void main() { Int(); P2 = 0xfe; while(1) { for (i = 0;i < 7;i++) { P2 = _crol_(P2, 1);//先左移 delay(600); } for (i = 0;i < 7;i++) { P2 = _cror_(P2, 1);//再右移 delay(600); } } } void Int() { IT0 = 1;//跳沿触发 IT1 = 1;//跳沿触发 PX1 = 1;//中断1高于中断0 IE = 0x85;/*由低到高:EX1(第3位)=1,EX0 (第0位)= 1,EA (第八位)= 1 IE = 10000101*/ } void delay(uint xms)//AT89C5211.0592MHz { uint x, y; for (x = xms;x > 0;x--) for (y = 110;y > 0;y--); } void Interrupt1() interrupt 0 { while (1) { P2 = 0x0f; delay(600); P2 = 0xf0; delay(600); } } void Interrupt2() interrupt 2/*外部中断1的标号是2!*/ { while (1) { P2 = 0xcc;//(11001100) delay(600); P2 = 0x33; delay(600); } }
(四)定时器中断
1.定时器0
寄存器配置:
TMOD = 0x01; TH0 = (65536 - 45872) / 256; // 设置定时器0为工作方式1(M1M0为01) TL0 = (65536 - 45872) % 256; // 装初值11.0592M晶振定时50ms数位45872 EA = 1; // 开总中断 ET0 = 1; // 开定时器0中断 TR0 = 1; // 启动定时器0
完整代码:
#include<reg51.h> #include<intrins.h> #define uchar unsigned char #define uint unsigned int sbit led1 = P2^0; uchar num = 0; void main() { TMOD = 0x01; TH0 = (65536 - 45872) / 256; // 设置定时器0为工作方式1(M1M0为01) TL0 = (65536 - 45872) % 256; // 装初值11.0592M晶振定时50ms数位45872 EA = 1; // 开总中断 ET0 = 1; // 开定时器0中断 TR0 = 1; // 启动定时器0 while(1) { ; } } void T0_time() interrupt 1 { TH0 = (65536 - 45872) / 256; TL0 = (65536 - 45872) % 256; num++; if (num == 20) { num = 0; led1 = ~led1; } }
2.定时器1
寄存器配置:
TMOD = 0x01; TH0 = (65536 - 45872) / 256; // 设置定时器1为工作方式1(M1M0为01) TL0 = (65536 - 45872) % 256; // 装初值11.0592M晶振定时50ms数位45872 EA = 1; // 开总中断 ET1 = 1; // 开定时器1中断 TR1 = 1; // 启动定时器1
完整代码:
#include<reg51.h> #include<intrins.h> #define uchar unsigned char #define uint unsigned int sbit led1 = P2^0; uchar num = 0; void main() { TMOD = 0x01; TH0 = (65536 - 45872) / 256; // 设置定时器1为工作方式1(M1M0为01) TL0 = (65536 - 45872) % 256; // 装初值11.0592M晶振定时50ms数位45872 EA = 1; // 开总中断 ET1 = 1; // 开定时器1中断 TR1 = 1; // 启动定时器1 while(1) { ; } } void T1_time() interrupt 3 { TH0 = (65536 - 45872) / 256; TL0 = (65536 - 45872) % 256; num++; if (num == 20) { num = 0; led1 = ~led1; } }
3.定时器计数控制数码管0到60
寄存器配置:
TMOD=0x11;//写在一起 //定时器0 //TMOD=0x01; TH0=(65536-45872)/256; TL0=(65536-45872)%256; EA=1; ET0=1; TR0=1; //定时器1 //TMOD=0x10; TH1=(65536-45872)/256; TL1=(65536-45872)%256; EA=1; ET1=1; TR1=1;
完整代码:
#include <reg52.h> #define uint unsigned int #define uchar unsigned char uchar code table[]={ 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71 };//共阴极数码管编码 uchar num0,num1; uint ge ,shi; sbit LSA=P2^2;//74HC138译码器端口 sbit LSB=P2^3; sbit LSC=P2^4; void display_time(uint ,uint); void delay_ms(uint); void main() { TMOD=0x11;//写在一起 //定时器0 //TMOD=0x01; TH0=(65536-45872)/256; TL0=(65536-45872)%256; EA=1; ET0=1; TR0=1; //定时器1 //TMOD=0x10; TH1=(65536-45872)/256; TL1=(65536-45872)%256; EA=1; ET1=1; TR1=1; while(1) { display_time(ge ,shi);//时间一直显示中 } } void T0_time()interrupt 1 //数码管处理 T0定时器 { TH0=(65536-45872)/256;//每50ms产生一次中断 TL0=(65536-45872)%256;//所以每20次中断,个位+1 num0++; if(num0==20) { num0=0; ge++; if(ge==10) { shi++; //时间进位 ge=0; } if(shi==6) shi=0; //时间归零 } } void display_time(uint ge ,uint shi) { LSA=0;LSB=1;LSC=1; P0=table[ge];//送入个位数字 delay_ms(5); LSA=1;LSB=1;LSC=1; P0=table[shi];//送入十位数字 delay_ms(5); } void delay_ms(uint ms) { uint i,j; for(i=ms;i>0;i--) for(j=110;j>0;j--); }
4.定时器做的时钟
寄存器配置:
TMOD=0x01; TH0=(65536-45872)/256; TL0=(65536-45872)%256; EA=1; ET0=1; TR0=1;
完整代码:
#include <reg52.h> #define uint unsigned int #define uchar unsigned char uchar code table[]={ 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71 };//共阴极数码管编码 uchar num; uint hour_ge,hour_shi,minute_ge, minute_shi,second_ge,second_shi; sbit LSA=P2^2;//74HC138译码器端口 sbit LSB=P2^3; sbit LSC=P2^4; void display_time(uint,uint,uint,uint,uint,uint); void delay_ms(uint); void main() { TMOD=0x01; TH0=(65536-45872)/256; TL0=(65536-45872)%256; EA=1; ET0=1; TR0=1; while(1) { display_time(hour_shi,hour_ge,minute_shi,minute_ge,second_shi,second_ge); //时间一直显示中 } } void T0_time()interrupt 1 //数码管处理 T0定时器 { TH0=(65536-45872)/256;//每50ms产生一次中断 TL0=(65536-45872)%256;//所以每20次中断,个位+1 num++; if(num==20) { num=0; second_ge++;//秒+1 } if(second_ge==10) { second_ge=0; second_shi++; if(second_shi==6) { second_shi=0; minute_ge++; if(minute_ge==10) { minute_ge=0; minute_shi++; if(minute_shi==6) { minute_shi=0; hour_ge++; if(hour_ge==10) { hour_ge=0; hour_shi++; if(hour_shi==2&&hour_ge==4) { hour_shi=0; hour_ge=0; } } } } } } } void display_time(uint hour_shi,uint hour_ge,uint minute_shi,uint minute_ge,uint second_shi,uint second_ge) { LSA=0;LSB=0;LSC=0;//第六个数码管送入second_ge P0=table[second_ge]; delay_ms(1); LSA=1;LSB=0;LSC=0;//第五个数码管送入second_shi P0=table[second_shi]; delay_ms(1); LSA=1;LSB=1;LSC=0;//第四个数码管送入minute_ge P0=table[minute_ge]; delay_ms(1); LSA=0;LSB=0;LSC=1;//第三个数码管送入minute_shi P0=table[minute_shi]; delay_ms(1); LSA=0;LSB=1;LSC=1;//第二个数码管送入hour_ge P0=table[hour_ge]; delay_ms(1); LSA=1;LSB=1;LSC=1;//第一个数码管送入hour_shi P0=table[hour_shi]; delay_ms(1); } void delay_ms(uint ms) { uint i,j; for(i=ms;i>0;i--) for(j=110;j>0;j--); }
(五)中断嵌套
1.外部中断嵌套K3,K4
寄存器配置:
IT0 = 1; IT1 = 1; PX0 = 1; IE = 0x85;/*由低到高:EX1(第3位)=1,EX0 (第0位)= 1,EA (第八位)= 1 IE = 10000101*/
完整代码:
#include<reg52.h> #define uchar unsigned char #define uint unsigned int sbit LED1 = P2 ^ 0; sbit LED2 = P2 ^ 1; void Int(); void Interrupt1(); void Interrupt2(); void main() { Int(); while (1); } void Int() { IT0 = 1; IT1 = 1; PX0 = 1; IE = 0x85;/*由低到高:EX1(第3位)=1,EX0 (第0位)= 1,EA (第八位)= 1 IE = 10000101*/ } void Interrupt1() interrupt 0 { LED1 = ~LED1; } void Interrupt2() interrupt 2/*外部中断1的标号是2!*/ { LED2 = ~LED2; }
看到最后相信你也应该收获到很多,一起进步吧!
-
中断
2018-10-03 18:54:31整个过程称为中断处理,简称中断,而引起这一过程的事件称为中断事件。中断是计算机实现并发执行的关键,也是操作系统工作的根本。 分类 中断按事件来源分类,可以分为外部中断和内部中断。中断事件来自于CPU...定义
在计算机科学中,中断指计算机CPU获知某些事,暂停正在执行的程序,转而去执行处理该事件的程序,当这段程序执行完毕后再继续执行之前的程序。整个过程称为中断处理,简称中断,而引起这一过程的事件称为中断事件。中断是计算机实现并发执行的关键,也是操作系统工作的根本。
分类
中断按事件来源分类,可以分为外部中断和内部中断。中断事件来自于CPU外部的被称为外部中断,来自于CPU内部的则为内部中断。
进一步细分,外部中断还可分为可屏蔽中断(maskable interrupt)和不可屏蔽中断(non-maskable interrupt)两种,而内部中断按事件是否正常来划分可分为软中断和异常两种。
外部中断的中断事件来源于CPU外部,必然是某个硬件产生的,所以外部中断又被称为硬件中断(hardware interrupt)。计算机的外部设备,如网卡、声卡、显卡等都能产生中断。外部设备的中断信号是通过两根信号线通知CPU的,一根是INTR,另一根是NMI。CPU从INTR收到的中断信号都是不影响系统运行的,CPU可以选择屏蔽(通过设置中断屏蔽寄存器中的IF位),而从NMI中收到的中断信号则是影响系统运行的严重错误,不可屏蔽,因为屏蔽的意义不大,系统已经无法运行。
内部中断来自于处理器内部,其中软中断是由软件主动发起的中断,常被用于系统调用(system call);而异常则是指令执行期间CPU内部产生的错误引起的。异常也和不可屏蔽中断一样不受eflags寄存器的IF位影响,区别在于不可屏蔽中断发生的事件会导致处理器无法运行(如断电、电源故障等),而异常则是影响系统正常运行的中断(如除0、越界访问等)。
中断描述符表
中断描述符表(Interrupt Descriptor Table,IDT)是保护模式下用于存储中断处理程序入口的数据结构,实模式中采用中断向量表(Interrupt Vector Table,IVT)。当CPU接收一个中断时,需要用中断向量在此表中检索对应的中断描述符,在该描述符中找到中断处理程序的起始地址,然后才能执行中断处理程序。
中断描述符表中不仅仅有中断描述符,还可以有任务门描述符和陷阱门描述符,它们实质上都是记录着某段程序的起始地址,因此可以统称为门。
中断处理过程及保护
中断过程因中断来源而异,外部中断由外设发出,经中断代理芯片接收并处理后将该中断的中断向量号发送到CPU,最后由CPU执行该中断向量号对应的中断处理程序。内部中断则不经过中断代理芯片。
中断在处理器内部的处理程序如下:
(1)处理器根据中断向量号定位中断门描述符。
中断向量号是中断描述符的索引,当处理器收到一个外部中断向量号后,它用此向量号在中断描述符表中查询对应的中断描述符,然后再去执行该中断描述符指向的中断处理程序。中断描述符占8字节,因此处理器用中断向量号乘8后再与IDTR中的中断描述符表地址相加得到中断描述符的位置。
(2)特权级检查
中断向量号只是一个整数,其中没有RPL,所以在对由中断引起的特权级转移做特权级检查时并不涉及RPL。
如果是由软中断int n、int3、和into这些由用户进程引发的中断,由用户代码控制,处理器要检查当前特权级CPL和门描述符DPL,数值上CPL≤门描述符DPL才能通过检查。通过上一步检查后还需要检查CPL和门描述符中所记录的选择子对应的目标代码段DPL,数值上CPL>目标代码段DPL才能通过检查,因为除返回指令外,特权转移只能由低到高。
若中断是由外部设备或异常引起的,只检查CPL和目标代码段的DPL即可。
(3)执行中断处理程序
特权级检查通过后,将门描述符中目标代码段选择子加载到段寄存器CS中,把门描述符中的中断处理程序的偏移地址加载到EIP,然后开始执行中断处理程序。
中断发生后,eflags中的NT位和TF位都会被置0。如果中断对应的门描述符是中断门,标志寄存器eflags中的IF位也会被置0以避免中断嵌套(中断处理过程中又处理新的中断),即默认情况下处理器对中断门描述符的中断例程处理是不可中断的。若中断发生时对应的门描述符是任务门或陷阱门的话,CPU不会将状态寄存器中的IF位清0,即允许中断嵌套。
本文部分内容摘自《操作系统真象还原》,有改动
-
中断优先级
2021-07-25 04:32:43为使系统能及时响应并处理发生的所有中断,系统根据引起中断事件的重要性和紧迫程度,硬件将中断源分为若干个级别,称作中断优先级。在实际系统中,常常遇到多个中断源同时请求中断的情况,这时CPU必须确定首先为哪...为使系统能及时响应并处理发生的所有中断,系统根据引起中断事件的重要性和紧迫程度,硬件将中断源分为若干个级别,称作中断优先级。
在实际系统中,常常遇到多个中断源同时请求中断的情况,这时CPU必须确定首先为哪一个中断源服务,以及服务的次序。解决的方法是中断优先排队,即根据中断源请求的轻重缓急,排好中断处理的优先次序即优先级( Priority ),又称优先权,先响应优先级最高的中断请求。另外,当CPU正在处理某一中断时,要能响应另一个优先级更高的中断请求,而屏蔽掉同级或较低级的中断请求,形成中断嵌套。
中文名
中断优先级
外文名
Interrupt priority
解决方法
软件、硬件优先级排队作 用
及时响应并处理发生的所有中断
排序方法
引起中断事件的重要性和紧迫程度
依 据
优先级
中断优先级简介
编辑
语音
微机系统中有多个中断源,有可能出现两个或两个以上中断源同时发出中断请求的情况。多个中断源同时请求中断时,CPU必须先确定为哪一个中断源服务,要能辨别优先级最高的中断源并进行响应。CPU在处理中断时也要能响应更高级别的中断申请,而屏蔽掉同级或较低级的中断申请,这就是中断优先级问题。[1]
中断系统中,CPU一般根据各中断请求的轻重缓急分别处理,即给每个中断源确定一个中断优先级别,系统自动对它们进行排队判优,保证首先处理优先级别高的中断请求,待级别高的中断请求处理完毕后,再响应级别较低的中断请求。对多个中断源进行识别和优先级排队的日的就是要确定出最高级别的中断源,并形成该中断源的中断服务程序入口地址,以便CPU将控制转移到该中断服务程序去。[1]
一般指以下两层含义:[2]
①若有2个或2个以上的中断源同时提出中断请求,微处理器先响应哪个中断源,后响应哪个中断源;[2]
②若一个中断源提出中断请求,微处理器给予响应并正在执行其中断服务程序时,又有1个中断源提出中断请求,后来的中断源能否中断前一个中断源的中断服务程序。[2]
中断优先级分类
编辑
语音
中断是用以提高计算机工作效率、增强计算机功能的一项重要技术。最初引入硬件中断,只是出于性能上的考量。如果计算机系统没有中断,则处理器与外部设备通信时,它必须在向该设备发出指令后进行忙等待(Busy waiting),反复轮询该设备是否完成了动作并返回结果。这就造成了大量处理器周期被浪费。引入中断以后,当处理器发出设备请求后就可以立即返回以处理其他任务,而当设备完成动作后,发送中断信号给处理器,后者就可以再回过头获取处理结果。这样,在设备进行处理的周期内,处理器可以执行其他一些有意义的工作,而只付出一些很小的切换所引发的时间代价。后来被用于CPU外部与内部紧急事件的处理、机器故障的处理、时间控制等多个方面,并产生通过软件方式进入中断处理(软中断)的概念。[3]
中断可分为如下几种:
中断优先级硬件中断
(Hardware Interrupt)[3]可屏蔽中断(maskable interrupt)。硬件中断的一类,可通过在中断屏蔽寄存器中设定位掩码来关闭。[3]
非可屏蔽中断(non-maskable interrupt,NMI)。硬件中断的一类,无法通过在中断屏蔽寄存器中设定位掩码来关闭。典型例子是时钟中断(一个硬件时钟以恒定频率—如50Hz—发出的中断)。[3]
处理器间中断(interprocessor interrupt)。一种特殊的硬件中断。由处理器发出,被其它处理器接收。仅见于多处理器系统,以便于处理器间通信或同步。[3]
伪中断(spurious interrupt)。一类不希望被产生的硬件中断。发生的原因有很多种,如中断线路上电气信号异常,或是中断请求设备本身有问题。[3]
中断优先级软件中断
(Software Interrupt)软件中断也叫内部中断,它是CPU执行中断指令INT n产生的中断。中断指令提供了直接调用中断服务程序的软件手段。[4]
软件中断是以INT n指令的形式出现在程序中的,中断指令占用两个字节,第一个字节为指令码CDH,第二个字节为指令操作数n,即中断类型码。当软件中断时,CPU从指令流中读取中断类型码;当可屏蔽中断时,要在发出中断响应信号ITA后,才能从数据总线上读取中断类型码。可见,软件中断与外部中断有许多不同之处,它具有自身的一些特点,表现在以下几个方面。[4]
(1)软件中断是以一条指令INT n而进入中断服务程序的,并且其中断类型码由指令的第二字节提供。[4]
(2)软件中断不受中断允许标志IF的禁止,即无论正=1或0,对任何一个软件中断都不影响。其中,只有单步中断受单步标志TF的影响,即只有当TF=1时,才能执行单步中断。[4]
(3)由于CPU从指令流中读取软件中断的中断类型码,因此,在软件中断进入中断后,不需要执行中断响应总线周期,也不必从数据总线上读取中断类型码。[4]
(4)软件中断除类型0(除数为0的中断)外,都没有随机性,因为软件中断是以INT n指令的形式出现在程序中的,该指令放在程序的何处何时执行都是预先定好的,这就使得软件中断不会出现随机性。[4]
中断优先级中断源种类
编辑
语音
(1)设备中断:如键盘、打印机等设备的数据传送请求等。[1]
(2)指令中断:为了方便用户使用系统资源或调试软件而设置的中断指令,由程序预先安排的中断指令(INT n)引起,如BIOS及DOS系统功能调用的中断指令等。[1]
(3)故障中断:计算机内部设有故障自动检测装置,如电源掉电、奇偶校验错或协处理器中断请求等意外事件,都要求CPU进行相应的中断处理。[1]
(4)实时时钟中断:在自动控制系统中,常遇到定时检测与时间控制,这时可采用外部时钟电路进行定时。CPU可发出命令启动时钟电路开始计时,待定时时间到,时钟电路就会向CPU发出中断申请,由CPU进行处理。[1]
(5) CPU内部运算产生的某些错误所引起的中断:如除法出错、运算溢出、程序调试中设置断点等。[1]
中断优先级中断响应原则
编辑
语音
响应不同优先级中断的原则是:[5]CPU首先响应高优先级的中断请求;
如果优先级相同,CPU按查询次序响应排在前面的中断;
正在进行的中断过程不能被新的同级或低优先级的中断请求所中断;
正在进行的低优先级中断过程,能被高优先级中断请求所中断。
中断优先级响应流程
编辑
语音
CPU在执行每一条指令的后期,要对所有的中断源进行检测。[5]
在检测到中断请求前,程序计数器PC中存储的是下一条指令码的地址。如果CPU检测到某一中断请求并将响应该中断时,它要跳转到该中断服务程序处,即把PC的当前内容保存起来,再把该中断服务程序的入口地址送给PC,则其后CPU就执行该中断服务程序了。[5]
图1 CPU响应中断流程
[5]在退出中断服务程序前,CPU要执行中断返回指令RETI,该指令把进入中断服务程序前保存的PC内容再写入PC,则其后CPU就从进入中断服务程序前的断点处向下执行指令,其流程如图1所示用C51编写中断服务函数时,并不需要在中断服务函数的最后编写RETI指令,该指令由编译器在编译中断服务函数时自动添加。
中断优先级优先级排队
编辑
语音
在实际系统中,常常遇到多个中断源同时请求中断的情况,这时CPU必须确定首先为哪一个中断源服务,以及服务的次序。解决的方法是中断优先排队,即根据中断源请求的轻重缓急,排好中断处理的优先次序即优先级( Priority),又称优先权,先响应优先级最高的中断请求。另外,当CPU正在处理某一中断时,要能响应另一个优先级更高的中断请求,而屏蔽掉同级或较低级的中断请求,形成中断嵌套。[6]
中断源的优先级判别一般可采用软件优先级排队和硬件优先级排队两种方法。[7]
中断优先级软件优先级排队
图2 软件査询接口电路如图2所示,优先级由查询顺序决定,先查询的中断源具有最高的优先级。[8]
软件优先级排队是指各个中断源的优先权由软件安排。若干个外设的中断请求信号相“或”后,送至CPU的中断接收引脚(如INTR)。这样,只要任一外设有中断请求,CPU便可响应中断。在中断服务子程序前可安排一段优先级的查询程序,即CPU读取外设中断请求状态端口,然后根据预先确定的优先级级别逐位检测各外设的状态,若有中断请求就转到相应的Uo处理程序入口,为该外设服务。[7]
软件查询程序流程用软件査询方法确定中断优先级是一种最简单的解决方法,主要依靠软件方法实现,不需要专门的优先级排队电路,可以通过修改查询顺序来修改中断优先级,不必更改硬件。但是当中断源个数较多时,由逐位检测査询到转入相应中断服务程序所耗费的时间较长,中断响应速度慢,服务效率低。[7]
中断优先级硬件优先级排队
菊花链优先级排队电路为提高中断处理效率,通常采用硬件处理中断优先权问题,即采用优先级排队电路或专用中断控制器等硬件电路来管理中断。其中,硬件优先权排队电路形式众多,有采用编码器组成的,有采用链式电路的。[1]
利用外设连接在排队电路的物理位置来决定其中断优先权的,排在最前面的优先级最高,排在最后面的优先级最低。[6]
中断优先级改变并发中断优先级的方法
编辑
语音
在PC环境下,要改变并发中断优先级,实现理想的中断处理顺序,要从以下两个方面着手。
(1)使低优先级的中断可中断高优先级的中断服务程序。
通过研究发现,8259A 中的中断服务寄存器ISR。对中断处理顺序的改变起了非常重要的作用。当中断服务寄存器的相应位置 1时,8259A 自动禁止同级和较低级的中断请求。因此要改变中断的处理顺序,必须在CPU响应中断后,将8259A中的相应位清零的。这样,如果有新的中断请求,不论它的级别高低,只要CPU处于开中断状态,芯片就会马上再向CPU发出中断请求,即低优先级的中断就可能会中断高优先级的中断服务程序。而实现CPU响应中断后,将中断服务寄存器8259A中的相应位清零,有3种解决的办法。[9]
(2)在中断处理程序中设置新的中断屏蔽字。
为了能根据需要,改变实际的中断处理次序,很多机器都设置了中断屏蔽寄存器硬件,以决定是否让某级中断请求进入中断优先权电路进行优先权比较。级别高的中断请求优先得到响应。只要将每一类中断处理程序的各级中断屏蔽位设置成不同的状态,就可以得到所希望的中断处理次序。[9]
中断优先级单级中断与多级中断
编辑
语音
根据计算机系统对中断处理策略的不同,中断系统可以分为单级中断系统和多级中断系统,单级中断系统是中断结构中最基本的形式。[1]
在单级中断系统中,所有的中断源都属于同一级,所有中断请求触发器排成一行,其优先次序是离CPU越近优先级越高。当响应某一中断请求时,CPU执行该中断源的中断服务程序,在此过程中,中断服务程序不允许被其他中断源所打断,即使优先级比它高的中断源也不例外,只有当该中断服务程序执行完毕之后,才能响应其他中断。[1]
多级中断系统是指计算机系统中的多个中断源,根据中断事件的轻重缓急程度不同而分成若干个级别,每一个中断级分配一个优先级。一般而言,优先级高的中断级可以打断优先级低的中断服务程序,以中断嵌套方式进行工作。[1]
在中断优先级已定的情况下,CPU总是首先响应优先级最高的中断请求。当CPU正在响应某一中断源的请求,即正在执行某个中断服务程序时,若有优先级更高的中断源申请中断,为使级别更高的中断源能及时得到服务,CPU就应暂停当前正在服务的级别较低的服务程序而转入新的中断源服务,等新的级别较高的中断服务程序执行完后,再返回到被暂停的中断服务程序继续执行,直至处理结束返回主程序,这种过程称为中断嵌套。CPU允许高优先级中断请求可以打断低优先级中断服务,使CPU对于急需处理的事件立即做出响应。[1]
中断嵌套的出现,扩大了系统中断功能,进一步加强了系统处理紧急事件的能力。中断嵌套可以商多级。具体级数(即嵌套深度)原则上不限制,只取决于堆栈深度,实际上与要求的中断响应速度有关。[1]
词条图册
更多图册
参考资料
1.
杨立,邓振杰,荆淑霞等编著.微型计算机原理与接口技术:中国铁道出版社,2016.02:第219页
2.
袁志勇,王景存主编;章登义,刘树波副主编.嵌入式系统原理与应用技术:北京航空航天大学出版社,2014.01:第146页
3.
张自军,蒋军,叶爱芹.微机原理与接口技术:中国科学技术大学出版社,2012.08:第205页
4.
李育贤.微机接口技术及其应用:西安电子科技大学出版社,2007.06:第73页
5.
王普斌.单片机接口与应用:冶金工业出版社,2016.04:第61页
6.
刘显荣主编;张元涛,吴云君副主编;汪德彪,常继彬,叶文,范苏参编.微机原理与嵌入式接口技术:西安电子科技大学出版社,2016.08:第129页
7.
万晓东,陈则王,孔德明编著.计算机硬件技术基础:南京航空航天大学,2013.01:第275页
8.
刘显荣主编;张元涛,吴云君副主编;汪德彪,常继彬,叶文,范苏参编.微机原理与嵌入式接口技术:西安电子科技大学出版社,2016.08:第130页
9.
陈燕俐, 洪龙, CHENYan-li, et al. 自由调整中断优先级的研究和实现[J]. 南京邮电大学学报(自然科学版), 2005, 25(6):35-39.
-
FreeRTOS中断管理
2022-01-08 15:27:38事件通常采用中断方式检测,中断服务例程(ISR)中的处理量应当越短越好。 注意:只有以”FromISR”或”FROM_ISR”结束的 API 函数或宏才可以在中断服务例程中。 一、二值信号量 1.1、利用二值信号量对任务和中断... -
中断和中断处理流程
2020-12-20 04:41:201. 中断概念中断是指由于接收到来自外围硬件(相对于中央处理器和内存)的异步信号或来自软件的同步信号,而进行相应的硬件/软件处理。发出这样的信号称为进行中断请求(interrupt request,IRQ)。硬件中断导致处理器... -
Linux内核设计与实现---中断和中断处理程序
2022-03-21 15:21:23中断和中断处理程序1 中断2 中断处理程序3 注册中断处理程序4 编写中断处理程序共享的中断处理程序中断处理程序实例5 中断上下文6 中断处理机制的实现7 中断控制禁止和激活中断禁止指定中断线中断系统的状态 1 中断 ... -
硬件中断,软件中断
2020-08-10 09:54:21一个软中断不会去抢占另一个软中断,只有硬件中断才可以抢占软中断,所以软中断能够保证对时间的严格要求 软中断和硬中断的主要区别: 硬件中断会主动打断另一种活动,触发硬件中断会导致(立即)打断正在运行的... -
(中断 中断标志位 中断使能位 中断处理(响应)函数 中断优先级)(中断,异常,陷入) SVC异常(SVC...
2022-01-06 13:34:06中断使能 中断使能的情况下:中断产生---->中断标志位被mcu置1---->mcu暂停主程序去执行中断程序(别忘记清中断)—>返回主程序 不要陷入误区: 并不是说不使能串口接受中断就无法接收数据,只是为了在串口... -
嵌入式中断:统计各中断关键信息 (中断执行/挂起/被打断次数,中断优先级异常等)
2021-08-05 10:57:35嵌入式中断:统计各中断关键信息 ,中断执行/挂起/被打断次数,中断优先级异常等 先上图 实现方法: 实现代码: 数据结构 初始化 获取中断寄存器数据:ICSR 获取中断寄存器数据:IABR 换算中断抢占数据 打印/存储... -
单片机基础:什么是中断系统、中断系统如何用(附中断系统应用实例)
2020-07-09 17:21:41单片机的中断系统 多级中断控制实例 -
ESP32 外部中断原理分析 & GPIO外部中断实战
2021-10-17 22:34:12ESP32外部中断原理&实战 阅读建议: 有一定Cortex-m架构知识基础。 外部中断原理 外部中断实战 首先配置GPIO ESP-IDF提供了一个结构体方便对其进行初始化,结构体如下: typedef struct { uint64_t ... -
DSP的中断系统
2022-04-04 10:38:53文章目录1. 什么是中断 1. 什么是中断 中断是硬件和软件驱动事件,它使得CPU暂停当前的主程序,转而去执行一个中断服务子程序...X281x的中断系统从上至下分成了三级,即CPU级中断、PIE级中断、外设中断。 ... -
PCIe中MSI和MSI-X中断机制详解
2022-01-16 21:23:071.MSI和MSI-X中断机制 2.MSI和MSI-X对比 3.MSI/MSI-X Capability结构 3.1 MSI Capability结构 3.2 MSI消息格式及发送方式 3.3 MSI-X Capability结构 3.4 MSI-X tavle查找过程 1.MSI和MSI-X中断机制 在PCI... -
FreeRTOS的学习(三)——中断机制
2022-03-30 09:56:31FreeRTOS的任务优先级在之前已经进行了...然而FreeRTOS的优先级始终是针对其本身的任务而言的,那么与STM32的内核的中断控制优先级之间是有什么联系嘛?还是有其他的一些方式将FreeRTOS与STM32的中断进行融合呢?... -
中断-NVIC与EXTI外设详解(超全面)
2022-04-14 20:53:30一.NVIC-嵌套向量中断控制器 NVIC :嵌套向量中断控制器,属于内核外设,管理着包括内核和片上所有外设的中断相关的功能。 这里解释一下片上外设与内核外设他们都在芯片里面,但内核外设是在内核CPU里面,片上外设... -
内中断,外中断,软中断,硬中断,异常,陷阱
2022-03-03 20:40:59不管是内中断,外中断,软中断还是硬中断都是按照中断源来划分的。 一、外中断 狭义上的中断(interruption)指的就是外中断。 指来自CPU执行指令以外的事件的发生,希望处理机能够向设备发下一个输入/输出请求,同时... -
STM32 中断原理及外部中断的实现
2021-01-18 15:39:09NVIC 中断配置 Nested Vectored Interrupt Controller,嵌套向量中断控制器。 CM3支持256个中断,16个内核中断,240个外部中断,256级可编程中断设置。 STM32使用了其中一部分,16个内核中断,107系列有68个可屏蔽... -
Arduino中断
2022-01-14 16:14:27ISR(中断服务程序)顾名思义就是中断Arduino当前正在处理的事情而优先去执行中断服务程序。当中断服务程序完成以后,再回来继续执行刚才执行的事情。中断服务程序对监测Arduino输入有很大的用处。 我们可以使用... -
ZYNQ-多中断控制
2021-12-04 17:45:37我发现很多的讲解都是单个中断的控制是如何实现的,但是基本没有多个中断的讲解。 ZYNQ中断 中断分类 中断一共被分为三类 1)PPI 私有中断 2)SGI 软件中断 3)SPI 共享中断 PPI 私有中断 每个CPU都有私有中断,PPI... -
FIQ与IRQ中断
2021-02-02 10:50:58快速中断请求(Fast Interrupt Request,FIQ)与外部中断请求IRQ FIQ和IRQ是两种不同类型的中断,ARM为了支持这两种不同的中断,提供了对应的叫做FIQ和IRQ处理器模式(ARM有7种处理模式)。 一般的中断控制器里我们... -
STM32—中断详解(配合按键中断代码,代码亲测)
2019-07-25 17:35:23在STM32中执行中断主要分三部分: 1.配置NVIC_Config()函数 2.配置EXTI_Config()函数 3.编写中断服务函数 (注:本文章所用代码为中断按键代码,实现了按键进入中断从而控制LED亮灭) 配置NVIC_Config()函数 NVIC 是... -
linux内核学习10:中断和异常
2021-10-12 16:14:54一、中断 1.1 中断的概念 中断是指在CPU正常运行期间,由于内外部事件或由程序预先安排的事件引起的 CPU 暂时停止正在运行的程序,转而为该内部或外部事件或预先安排的事件服务的程序中去,服务完毕后再返回去继续... -
51单片机——中断系统结构
2021-08-28 23:01:50本文主要介绍什么是中断、中断的基本概念、中断的处理过程、中断系统的结构和中断系统控制寄存器 -
【计算机组成原理】CPU中断系统
2022-02-07 12:51:08一、中断系统概述 1、引起中断的各种因素 (1)人为设置的中断 这种中断一般称为自愿中断,因为它是程序中人为设置的,故一旦机器执行这种人为中断,便自愿停止现行程序而转入中断处理。 (2)程序性事故 如... -
【中断】你对中断究竟有多了解?试着把中断的触发流程整理了一遍...
2021-04-22 22:14:46如果要你讲一下中断,你会怎么去描述一个中断的触发流程呢? 最基础的可能就是:保护现场 - 中断处理 - 恢复现场... 那保护现场做了什么事情?中断处理需要注意什么事情?恢复现场又做了什么事情? 相对应的,... -
中断屏蔽技术
2022-03-19 15:29:001,中断屏蔽的意思是,在中断1的服务程序执行过程中,不允许被其他中断打扰; 2,按理,对于不同中断源,它有中断响应优先级,但这个是硬件决定的,无法修改;而如果要修改各个中断的优先级(即是否可以被打扰),... -
外部中断NMI中断.ppt
2020-12-28 21:29:32外部中断NMI中断.ppt* 1、先看其引脚结构再看功能1。 可编程的含义:通过对芯片编程,使芯片实现不同的功能。 中断比较多的情况下,使用中断控制器来管理中断。 用来管理系统的硬件中断。 * 1、数据总线驱动器 和CPU... -
8.4-中断系统小结(cpu中断七个问题)
2022-03-16 23:09:34【1】中断系统 1)作用:用中断系统实现了外设数据的输入输出; 还可以用于程序调试,计算机系统的异常事件,都可以用中断系统来处理; 2)中断因素 人为设置的中断; 程序性事故,如java异常; 硬件故障,如... -
STM32-通用定时器-定时器中断
2021-10-03 14:16:296)如下事件发生时产生中断/DMA(6个独立的IRQ/DMA请求生成器): ① 更新:计数器向上溢出/向下溢出,计数器初始化(通过软件或者内部/外部触发) ② 触发事件(计数器启动、停止、初始化或者由内部/外部触发计数...