精华内容
下载资源
问答
  • 内中断: 1.取中断类型码n 2.标志寄存器入栈,IF=0,TF=0 3.CS,IP入栈 4.IP=n*4,CS=n*4+2 注意: 1.中断类型码是CPU内部产生。 2.IF(interrupt false)为0时不允许其他的可屏蔽中断,sti指令:IF=1,cli指令:IF=...

    内中断:

    1.取中断类型码n
    2.标志寄存器入栈,IF=0,TF=0
    3.CS,IP入栈
    4.IP=n*4,CS=n*4+2
    注意:

    1.中断类型码是CPU内部产生。
    2.IF(interrupt false)为0时不允许其他的可屏蔽中断,sti指令:IF=1,cli指令:IF=0。

    外中断:

    1.传入9号中断信息,判断CPU现在是否可以被中断。
    2.标志寄存器入栈,IF=0,TF=0
    3.CS,IP入栈
    4.IP=n*4,CS=n*4+2
    5.将数据通过I/O总线传入CPU。
    注意:

    中断类型码是外部设备通过数据总线传入CPU的。

    中断处理:

    在自定义有返回的中断时,首先要进行的操作。
    1.存放标志寄存器

    pushf
    

    2.设置IF=0,TF=0

    pushf
    pop ax
    and ax,11111100b
    
    push ax
    popf
    

    3.IP和CS入栈,同时修改IP和CS为中断号的值。

    call dword ptr ds:[0];调用原来的9号中断
    
    展开全文
  • 1.解释 计算机执行某一程序时,发生了紧急事件或者有特殊请求,CPU暂停某程序的执行,转而去处理上述事件,处理完毕后再重新执行原来被打断的程序。...(这两个中断源标志与中断方式由特殊功能寄存器TCON的低四位控制)

    1.解释
    计算机执行某一程序时,发生了紧急事件或者有特殊请求,CPU暂停某程序的执行,转而去处理上述事件,处理完毕后再重新执行原来被打断的程序。
    2.步骤
    中断请求>中断响应>中断处理>中断返回
    请添加图片描述
    3.51的中断源
    有五个中断源
    外部中断源2个
    1.INT0 — 由P3.2端口控制引入,低水平或者下降沿引起。(下降沿就是给5V后给0V形成下降电压)
    2.INT1 —由P3.3端口控制引入,低水平或者下降沿引起。
    (这两个中断源标志与中断方式由特殊功能寄存器TCON的低四位控制)
    内部中断源3个
    1.T0 —定时器/计数器0中断,由T0回0溢出引起。
    2.T1 —定时器/计数器1中断,由T1回0溢出引起。
    3.T1/RI —串行I/O口中断,串行端口完成一帧字符发送引起。
    (由TCON和SCON控制)
    4.51内部结构图
    请添加图片描述

    要运用那个中断就要打开对应的开关,首先EA(总开关)要打开,假设要打开外部中断0,就需要再控制IT0与EX0与PX0。
    5.如何使用中断
    (1.打开对应的中断开关)
    EA —总开关,EA打开CPU接受中断请求;EA关闭,CPU屏蔽任何中断请求。
    外部中断开关
    EX1 —EX1打开,外部中断1打开,反之。
    EX0 —EX0打开,外部中断0打开,反之。
    内部中断打开
    ET0打开,T0的溢出中断打开,反之。
    ET1 —ET1打开,T1的定时器/计数器溢出中断打开,反之。
    ET2 —ET2打开,T2的定时器/计数器溢出中断打开,反之。
    ES —ES打开,串行口一中断打开,反之。请添加图片描述
    也可以按上表,8位2进制赋予IE打开对应开关。
    (2.配置中断方式(触发对应中断的条件))
    外部中断方式控制
    IT0 —IT0为1,为下降沿触发方式。TT0为1,低电平触发方式。(控制在3.2脚)
    IT1 —IT1为1,为下降沿触发方式。TT1为1,低电平触发方式。(控制在3.3脚)
    内部中断方式控制
    TR1 —定时器1的运行控制位。
    TR0 —定时器0的运行控制位。
    TF0 —T0溢出中断标志,TO被允许开始计数时,从初值加一开始运算,当溢出时,硬件自动命TF0为1,引发T0中断,当执行完,硬件自动清0。
    TF1—T1溢出中断标志,T1被允许开始计数时,从初值加一开始运算,当溢出时,硬件自动命TF1为1,引发T1中断,当执行完,硬件自动清0。

    内部中断模式位
    请添加图片描述
    请添加图片描述
    想要打开内部中断0与1什么模式就命对应TMOD为什么值,如果我需要定时器0的定时功能,TMOD=0000 0001=0x01。如果需要定时器0计数,需要把C/T打开,就是TMOD=00000101=0x05。

    (3.触发优先级)
    当多个中断同时发生,按下面顺序
    注意:优先级高的中断可以打断优先级低的中断
    请添加图片描述
    (4.中断处理函数)
    请添加图片描述
    步骤总结
    1.打开对应的中断开关
    2.控制对应中断执行的条件
    3.写中断函数

    以下是各个中断的函数示例(4个)

    外部中断1函数实例(外部中断0同样是这样用)

    #include "reg52.h"			 
    sbit key1=P3^1;	    
    sbit flag = P3^3;
    void delay(unsigned int i)
    {
    	while(i--);	
    }
    void lnt1init()
    {
    	EA = 1;          //总开关打开
    	EX1 = 1;          //外部中断开关打开
    	IT1 = 1;          //触发方式(下降沿)
    }
    void int1() interrupt 2  //外部中断函数,interrupt后面的数字根据优先级那个图有个入口数字
    {
    	P2 = ~P2;       //由亮变无或由无变亮
    }
    void keypros()
    {
    	if(key1==0)		 //独立按键被按下
    	{	   
    		delay(100);
    		if(key1==0)	  //按键消抖
    		{
    			   flag = 1;//产生下降沿,就会进入到中断函数
    		       flag = 0;
    			  while(!key1);   //松手检测
    		} 
    	}		
    }
    
    void main()
    {	
    	lnt1init();
    	P2 = 0x00;    //先取全部亮
    	while(1)
    	{	
    		keypros(); 	
    	}		
    }
    

    内部中断0的软件中断(用作计时器)
    注意这里不是中断函数的使用,而是运用定时器0,故它的函数开关不需要打开

    #include "reg52.h"			 
    sbit LA=P2^2;
    sbit LB=P2^3;
    sbit LC=P2^4;
    sbit  key2 = P3^0; 
    unsigned char smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
    					0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
    void delay(unsigned int z)    
    {
    	unsigned int x,y;
    	for(x=z;x>0;x--)
    	   for(y=120;y>0;y--);
    }
    void timefrist()
    {
    	TR0 = 1;                 //打开定时器0开关
    	TMOD = 0x01;             //定义模式
    	TH0 = 0x4B;              //定义初始值后不断加1,每加1为1.085us,从到19453到65535共46085次,共50ms
    	TL0 = 0xfd;              //前面那个值为19453的16进制的前2位,这个为它的后2位。19453 = 4Bfd
    }
    unsigned char miao=0;        //秒
    unsigned char fen=0;         //分
    void DigDisplay()
    {
    	LA=1;LB=1;LC=1;        //位选,这里用的是转码器3个2进制可以控制8个七段码那个亮
    	P0 = smgduan[fen];     //段选,同样是动态规划的思想
    	delay(5);
    	
    	LA=0;LB=1;LC=1;       
    	P0 = smgduan[miao];
    	delay(5);
    }
    void main()
    {	
    	unsigned char text=0;
    	timefrist();
    	while(1)
    	{	
    		if(TF0==1)          //当定时器0溢出了,即经过50ms,TF0自动设置为1;
    		{
    			TF0 = 0;        //归0
    			TH0 = 0x4B;     //每次使用都要重新定义为50ms
    	        TL0 = 0xfd;  
    			text++;
    			if(text==20)   //当它进行了20次,20*50ms=1s
    			{
    				text =0;  //归0,之后继续加
    				miao++;   //秒加1
    			}
    			if(miao==10)  //秒为10的时候就可以进位了
    			{
    				miao = 0;  //归0
    				fen++;     //秒十位+1
    			}
    		}
        DigDisplay();	      //上面执行很快,所以一直都是动态显示	
    	}
    }
    

    内部中断定时器0与按键
    独立按键1可以实现数值+1,独立按键2实现数值-1
    解释:因为按键有个按键消抖与松手检测会影响动态显示。特别是松手检测,如果你不松手会一直停在那里,不松手就无法动态显示。所有我们用定时器0直接控制,当经过5ms就用一次显示函数,就算不松手也是有中断自动执行显示函数。

    #include "reg52.h"
    sbit LA=P2^2;
    sbit LB=P2^3;
    sbit LC=P2^4;
    sbit  key1 = P3^0;     //按键1
    sbit  key2 = P3^1;     //按键2
    unsigned char smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
    					0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
    void delay(unsigned int z)    
    {
    	unsigned int x,y;
    	for(x=z;x>0;x--)
    	   for(y=120;y>0;y--);
    }
    void timefrist()
    {
    	EA = 1;          //打开总开关
    	ET0 = 1;         //中断函数0的开关
    	TR0 = 1;         //打开定时器0开关
    	TMOD = 0x01;      //模式一,定时模式
    	TH0 = 0xED;       //这里改值了,到上限就5ms
    	TL0 = 0xFF;
    }
    unsigned char miao=0;
    void DigDisplay(unsigned char h)
    {
    	unsigned char a=h%10;                //个位
    	unsigned char b=h/10//十位
    	static unsigned char wei=0;         //静态变量,就是函数执行完也不会抹去这个变量的值,在次使用函数值可以用
    	switch(wei)                        //这里重新布局,我们这里不断交换显示,用一次函数就显示一个,当快速多显示就动态显示
    	{
    		case 0: LA=1;LB=1;LC=1;P0 = smgduan[b];break;      //wei值0与1不断交换,就动态显示
    		case 1:	LA=0;LB=1;LC=1;P0 = smgduan[a];break;  
    	}
    	wei++;                                            //用过之后++
    	if(wei==2)                                 //我们只要1与0不断交换,为2时就重新回0
    	{
    		wei = 0;
    	}
    }
    void timer0() interrupt 1
    {
    	 TH0 = 0xED;         //重新定义5ms初始值
    	 TL0 = 0xFF;
    	 DigDisplay(miao);   //显示,不断5ms显示就是动态显示
    }
    void main()
    {	
    	timefrist();
    	while(1)
    	{
    		if(key1==0)  //为0,按键被按下
    		{
    			delay(20);
    			if(key1==0)   //按键消抖
    			{
    				miao++;    //全局miao加1,显示就会加1了
    				while(!key1);   //松手检测
    			}
    		}
    		if(key2==0)          //同理
    		{
    			delay(5);
    			if(key2==0)
    			{
    				miao--;
    				while(!key2); 
    			}
    		}
       }
    }
    

    内部中断定时器与计数器同时使用
    内部中断0用作计数(就是3.4口有电压波动TH0与TL0的总值就会加1,由于TH0为后2位,加不到,后面就为TL0加一),内部中断1用作定时器
    思想:定时器1到时间就使LED电压反转(亮与不亮),然后该LED的与P3.4口连在一起,当LED灯不断闪烁,电压不断变化,3.4口就会感受电压波动自动使TL0加1,然后把TL0值传递显示,就可以观察TL0变化。

    #include "reg52.h"			 
    sbit LA=P2^2;
    sbit LB=P2^3;
    sbit LC=P2^4;
    sbit  key2 = P3^0; 
    sbit LED = P2^0;
    unsigned char code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
    					0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
    void delay(unsigned int z)    
    {
    	unsigned int x,y;
    	for(x=z;x>0;x--)
    	   for(y=120;y>0;y--);
    }
    void timefrist0()
    {
    	TR0 = 1;               //打开计数器1
    	TMOD |= 0x05;          //模式值为5
    	TH0 = 0;               //计数功能,设为0
    	TL0 = 0;
    }
    void timefrist1()
    {
    	EA = 1;          
    	TR1 = 1;           //中断1的开关
    	TMOD |= 0x10;      //0001 0000
    	TH1 = 0x4b;        //铁打的50ms
    	TL1 = 0xfd;
    }
    void DigDisplay(unsigned char miao)
    {
    	LA=1;LB=1;LC=1;        //8动态显示函数
    	P0 = smgduan[miao];
    	delay(5);
    	
    	LA=0;LB=1;LC=1;       //6
    	P0 = smgduan[miao/10];
    	delay(5);
    }
    void main()
    {	
    	unsigned char text=0;
    	timefrist0();    //中断0与1的初始定义
    	timefrist1();
    	LED = 0;
    	while(1)
    	{	
    		if(TF1 == 1)  //定时器0溢出,50ms过
    		{
    			TF1 = 0;
    			TH1 = 0x4b;
    	        TL1 = 0xfd;
    			text++;
    			if(text==10)  //经过 0.5s
    			{
    				text = 0;
    				LED = ~LED;   //变化一次,形成电压给P3.4
    			}
    		}
        DigDisplay(TL0);    //上面动作很快,动态显示一直在执行
    	}
    }
    
    展开全文
  • 以下两个程序效果相同,一个使用...两个外中断跑马灯汇编语言程序ORG 0000HLJMP MAINORG 0003HLJMP WZD0ORG 0013HLJMP WZD1ORG 0040HWZD0: MOV DPTR,#0220HMOV R3,#42DCB0: CLR AMOVC A,@A+DPTRMOV P1,AINC DPTRL...

    以下两个程序效果相同,一个使用汇编语言,一个使用C语言,从仿真效果看,c语言程序运行比较流畅。

    两个外中断跑马灯汇编语言程序

    ORG 0000H

    LJMP MAIN

    ORG 0003H

    LJMP WZD0

    ORG 0013H

    LJMP WZD1

    ORG 0040H

    WZD0: MOV DPTR,#0220H

    MOV R3,#42D

    CB0:    CLR A

    MOVC A,@A+DPTR

    MOV P1,A

    INC DPTR

    LCALL DELAY2

    DJNZ R3,CB0

    RETI

    WZD1: MOV DPTR,#0220H

    MOV R3,#42D

    CB1:  CLR A

    MOVC A,@A+DPTR

    MOV P2,A

    INC DPTR

    LCALL DELAY1

    DJNZ R3,CB1

    RETI

    ORG 0150H

    MAIN: MOV P1,#00H

    MOV P2,#00H

    SETB EA

    SETB IT0

    SETB EX0

    CLR PX0

    SETB IT1

    SETB EX1

    SETB PX1

    ST:    MOV DPTR,#0270H

    MOV R4,#17D

    DD:   CLR A

    MOVC A,@A+DPTR

    MOV P0,A

    INC DPTR

    LCALL DELAY1

    DJNZ R4,DD

    SJMP ST

    DELAY1: MOV R7,#00H

    DD1: MOV R6,#00H

    DD2: MOV R5,#01H

    DJNZ R5,$

    DJNZ R6,DD2

    DJNZ R7,DD1

    RET

    DELAY2: MOV R7,#00H

    DDD1: MOV R6,#00H

    DJNZ R6,$

    DJNZ R7,DDD1

    RET

    ORG 0220H

    DB 0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80

    DB 0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01

    DB 0x18,0x24,0x42,0x81,0x00,0x81,0x42,0x24,0x18

    DB 0x18,0x24,0x42,0x81,0x00,0x81,0x42,0x24,0x18

    DB 0x18,0x00,0x3c,0x00,0x7e,0x00,0xff,0x00

    ORG 0270H

    DB  0xfe,0xfc,0xf8,0xe0,0xe0,0xc0,0x80,0x00

    DB  0x01,0x03,0x07,0x0f,0x1f,0x3f,0x7f,0xff, 0x00

    END

    4687b2770018776d391448700d6810ce.png 

    两个外中断跑马灯C语言程序

    #include

    int code yu[]={

    0x00,0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,

    0x00,0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01,

    0x00,0x18,0x24,0x42,0x81,0x00,0x81,0x42,0x24,0x18,

    0x00,0x18,0x24,0x42,0x81,0x00,0x81,0x42,0x24,0x18,

    0x00,0x18,0x00,0x3c,0x00,0x7e,0x00,0xff,0x00,0x00,

    0x00     };

    int code yu1[]={

    0xfe,0xfc,0xf8,0xe0,0xe0,0xc0,0x80,0x00,

    0x01,0x03,0x07,0x0f,0x1f,0x3f,0x7f,0xff,

    0x00};

    void delay(int ms)

    {

    while(ms--)

    {

    int i;

    for(i=0;i<120;i++);

    }

    }

    void ddd() interrupt 0

    {

    int k;

    for(k=0;k<47;k++)

    {

    P2=yu[k];

    delay(100);

    }

    }

    void dd() interrupt 1

    {

    int k;

    for(k=0;k<48;k++)

    {

    P1=yu[k];

    delay(300);

    }

    P1=0x00;

    }

    void main()

    {

    int n;

    IT0=0;

    EX0=1;

    PX0=1;

    IT1=0;

    EX1=1;

    PX1=0;

    EA=1;

    P1=0x00;

    P2=0x00;

    while(1)

    {

    for(n=0;n<17;n++)

    {

    P0=yu1[n];

    delay(100);

    }

    }

    展开全文
  • 中断和中断处理流程

    千次阅读 2020-12-20 04:41:20
    1. 中断概念中断是指由于接收到来自外围硬件(相对于中央处理器内存)的异步信号或来自软件的同步信号,而进行相应的硬件/软件处理。发出这样的信号称为进行中断请求(interrupt request,IRQ)。硬件中断导致处理器...

    1. 中断概念

    中断是指由于接收到来自外围硬件(相对于中央处理器和内存)的异步信号或来自软件的同步信号,而进行相应的硬件/软件处理。发出这样的信号称为进行中断请求(interrupt request,IRQ)。硬件中断导致处理器通过一个上下文切换(context switch)来保存执行状态(以程序计数器和程序状态字等寄存器信息为主);软件中断则通常作为CPU指令集中的一个指令,以可编程的方式直接指示这种上下文切换,并将处理导向一段中断处理代码。中断在计算机多任务处理,尤其是实时系统中尤为有用。这样的系统,包括运行于其上的操作系统,也被称为“中断驱动的”(interrupt-driven)。

    中断是一种使CPU中止正在执行的程序而转去处理特殊事件的操作,这些引起中断的事件称为中断源,它们可能是来自外设的输入输出请求,也可能是计算机的一些异常事故或其它内部原因。

    中断:在运行一个程序的过程中,断续地以“插入”方式执行一些完成特定处理功能的程序段,这种处理方式称为中断。

    2. 中断的作用

    并行操作

    硬件故障报警与处理

    支持多道程序并发运行,提高计算机系统的运行效率

    支持实时处理功能

    3. 术语

    按中断源进行分类:发出中断请求的设备称为中断源。按中断源的不同,中断可分为

    内中断:即程序运行错误引起的中断

    外中断:即由外部设备、接口卡引起的中断

    软件中断:由写在程序中的语句引起的中断程序的执行,称为软件中断

    允许/禁止(开/关)中断: CPU通过指令限制某些设备发出中断请求,称为屏蔽中断。从CPU要不要接收中断即能不能限制某些中断发生的角度 ,中断可分为

    可屏蔽中断 :可被CPU通过指令限制某些设备发出中断请求的中断, 那是不是意味着进中断时disable整个中断,其实disable的都是可屏蔽中断?

    不可屏蔽中断:不允许屏蔽的中断如电源掉电

    中断允许触发器:在CPU内部设置一个中断允许触发器,只有该触发器置“1”,才允许中断;置“0”,不允许中断。

    指令系统中,开中断指令,使中断触发器置“1”

    关中断指令,使中断触发器置“0”

    中断优先级:为了管理众多的中断请求,需要按每个(类)中断处理的急迫程度,对中断进行分级管理,称其为中断优先级。在有多个中断请求时,总是响应与处理优先级高的设备的中断请求。

    中断嵌套:当CPU正在处理优先级较低的一个中断,又来了优先级更高的一个中断请求,则CPU先停止低优先级的中断处理过程,去响应优先级更高的中断请求,在优先级更高的中断处理完成之后,再继续处理低优先级的中断,这种情况称为中断嵌套。

    Intel的官方文档里将中断和异常理解为两种中断当前程序执行的不同机制。这是中断和异常的共同点。不同点在于:

    中断(interrupt)是异步的事件,典型的比如由I/O设备触发;异常(exception)是同步的事件,典型的比如处理器执行某条指令时发现出错了等等。

    中断又可以分为可屏蔽中断和非可屏蔽中断,异常又分为故障、陷阱和异常中止3种,它们的具体区别很多书籍和官方文档都解释的比较清楚这里不再赘述。

    关于它们的区别有两点是需要注意的:

    平常所说的屏蔽中断是不包括异常的,即异常不会因为CPU的IF位被清(关中断,指令:cli)而受影响,比如缺页异常,即使关了中断也会触发CPU的处理,回答了我上面红色部分疑问。

    通常说的int 80h这种系统调用使用的中断方式实际上硬件上是理解为异常处理的,因此也不会被屏蔽掉,这也很好理解,int 80h这种中断方式是程序里主动触发的,对于CPU来说属于同步事件,因此也就属于异常的范畴。

    4. 中断(异常)处理过程

    需要明确的一点是CPU对于中断和异常的具体处理机制本质上是完全一致的,即:

    当CPU收到中断或者异常的信号时,它会暂停执行当前的程序或任务,通过一定的机制跳转到负责处理这个信号的相关处理程序中,在完成对这个信号的处理后再跳回到刚才被打断的程序或任务中。这里只描述保护模式下的处理过程,搞清楚了保护模式下的处理过程(更复杂),实模式下的处理机制也就容易理解了。

    具体的处理过程如下:

    1)  中断响应的事前准备:

    系统要想能够应对各种不同的中断信号,总的来看就是需要知道每种信号应该由哪个中断服务程序负责以及这些中断服务程序具体是如何工作的。系统只有事前对这两件事都知道得很清楚,才能正确地响应各种中断信号和异常。

    系统将所有的中断信号统一进行了编号(一共256个:0~255),这个号称为中断向量,具体哪个中断向量表示哪种中断有的是规定好的,也有的是在给定范围内自行设定的。  中断向量和中断服务程序的对应关系主要是由IDT(中断向量表)负责。操作系统在IDT中设置好各种中断向量对应的中断描述符(一共有三类中断门描述符:任务门、中断门和陷阱门),留待CPU查询使用。而IDT本身的位置是由idtr保存的,当然这个地址也是由OS填充的。

    中断服务程序具体负责处理中断(异常)的代码是由软件,也就是操作系统实现的,这部分代码属于操作系统内核代码。也就是说从CPU检测中断信号到加载中断服务程序以及从中断服务程序中恢复执行被暂停的程序,这个流程基本上是硬件确定下来的,而具体的中断向量和服务程序的对应关系设置和中断服务程序的内容是由操作系统确定的。

    2) CPU检查是否有中断/异常信号

    CPU在执行完当前程序的每一条指令后,都会去确认在执行刚才的指令过程中中断控制器(如:8259A)是否发送中断请求过来,如果有那么CPU就会在相应的时钟脉冲到来时从总线上读取中断请求对应的中断向量[2]。

    对于异常和系统调用那样的软中断,因为中断向量是直接给出的,所以和通过IRQ(中断请求)线发送的硬件中断请求不同,不会再专门去取其对应的中断向量。

    3) 根据中断向量到IDT表中取得处理这个向量的中断程序的段选择符

    CPU根据得到的中断向量到IDT表里找到该向量对应的中断描述符,中断描述符里保存着中断服务程序的段选择符。

    4) 根据取得的段选择符到GDT中找相应的段描述符

    CPU使用IDT查到的中断服务程序的段选择符从GDT中取得相应的段描述符,段描述符里保存了中断服务程序的段基址和属性信息,此时CPU就得到了中断服务程序的起始地址。这里,CPU会根据当前cs寄存器里的CPL和GDT的段描述符的DPL,以确保中断服务程序是高于当前程序的,如果这次中断是编程异常(如:int 80h系统调用),那么还要检查CPL和IDT表中中断描述符的DPL,以保证当前程序有权限使用中断服务程序,这可以避免用户应用程序访问特殊的陷阱门和中断门[3]。

    5) CPU根据特权级的判断设定即将运行的中断服务程序要使用的栈的地址

    CPU会根据CPL和中断服务程序段描述符的DPL信息确认是否发生了特权级的转换,比如当前程序正运行在用户态,而中断程序是运行在内核态的,则意味着发生了特权级的转换,这时CPU会从当前程序的TSS信息(该信息在内存中的首地址存在TR寄存器中)里取得该程序的内核栈地址,即包括ss和esp的值,并立即将系统当前使用的栈切换成新的栈。这个栈就是即将运行的中断服务程序要使用的栈。紧接着就将当前程序使用的ss,esp压到新栈中保存起来。也就说比如当前在某个函数中,使用的栈,在中断发生时,需要切换新的栈。

    6) 保护当前程序的现场

    CPU开始利用栈保护被暂停执行的程序的现场:依次压入当前程序使用的eflags,cs,eip,errorCode(如果是有错误码的异常)信息。

    官方文档[1]给出的栈变化的示意图如下:

    7) 跳转到中断服务程序的第一条指令开始执行

    CPU利用中断服务程序的段描述符将其第一条指令的地址加载到cs和eip寄存器中,开始执行中断服务程序。这意味着先前的程序被暂停执行,中断服务程序正式开始工作。

    8) 中断服务程序处理完毕,恢复执行先前中断的程序

    在每个中断服务程序的最后,必须有中断完成返回先前程序的指令,这就是iret(或iretd)。程序执行这条返回指令时,会从栈里弹出先前保存的被暂停程序的现场信息,即eflags,cs,eip重新开始执行。

    展开全文
  • 那么,什么是单片机中断,它与CPU的轮询有什么区别?在本文中,英锐恩单片机开发工程师将对单片机中断和CPU轮询做个简单的介绍。中断中断是一种硬件机制,在这种机制中,设备会通知CPU它需要引起注意。中断可以...
  • 中断:1. 硬中断是由硬件产生的,比如,像磁盘,网卡,键盘,时钟等。每个设备或设备集都有它自己的IRQ(中断请求)。基于IRQ,CPU可以将相应的请求分发到对应的硬件驱动上(注:硬件驱动通常是内核中的一个子程序,...
  • 1、简介 2、中断处理 3、软中断
  • 本专栏内容经修订后,已在豆瓣阅读集结成书出版:...前面几课讲解了外部中断,现在开始介绍内部中断,往后还会深入 Arduino 的内核来分析内部中断的机制,并做一些很酷的实验。有...
  • 轮询和中断有什么区别 中断:咱们先说中断吧,中断大家都不陌生,什么是中断呢?中断就是由硬件或者软件发出的一种IRQ(中断请求)信号,一旦CPU接受的中断信号,CPU就会暂停执行的当前的工作,并且保留现场,去响应...
  • 中断优先级

    千次阅读 2021-07-25 04:32:43
    为使系统能及时响应并处理发生的所有中断,系统根据引起中断事件的重要性紧迫程度,硬件将中断源分为若干个级别,称作中断优先级。在实际系统中,常常遇到多个中断源同时请求中断的情况,这时CPU必须确定首先为哪...
  • 中断和异常的区别

    2021-09-11 11:50:43
    中断 由CPU以外的事件引起的中断 如:I/O中断,时钟中断,控制台中断 异常 来自CPU内部事件或程序执行中的事件引起的过程 如:硬件故障中断 典型异常:程序性中断,访管指令异常 程序性中断:算术溢出,被零除,虚拟...
  • 中断和异常

    2021-01-06 12:36:58
    中断异常.md ## 中断异常的定义 中断(interrupt)指在程序执行过程中遇到急需处理的事件时,暂时中止现行程序在 ...只不过是看待它的视角不同进行人为划分,后续会说明异常和中断区别. ## 为什么需要中断/异.
  • 展开全部中断程序是在中断事件发生时调用,程序也不知道什62616964757a686964616fe59b9ee7ad9431333365643536么时候有中断事件发生。子程序是在需要的时候调用,在程序里可以预见它的使用。因为中断是由系统调用的,...
  • 中断和DMA的区别

    2021-11-26 15:24:05
    1、DMA:是一种无须CPU的参与就可以让外设与系统内存之间进行双向数据传输...所以中断和DMA的区别就是DMA不需要CPU参与而中断是需要CPU参与的 中断注册函数和中断注销函数 注册中断: int request_irq(unsigned init ir
  • 中断系统8.1 中断的基本概念8.1.1 中断概念的引入及描述中断方式示意(以输入中断为例)**中断**的定义8.1.2 中断源及中断分类中断的分类...中断响应处理过程中断向量的引导作用中断服务子程序的结构8.2 多级中断管理1....
  • 中断和中断

    2021-08-31 21:41:19
    本文介绍了中断的分类,以Linux系统为例,介绍了操作系统的硬中断和中断的实现机制。
  • SBUF是像是李信,光信和暗信是一个英雄,但是有不同的技能外观。
  • 在计算机中,中断是处理器与异步事件进行信息交换(通信)的唯一手段。所谓异步事件,就是与当前正在做的事情在逻辑上无关的事件。例如,正当老师上课的过程中突然发生了地震,那么地震这个事件就是一个异步事件。因为...
  • 中断响应优先级和中断处理优先级的区别 中断响应优先级是由硬件排队线路或中断查询程序的查询顺序决定的,不可动态改变; 而中断优先级可以由中断屏蔽字来改变,反映的是正在处理的中断是否比新发生的中断的处理...
  • 采用外中断进行的计数清零控制

    千次阅读 2021-03-22 10:37:00
    } } } 上述中断中的防抖回弹判断很重要哦,有助于保证中断次数与按键按下的次数一致。 2、K2为功能选择键。那么我们就用K2_counter来记录K2对应的功能(清零/加一/暂停)。功能分配如下: void Function...
  • 1、ESP8266 中断 中断对于在微控制器程序中使事情自动发生非常有用,并且可以帮助...调用 attachInterrupt() 创建中断,并将 GPIO 中断引脚、ISR(要调用的函数)mode(模式)作为参数传递。ISR 函数必须声明 ICACH
  • 汇编中的外中断

    2021-05-20 15:35:07
    前面的博客,我介绍了CPU中的内中断以及int指令,还有就是端口的读写,今天我们来介绍外中断。 2.本篇博客的概述 3.中端 CPU在计算机系统中,除了能够执行指令,进行运算以外,还应该能够对外部设备进行控制,...
  • 从本质上来讲,中断是一种电信号,当设备有某种事件发生时,它就会产生中断,通过总线把电信号发送给中断控制器。 如果中断的线是激活的,中断控制器就把电信号发送给处理器的某个特定引脚。处理器于是立即停止自己...
  • 根据具体的内容将中断分为两个部分:上半部分(中断处理程序)下半部分(推后处理程序)。上半部分需要立即执行,并且有严格的时间限制,这些工作是在所有中断被禁止的情况下完成的,剩余部分工作推迟到下半部分。下半...
  • 目录1 esp32 series的中断控制器2 基于riscvxtensa的芯片中断模块的区别3 使用esp32 series的中断3.1 中断的配置3.2 中断的处理3.2 中断的清除 1 esp32 series的中断控制器 一些中断控制器固定了中断连线不同,...
  • 汇编外中断

    2021-07-26 22:55:24
    外中断接口芯片端口外中断信息PC机键盘的处理过程 CPU在计算机系统中,除了能够执行指令,进行运算之外,还应该能够对外部设备进行控制,接收它们的输入,向它们进行输出 要及时处理外设的输入,显然需要解决两个...
  • 目录 源码 EXTI.c EXTI.h main.c 实验现象 普中51-单核-A2 STC89C52 Keil uVision V5.29.0.0 PK51 Prof.Developers Kit Version:9.60.0.0 源码 stdint.h见【51单片机快速入门指南】1:基础知识工程创建 中断知识见...
  • 外部中断常用库函数 外部中断的一般配置步骤 实验代码
  • 什么是下半部中断是一个很霸道的东西,处理器一旦接收到中断,就会打断正在执行的代码,调用中断...基于上面的原因,内核将整个的中断处理流程分为了上半部下半部。上半部就是之前所说的中断处理函数,它能最快...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,030,203
精华内容 412,081
关键字:

外中断和内中断的区别