精华内容
下载资源
问答
  • 中断服务程序中至少有一条
    千次阅读
    2018-10-24 13:06:16

    一、软件法

      1.轮转法

        p0 进程:
              while(turn != 0);		//进入区
              critical section ; 		//临界区
              turn = 1;                       //退出区
              remainder section;   //剩余区
        p1进程:
                while(turn != 1);           //进入区
                critical section;            //临界区
                turn = 0;                      //退出区
                remainder section;     //剩余区
    --------------------- 
    作者:李永贵 
    来源:CSDN 
    原文:https://blog.csdn.net/lierming__/article/details/78974244 
    版权声明:本文为博主原创文章,转载请附上博文链接!
    

      2.标志法
      3.Perterson算法

      Pi 进程:
           flag[i] = TRUE; turn = j;             //进入区
           while(flag[j] && turn == j);        //进入区
           critical section;                            //临界区
           flag[i] = FALSE ;                         //退出区
           remainder section;                    //剩余区
      Pj 进程:
           flag[j] = TRUE; turn = i;             //进入区 
           while(flag[i] && turn == i);        //进入区
           critical section;                             //临界区
           flag[j] = FALSE;                         //退出区
           remainder section;                     //剩余区
    --------------------- 
    作者:李永贵 
    来源:CSDN 
    原文:https://blog.csdn.net/lierming__/article/details/78974244 
    版权声明:本文为博主原创文章,转载请附上博文链接!
    

        软件方法看似从逻辑上实现了互斥,但隐含条件是对共享标志变量的写和读需要在一条指令内完成,否则对标志的访问本身就会造成错误。例如,在Perterson算法中,若CPU为8位,turn为16位变量,则对标志变量的存取至少需要2条指令,如果一个任务先对turn写了低8位,然后切换到另一个任务完整的写了turn,再切换回去写了高8位,那么turn的值是无法预测的。
        所以所谓软件方法要完全实现保护,也是需要和硬件特性相关的,实际上用汇编实现才能绝对正确。个人觉得完全不如下面的硬件法。

    二、硬件法

      1.利用硬件原子指令
      2.关闭中断
      3.关闭任务调度
      4.利用信号量
    (3和4实际上是有操作系统时,操作系统用其他方法实现的封装)

    三、方法总结

      1.单片机裸机编程
        在单片机裸机编程时,出现的情况常常是在中断中获取数据,然后在后台循环中进行数据处理,我思考得到的方法伪代码如下:

    //主函数
    void main()
    {
    	while(1)
    	{
    		...
    		intClose();			//关中断
    		if(flag==true)		//标志为真
    		{
    			...	  //处理数据(操作尽量少,一般只是把数据移到局部变量中)
    			flag=false;
    		}
    		intOpen();			//开中断
    		...
    	}
    }
    //中断处理函数
    void interrupt()
    {
    //加上判断时若数据未处理则不再接收,可不加判断使数据未处理时接收新数据覆盖
    	if(flag==false)	
    	{
    		...	  //接收数据
    		flag=true;
    	}
    }
    

    (仅为示例,实际当中可使用环形缓冲区)

      2.操作系统编程
        在操作系统上编程主要使用信号量,我想到的信号量PV操作可以用如下伪代码实现

    void P(sem)
    {
    	int temp;
    	intClose();		//关中断
    	sem--;			//信号量减一
    	temp = sem;		//用局部变量保存信号量
    	intOpen();		//开中断
    	if(temp < 0)
    	{
    		sleep();		//阻塞自身进程
    	}
    }
    void V(sem)
    {
    	int temp;
    	intClose();		//关中断
    	sem++;			//信号量加一
    	temp = sem;		//用局部变量保存信号量
    	intOpen();		//开中断
    	if(temp <= 0)
    	{
    		wake();		//从阻塞序列中唤醒进程
    	}
    }
    
    

        信号量可以实现共享资源的保护(线程锁)和任务同步,使用时应该遵循一定规则避免程序长时间非正常阻塞,通常是锁操作在同步操作的内部,伪代码如下:

    datatype data;     //共享变量
    void taskSend()   //发送任务
    {  
    	datatype  buff;
    	while(1)
    	{
    		 .......                //操作
    		 pthread_mutex_lock();
    		 data = buff;
    		 pthread_mutex_unlock();
    		 sem_post();
         }
    }
    void taskReceive()   //接收任务
    {  
    	datatype  buff;
    	while(1)
    	{
    		 sem_wait();
    		 pthread_mutex_lock();
    		 buff = data;
    		 pthread_mutex_unlock();
    		 .......                //操作
          }
    }
    

      其中,如果data缓存大小比每次需要传输的大,就可以不用加锁。

    笔记:操作缓冲区是否关中断的问题:
        通信速率低时:例如比特率9600时,每次关中断的时间一般不会超过1ms,因此不会漏掉数据,这时关中断最严谨
        通信速率高时:例如比特率115200时,每个字节发送时间大约100us,关中断时间大于这个时间就容易丢数据,因此不关中断,但不确定会不会产生错误
        rs485半双工发送数据时必须等待发送完成(无论是上位机还是下位机)

        记录:自己总结基于裸机编程的串口驱动通过环形队列实现,中断和普通程序中都得共享队列,如果直接关中断因为操作队列函数不短可能造成接收数据漏掉。想法是通过关中断实现简单互斥量(关中断时间很短),普通程序里先锁互斥量,再操作队列;中断程序里先判断是否锁,如果锁了将数据接收到中断独占的缓冲区然后返回,否则先将中断独占缓冲区里留存的数据(如果有)全部移到环形队列里再加上本次接收的数据完成接收。(中断发送时同理,只是中断中改成如果锁就不取发送队列里的数据发送)
    这样干可能最后收到的数据在独占缓冲里,还是只有间歇开关中断或只在关键处关

        最后决定,中断接收里用的环形队列还是自己简单实现吧,可以严格控中断开关
        第一种,根据读写位置求得已存数据数量,开始要取另一方位置时有隐患,但一般取位置只需一条汇编指令,所以可以认为安全,最后修改自己位置时最后放回是一般也只要一条指令,所以安全。
        第二种,根据count知道已存数据数量,开始判断时其中取count一般一条指令,安全。最后放回count一般也一条指令,安全。
    以上实现对关键量的操作顺序不能变
        环形队列的线程安全性:写程序使用时在单消费者单生产者是可以认为安全。自己写中断接收发送驱动时最好在关键位置关中断。
        在不溢出覆盖的环形队列里,为保证在一个生产者一个消费者的情况下(包括其中一个是中断),只需在开始关中断将count放到局部变量中为后面利用,最后关中断改变count的值即可(顺序不能变)。多个生产消费者情况下有多个的一方(必须是在用户程序中)要加互斥量(在抢占调度的操作系统中需要,时间触发轮转里不需要)。中断里的一方必须是唯一的

    (以上内容均为自己思考所得,如有错误和疏漏,感谢大家指正)

    更多相关内容
  • 51单片机中断系统程序实例 (STC89C52RC)51单片机中断,在程序设计就可以做到,在做某件事的过程,停下来先去响应中断,做别的事情,做好别的事情再继续原来的事情。中断优先级是可以给要做的事情排序。...

    51单片机中断系统程序实例 (STC89C52RC)

    51单片机有了中断,在程序设计中就可以做到,在做某件事的过程中,停下来先去响应中断,做别的事情,做好别的事情再继续原来的事情。中断优先级是可以给要做的事情排序。

    单片机的学习不难,只要掌握学习方法,学起来并不难。什么是好的学习方法呢,一定要掌握二个要点:

    1. 要知道寄存器的英文全拼,比如IE = interrupt中断

    不知道全拼,要去猜,去查。这样就可以理解为什么是这个名称,理解了以后就不用记忆了。

    2. 每个知识点要有形像的出处

    比如看到TF0,脑子里马上要形像地定位到TCON寄存器的某位

    看到ET0, 马上要形像地定位到IE寄存器的第2位

    51hei独家揭秘: 形像是记忆的最大技巧。当人眼看到某个图时,是把视觉信号转化成电信号,再转化成人能理解的形像。当我们回忆形像时,就是在重新检索原先那个视觉信号,并放大。在学习过程中,不断练习检索、放大信号,我们的学习能力就会越来越强。

    写程序代码时,也要把尽量把每行代码形像化。

    51单片机内中断源

    8051有五个中断源,有两个优先级。与中断系统有关的特殊功能寄存器有IE(中断允许寄存器)、IP(中断优先级控制寄存器)、中断源控制寄存器(如TCON、SCON的有关位)。51单片机的中断系统结构如下图(注意,IF0应为TF0):

    150992ac72e50fa5bfa6b1c52da6dd8d.png

    8052有6个中断源,它比8051多一个定时器/计数器T2中断源。

    8051五个中断源分别是:

    (1)51单片机外部中断源

    8051有两个外部中断源,分别是INT0和INT1,分别从P3.2和P3.3两个引脚引入中断请求信号,两个中断源的中断触发允许由TCON的低4位控制,TCON的高4位控制运行和溢出标志。

    INT0 也就是Interrupt 0。在这里应该看一下你的51单片机开发板的电路原理图。离开形像的记忆是没有意义的。读到上面这句,你应该回忆起原理图上的连接。任何记忆都转化为形 像,这是学习的根本原理,我们通过学习单片机要学会这种学习方法,会让你一辈子受益无穷。

    TCON的结构如下图:

    010e0c89ed438c3ed2c84d5ce6fd2cfb.png

    (a)定时器T0的运行控制位TR0

    TR0由软件置位或者清0。当门控位GATE=0时,TO计数器仅由TR0控制,TR0=1启动计数,TR0=0时停止。当门控位GATE=1时,T0计数器由INT0和TR0共同控制,当INT0=1且TR0=1时启动T0计数器。

    (b)定时器T0溢出标志位TF0

    当T0溢出时TF0=1,并向CPU申请中断,CPU响应中断后由硬件将TF0清0,也可以由软件查询方式将TF0清0。

    c)定时器T1的运行控制位TR1

    功能同TR0。

    (d)定时器T1溢出标志为TF1

    功能同TF1。

    (e)外部中断源1(INT1、P3.3)中断请求标志IE1

    IE1=1时外部中断源1正在向CPU请求中断,当CPU响应该中断时由硬件将IE1清0(下降沿触发方式)。

    (f)外部中断源1触发方式选择位IT1

    IT1=0时外部中断源1选择电平触发方式,当输入低电平时置位IE1;IT1=1时外部中断源1选择下降沿触发方式,当中断源由高电平变低电平时置位 IE1,向CPU请求中断。

    (g)外部中断源0(INT0、P3.2)中断请求标志IE0

    功能类同IE1。

    (h)外部中断源0触发方式选择位IT0

    功能类同IT1。

    CPU在每个机器周期采样INT0和INT1引脚的输入电平。

    i、电平触发方式

    当CPU采样到低电平时,置位IE0和IE1,采样到高电平时,将IE0和IE1清零。在电平触发方式下,外部中断源必须一直保持低电平(至少保持1个以 上的机器周期)直到CPU响应中断请求,否则中断请求将丢失,同时在中断处理程序结束之前必须,外部中断源必须变为高电平,否则将产生另一次中断。

    ii、下降沿触发方式

    CPU 每个机器周期采样中断输入引脚,如果相续的两次采样,第一次是高电平,第二次是低电平,则置位相应的IE,响应中断后,硬件自动将IE清0。采样下降沿触 发方式,中断源的高、低电平都必须保持12个振荡周期(即1个机器周期)以上,这样CPU才能有效检测到下降沿,并引发CPU中断。

    (2)51单片机内部中断源

    8051有3个内部中断源,分别是定时器T0、T1和串行口中断。8052增加了一个T2定时器中断。

    2、51单片机中断使能控制

    中断的允许和禁止由中断使能控制寄存器IE控制,其字节地址为0A8H,可以位寻址,其结构如下图所示:

    06bde8ebf2b57d7231f02a17bf829db0.png

    EX0:外部中断0中断允许位;

    ET0:定时器/计数器T0中断允许位;

    EX1:外部中断1中断允许位;

    ET1:定时器/计数器T1中断允许位;

    ES:串行口中断允许位;

    ET2:定时器/计数器T2中断允许位;(只要8052具有)

    EA:CPU中断总允许位,EA=1时所有的中断开放,EA=0时禁止所有的中断。

    3、51单片机中断优先级

    51有两个优先级:高、低。通过IP(中断优先级寄存器)来设置优先级,其字节地址为0B8H,可位寻址,其结构如下图:

    7e8d28695b4f7d078e8331a766169561.png

    IP中各位值为0时表示低优先级中断,为1时表示高优先级中断。CPU复位后IP=0。

    高优先级中断可以中断低优先级中断,同优先级中断不能相互中断。当CPU同时接到同优先级的几个中断请求时,CPU按照如下硬件顺序进行中断响应:

    9e9aa364654cb1fe3e193cf35326b3c4.png

    4、51单片机中断请求的撤除

    CPU响应中断请求,执行中断服务程序,但在中断返回指令(RETI)之前必须撤除中断信号,否则将可能再次引起中断而发生错误。

    中断请求撤销的方法有三种:

    a、单片机内部硬件自动复位:对于定时器/计数器T0、T1及采用边沿触发方式的外部中断请求,CPU在响应中断后,由内部硬件自动撤销中断请求;

    b、应用软件清除响应标志:对串口发送/接收中断请求及定时器T2的溢出和捕获中断请求,CPU响应中断后,内部无硬件自动复位RI、TI、TF2及EXF2,必须在中断服务程序中清除这些标志,才能撤除中断;

    c、既无软件清除也无硬件撤除:对于采用电平方式的外部中断请求,CPU对引脚上的中断请求信号既无控制能力,也无应答信号,为保障CPU响应中断请求中断后,执行返回指令前撤除中断请求,必须考虑另外的措施。

    5、51单片机中断响应过程

    51 单片机在每个机器周期的S5P2状态顺序检查每个中断源的中断请求标志,若有中断源发送中断请求,CPU在下个机器周期的S5P2状态按优先级顺序查询各 中断标志,并且取高优先级的中断进行响应。响应中断后置位相应的中断优先级状态触发器,标明当前中断服务的优先级别,执行硬件调用程序,将程序计数器PC 的内容压入堆栈进行保护。对于中断源的中断入口地址装入程序计数器PC,使程序转入该中断入口处执行中断服务程序,直到遇到RETI指令。执行RETI指 令,撤销中断优先级触发器,弹出断点地址至程序计数器PC,继续源程序的执行过程。

    在接收中断申请时,如遇到下列情况之一,硬件调用子程序将被封锁:

    a、正在执行同级或高一级的中断服务程序;

    b、当前指令周期不是该指令的最后一个周期(或一条指令未执行完);

    c、当前正在执行的指令是RETI或对IE、IP的读写操作。

    6、中断入口地址

    各中断源的中断入口地址为:

    5e9e197df4fda08686c1c25daf2ecec9.png

    STC86C52RC 51单片机中断示例程序

    #include

    typedef unsigned char         uint8;

    typedef unsigned int          uint16;

    typedef unsigned long          uint32;

    sbit enableG1 = P1^3; sbit enableG2 = P1^4;

    sbit selectC  = P1^2; sbit selectB  = P1^1; sbit selectA  = P1^0;

    code uint16 num16[16] = {         0xC0, 0xF9, 0xA4, 0xB0,

    0x99, 0x92, 0x82, 0xF8,

    0x80, 0x90, 0x88, 0x83,

    0xC6, 0xA1, 0x86, 0x8E        };//共阳数码管真极表

    uint8 num6[6] = {0};//储存秒,0-5对应于个位...10万位上各位上的值

    void enable138(void); //启用138译码器切换IO口

    void refresh_led(void);

    void thtl_init(void);

    void timer1_init(void);

    void et1_init(void);

    void main(void)

    {

    enable138();

    timer1_init();

    et1_init();

    while(1);

    }

    void interrupt_timer1(void) interrupt 3

    {

    static uint16 counter = 0;

    static uint32 sec = 0;

    counter++;

    thtl_init();

    if(counter == 1000)

    {

    counter = 0;

    sec++;

    num6[0] = sec % 10;

    num6[1] = sec/10%10;

    num6[2] = sec/100%10;

    num6[3] = sec/1000%10;

    num6[4] = sec/10000%10;

    num6[5] = sec/100000%10;

    }

    refresh_led();//更新num6数组后再刷新数码管

    }

    void enable138(void) { enableG1 = 1; enableG2 = 0; }

    //刷新数码管,只显示有效值

    void refresh_led(void)

    {

    static uint8 i = 0;

    switch(i)

    {

    case 0: selectC = 0; selectB = 0; selectA = 0; P0 = num16[ num6[0] ]; break;

    case 1: selectC = 0; selectB = 0; selectA = 1; P0 = num6[5] == 0 && num6[4] == 0 && num6[3] == 0 && num6[2] == 0 && num6[1] == 0 ? 0xFF : num16[ num6[1] ]; break;

    case 2: selectC = 0; selectB = 1; selectA = 0; P0 = num6[5] == 0 && num6[4] == 0 && num6[3] == 0 && num6[2] == 0 ? 0xFF : num16[ num6[2] ]; break;

    case 3: selectC = 0; selectB = 1; selectA = 1; P0 = num6[5] == 0 && num6[4] == 0 && num6[3] == 0 ? 0xFF : num16[ num6[3] ]; break;

    case 4: selectC = 1; selectB = 0; selectA = 0; P0 = num6[5] == 0 && num6[4] == 0 ? 0xFF : num16[ num6[4] ]; break;

    case 5: selectC = 1; selectB = 0; selectA = 1; P0 = num6[5] == 0 ? 0xFF : num16[ num6[5] ]; break;

    default: break;

    }

    i = ++i % 6;

    }

    //设置计数器初数值,重用的内容都应该写成独立函数出来方便维护

    void thtl_init(void)

    {

    TH1  = (65536 - 922) / 256;

    TL1  = (65536 - 922) % 256;

    }

    void timer1_init(void)

    {

    TMOD |= 0X10;

    TMOD &= 0xDF;

    thtl_init();

    TR1  = 1;

    }

    void et1_init(void) { ET1 = 1; EA  = 1; }

    展开全文
  • 中断时计算机科学最基本、也是十分重要的个概念,可以说没有中断概念的引入和应用就不会今天的计算机,至少不会搞效率的计算机。 、基本概念 二、BIOS中断服务 三、DOS中断服务 四、中断处理技术 五、...

     中断时计算机科学中最基本、也是十分重要的一个概念,可以说没有中断概念的引入和应用就不会有今天的计算机,至少不会有搞效率的计算机。

    • 一、基本概念
    • 二、BIOS中断服务
    • 三、DOS中断服务
    • 四、中断处理技术
    • 五、中断处理程序实例

    一、中断:
    定义:中断就是使CPU暂时挂起当前正在进行的工作并转向某紧急事件的服务与处理程序(该服务与处理程序称为中断服务程序),在执行完中断服务程序后再返回到被中止的原有工作处的过程。
    中断分类:中断按其产生的方式可分为硬件中断和软件中断。硬件中断又分为内部和外部两种。


    二、内部硬件中断

    一个字节即一共256个中断,00H~FFH。
    定义:内部硬件中断是由某些特殊的指令触发的,例如单步中断、除法出错中断。通常我们所说的硬件中断即指内部硬件中断。
    硬件中断举例:在使用DEBUG调试程序时我们经常使用T命令和P命令,而T命令和P命令的执行恰好正是利用了内部硬件中断。

    • (1)INT 00H:除法错误中断。
    • (2)INT 01H:单步中断,由T命令产生。
      • 它的特征是将陷阱标志位TF置位,这样当程序运行时,会在每一条指令的后面产生一个单步中断,从而中止指令的继续执行。
    • (3)INT 03H:断点中断,由P命令产生。
      • 与INT 01H类似,但不会跟踪进子程序、中断调用等。
    • (4)INT 04H:溢出中断。
      • 在指令序列中,若上一个指令由于某些特殊原因使溢出标志OF置1,那么当执行溢出中断指令INTO是立即产生中断04H;若OF为0,则INTO不起作用。

    三、外部硬件中断

    定义:外部硬件中断是指从处理器外部的硬件设备中产生并发向处理器的中断。
    分类:分为可屏蔽中断不可屏蔽中断两种。分别由INTR引脚NMI引脚的信号来触发。即有2条外部中断请求线。

    1、可屏蔽中断–INTR
     可以通过设置中断控制器的屏蔽参数来禁止某些指定的中断。
     可屏蔽中断还可以通过指令CLI(关中断)来禁止CPU响应所有的外部中断。
    2、不可屏蔽中断–NMI
     是用来处理一些紧急情况的,如机器掉电等。它不能由用户通过编制软件来屏蔽,一旦CPU接收到NMI引脚上的信号时就必须立即响应,转向NMI的服务程序,硬件将自动完成断点保护及现场保护,且在中断返回时执行一条RETN指令。


    四、软中断

    定义:严格说来,软件中断是内部中断的一种,是由软件引起的非屏蔽型中断。

    1、INT n 指令
     CPU执行INT n指令时,立即产生一个软件中断,中断的类型由指令中的n指明。
    应用:因为指令中可以指定任何的类型号,故此指令可以方便地用来调试为外设编好的中断服务程序。
    2、中断向量表
     中断过程中很关键的一步是要由中断处理程序对因各种原因触发的相应中断进行处理。因此每一个中断都要对应的有一个中断处理程序。对这些中断进行管理的就是中断向量表了。
    (1)中断向量表结构
    中断向量表的长度为1K字节(1024字节),共有256项,每一项4个字节,对应一个中断。也就是说一张表中断最多可对应256个中断(当然,实际上并没有这么多中断,这就为用户自己编制并扩充中断服务程序提供了便利的条件)
     中断向量表在内存中靠前的部分并固定在这个段地址为00H,偏移量为00H~3FFH,即00000H—003FFH的位置。
    中断向量表每项的四个字节存放着该项对应中断的中断处理程序的入口地址。四个字节也就是两个字,高字存放中断处理程序入口地址的段CS,低字存放偏移IP。
    (2)中断服务程序的调用
     中断指令INT n 发出以后,就要到向量表中去找其对应的服务程序的地址。
    n* 4所得到的就是中断INT n 所对应的n号中断的四个字节地址在向量表中的首地址。
     由首地址开始的四个连续字节即两个字中顺序存放着其对应中断服务程序的入口地址的偏移和段地址,然后程序跳到此入口地址,并将控制交给中断服务程序。
    (3)中断向量表的优点

    • 1)便于管理和扩充,就像通过仓库存货单可以找到任何一件存储的物品那样,我们可以通过向量表来找到每一个中断对应的中断服务程序。
    • 2)当用户想要编制和使用自己的中断服务程序时,可以先设置中断向量,以确定该中断在中断向量表中的位置,然后将自己编制的中断服务程序(可以是驻留内存的,也可以是非驻留内存的)的地址返回给它在中断向量表中对应位置的两个字中,至此,用户就可以十分方便地为自己建立一个软中断了。

    例一:保存5号中断入口,然后重置5号中断的入口

    PUSH ES
    MOV AX,3505H  ;取中断向量
    INT 21H
    MOV [OLD_IP],BX ;保存旧的偏移地址
    MOV [OLD_ES],ES ;保存旧的段地址
    POP ES 
    MOV AX,2505H ;重置中断向量
    MOV DX,OFFSET INT05H
    INT 21H

    3、中断类型号的提供
    (1)INT 00H ~ 05H自动提供

    • INT 00H — 除法错误
    • INT 01H — 单步错误
    • INT 02H — 非屏蔽中断NMI
    • INT 03H — 断点中断
    • INT 04H — 溢出中断
    • INT 05H — 屏幕打印(拷屏)中断

    4、软中断的处理过程
     软中断被响应后,CPU进入中断响应周期。CPU将中断类型号乘以4,得到中断向量表的入口地址,并执行一下动作:

    • (1)将标志寄存器压入堆栈。
    • (2)用清中断标志(IF)和单步标志(TF)禁止硬件中断,即关中断。
      • 所以当我们自己编制中断服务程序时,在程序内必要时可以开中断,即打开由硬件自动关闭的中断允许触发器,使之能够响应更高级的中断。
    • (3)将当前代码段寄存器的内容(CS)压栈。
    • (4)将当前指令指针(IP)压栈。
      • 步骤(3)、(4)的目的是要确保中断处理完毕之后能够正确地返回中断调用者。
    • (5)转向中断服务程序入口并将控制交给中断服务程序。

     在中断服务程序执行完后,即CPU接收到IRET指令时,它又将产生以下步骤:

    • (1)弹出IP:从堆栈中将保存的指令指针IP由堆栈弹出到IP中。
    • (2)弹出CS:将保存的段寄存器内容由堆栈弹出到代码段寄存器中。
    • (3)恢复标志寄存器

    5、中断服务程序的编写
     中断服务程序可以按各个设备的要求来加以编制,但一般有:

    • (1)保护现场(入栈)
    • (2)恢复现场(出栈)
    • (3)中断返回(IRET)
      说明:软中断指令非常类似子程序调用的CALL指令(即中断的INT 21H指令),但两者之间还是有明显区别的:
    • (1)软中断全部都是段间的调用,所以在结束时用IRET返回;
    • (2)软中断的IRET指令具有自动恢复断点和标志的功能。

    6、软中断的分类
     一般情况下,目前使用的软中断可分为三大类:

    • (1)BIOS中断 — 10H ~ 1FH(16个)
      • 它主要是提供I/O驱动程序使用,提供了应用程序、DOS与设备的接口功能。用户可以忽略对具体设备硬件上的了解,直接应用这些功能调用完成对具体设备的控制。
    • (2)DOS中断 — 20H ~ 3FH(32个)
      • 目前使用了其中的20H ~ 27H和2FH,其余的为保留中断。
    • (3)自由中断 — 40H ~ FFH(192个)
      • 这类中断是由系统或应用程序设置开发的。可以理解为这类中断是系统或应用程序为了完成特定的功能而扩展出来的中断。可以看得出来,系统给自身和应用程序留下了相当大的余地。这类中断是不定。

    7、软中断的访问
     软中断的访问在不同的环境中有不同的形式,在这里我们仅仅就汇编语言对软中断的访问讨论一下。用汇编语言申请一个标准DOS或BIOS中断是非常简单的,用户程序通过规定的寄存器与中断服务程序之间进行内定的规范的信息交换。大部分的中断处理程序都有一个入口和一个出口,在入口处用寄存器传入规定的数据,在中断请求完毕之后再通过特定的寄存器传递出返回值。

    MOV DL,'A'
    MOV AH,02H
    INT 21H  ;显示一个字符
    展开全文
  • I/O方式 —— 程序中断方式

    万次阅读 多人点赞 2019-09-01 12:06:01
    中断向量:中断服务程序寻址 执行中断服务程序 步骤中断请求 (1)中断请求分类 程序中断方式属于I/O 中断,因此属于外中断。 硬件中断:通过外部的硬件产生的中断。硬件中断属于外中断。 软件中断:...

    一、基本概念


    需要CPU中断自己的任务,转而执行I/O设备与存储器之间的数据传送。

    在这里插入图片描述
    在这里插入图片描述

    二、工作流程


    1. 中断请求:中断源向CPU发送中断请求信号。
    2. 中断判优:多个中断源同时提出请求时,通过中断判优逻辑响应一个中断源。
    3. 中断响应及中断隐指令。
    4. 中断服务程序寻址
    5. 执行中断服务程序
      在这里插入图片描述

    步骤一:中断请求

    (1)中断请求分类

    • 程序中断方式属于I/O 中断,因此属于外中断。

    • 硬件中断:通过外部的硬件产生的中断。硬件中断属于外中断。

    • 软件中断:通过某条指令产生的中断,这种中断是可以变成实现的,软件中断属于内中断。
      在这里插入图片描述

    (2)中断请求标记

    • 每个中断源向CPU发出中断请求的时间是随机的。
    • 为了记录中断事件并区分不同的中断源,中断系统需对每个中断源设置中断请求标记触发器INTR,当其状态为“1”时,表示中断源有请求。以方便CPU知道是哪个硬件发起中断请求
    • 这些触发器可组成中断请求标记寄存器,该寄存器可集中在CPU中,也可分散在各个中断源中。

    在这里插入图片描述

    步骤二:中断判优

    中断判优既可以用硬件实现,也可用软件实现

    一般来说,

    1. 硬件故障中断属于最高级,其次是软件中断;
    2. 非屏蔽中断优于可屏蔽中断;
    3. DMA请求优于I/0设备传送的中断请求;
    4. 高速设备优于低速设备;
    5. 输入设备优于输出设备;
    6. 实时设备优于普通设备。

    (1)硬件实现

    硬件实现是通过硬件排队器实现的,它既可以设置在CPU中,也可以分散在各个中断源中
    在这里插入图片描述

    (2)软件实现

    软件实现是通过查询程序实现的。

    在这里插入图片描述

    步骤三:中断响应(中断隐指令)

    CPU响应中断必须满足以下3个条件:

    1. 中断源有中断请求。
    2. CPU允许中断即开中断。
    3. 一条指令执行完毕,且没有更紧迫的任务。

    (1)外中断

    CPU是在统一的时刻,即每条 指令执行阶段结束前 向接口发出 中断查询信号,以获取 I/O 的中断请求,而在每条 指令执行阶段结束时 向接口发出 CPU中断响应

    (2)内中断

    内中断的发生跟指令的执行有关,因此可以在任意时间段响应内中断。

    (3)工作流程

    1. 关中断。在中断服务程序中,为了保护中断现场(即CPU主要寄存器中的内容)期间不被新的中断所打断,必须关中断,从而保证被中断的程序在中断服务程序执行完毕之后能接着正确地执行下去。
    2. 保存断点。为了保证在中断服务程序执行完毕后能正确地返回到原来的程序,必须将原来程序的断点(即程序计数器(PC)的内容)保存起来。可以存入堆栈,也可以存入指定单元。
    3. 引出中断服务程序。引出中断服务程序的实质就是取出中断服务程序的入口地址并传送给程序计数器(PC)。

    在这里插入图片描述

    步骤四:中断服务程序寻址

    不同的设备有不同的中断服务程序,每个中断服务程序都有一个入口地址,CPU必须找到这个入口地址,即中断向量。
    在这里插入图片描述

    【注1】中断向量是中断服务程序的入口地址,中断向量地址是指中断服务程序的入口地址的地址

    【注2】为什么不直接给出中断向量(入口地址),而是给出中断向量地址,再由中断向量地址找到中断向量?

    answer:中断向量地址可以保持不变,而中断向量可以灵活变动,不受硬件限制。

    步骤五:执行中断服务程序

    在执行中断服务程序的过程中,对于单重中断和多重中断有不同的处理方法

    • 单重中断:执行中断服务程序时不响应新的中断请求。

    • 多重中断:又称中断嵌套,执行中断服务程序时可响应新的中断请求。需要用到中断屏蔽技术

    在这里插入图片描述
    中断屏蔽技术主要用于多重中断,CPU要具备多重中断的功能,须满足下列条件。

    1. 在中断服务程序中提前设置开中断指令。
    2. 优先级别高的中断源有权中断优先级别低的中断源。

    每个中断源都有一个屏蔽触发器,所有屏蔽触发器组合在一起,便构成一个屏蔽字寄存器,屏蔽字寄存器的内容称为屏蔽字。屏蔽字设置有以下规则:

    1. 一般用‘1’表示屏蔽,0’表示正常申请。
    2. 每个中断源对应一个屏蔽字(在处理该中断源的中断服务程序时,屏蔽寄存器中的内容为该中断源对应的屏蔽字)。
    3. 屏蔽字中1’越多,优先级越高。每个屏蔽字中至少有一个’1(至少要能屏蔽自身的中断)。

    在这里插入图片描述

    三、程序中断和调用子程序的区别


    两者的根本区别主要表现在服务时间和服务对象上不一样

    1. 调用子程序过程的时间是已知的;程序中断的时间是随机的
    2. 子程序为主程序服务,两者之间是从属关系;程序中断与主程序没有联系,属于平行关系
    3. 主程序调用子程序的过程完全属于软件处理过程;中断处理程序需要软硬件的结合
    4. 子程序的嵌套由堆栈大小限制,中断嵌套由中断处理优先级(对应中断屏蔽字)限制
    展开全文
  • MCS-51的中断系统

    千次阅读 2020-06-05 09:43:03
    MCS-51单片机内的中断系统主要用于实时测控,即要求单片机能及时地响应和处理单片机外部或内部事件所提出的中断请求。由于这些中断请求都时随机发出的,如果采用定时查询方式来处理这些中断请求,则单片机的工作效率...
  • FIQ与IRQ中断

    千次阅读 2021-02-02 10:50:58
    一般的中断控制器里我们可以配置与控制器相连的某个中断输入是FIQ还是IRQ,所以中断是可以指定为FIQ或者IRQ的,为了合理,要求系统更快响应,自身处理所耗时间也很短的中断设置为FIQ,否则就设置了IRQ。...
  • 【计算机组成原理】CPU中断系统

    千次阅读 2022-02-07 12:51:08
    如定点溢出、浮点溢出、操作码不能识别、除法出现“非法”等,这些都属于由程序设计不周而引起的中断。 (3)硬件故障 如插件接触不良,通风不良、磁表面损坏、电源掉电等,这些都属寸硬发备故障。 (4)I/O设备...
  • CPU中断的工作原理

    千次阅读 2021-07-28 15:17:31
     在使用线程切换及状态管理、异常处理、硬件与处理器的交互、I/O操作等指令时,中断都在默默的服务。  处理器基于硬件封装对外的指令集,底层语言封装指令集提供更加简单的抽象,高级语言基于底层语言赋予程序更...
  • linux内核学习10:中断和异常

    千次阅读 2021-10-12 16:14:54
    中断是指在CPU正常运行期间,由于内外部事件或由程序预先安排的事件引起的 CPU 暂时停止正在运行的程序,转而为该内部或外部事件或预先安排的事件服务程序中去,服务完毕后再返回去继续运行被暂时中断程序。...
  • linux 中断中断处理程序

    千次阅读 2013-07-26 13:59:20
    在linux中中断的使用是无时不在,下面就自己的学习心得和大家分享 一下!
  • linux内核分析--中断中断处理程序

    千次阅读 2014-04-12 12:00:05
    在前面的这篇文章linux内核分析--中断的分类
  • 关于单片机的中断的若干问题

    千次阅读 2020-03-12 22:25:55
    CPU暂时中止当前的工作,转到中断服务处理程序处理所发生的事件。处理完该事件后,再回到原来被中止的地方,继续原来的工作,这称为中断。 CPU处理事件的过程,称为CPU的中断响应过程。 能够实现中断处理功能的...
  • 16年升大三的暑假,一个偶然的机会看到隔壁院的师兄发在群里的一条实习招聘,是武汉富士康招聘软件测试实习生。 暑期岗位,能签实习证明,班车来学校接送,一天还有220工资。我觉得这是个很好的机会,起码富士康...
  • 中断向量表 / 中断描述符表中断程序执行方式 向量中断 非向量中断实模式 - 中断向量表 IVT保护模式 - 中断描述符表 IDT 通过不同的门进行处理中断和异常处理程序的保护 权限检查 中断处理参考资料 广义分类 ...
  • 80C51的中断系统

    千次阅读 2020-09-03 19:52:29
    80C51的中断系统 ... CPU暂时中断当前的工作,转去处理事件B(中断响应和中断服务)。 待CPU将事件B处理完毕后,再回到原来事件A被中断的地方继续处理事件A(中断返回),这过程称为中断。 ...
  • CPU的结构和功能——指令流水及中断系统

    千次阅读 多人点赞 2019-01-01 17:29:31
    分析指令,对指令的操作码部分进行阶码,分析这条指令要完成什么功能,是指令集中哪一条指令 执行指令,CPU的控制器发出各种操作命令,由这些操作命令控制相应的部件去完成指令要求的操作,这些操作命令具有...
  • Cortex-M3异常和中断(NVIC)

    千次阅读 2019-08-20 21:37:49
    Cortex-M3支持大量异常,包括16-4-1=11个系统异常,和最多240个外部中断——简称IRQ。具体使用了这240个中断源中的多少个,则由...作为中断功能的强化,NVIC还有一条NMI输入信号线。NMI究竟被拿去做什么,还要视处...
  • 汇编(五):第个汇编程序

    万次阅读 多人点赞 2021-09-20 20:04:50
    文章目录前言个源程序从写出到执行的过程源程序的主要结构以简化的方式进行汇编和连接 前言   个源程序从写出到执行的过程 个汇编语言程序从写出到最终执行的简要过程: 编写->编译连接->执行 ...
  • 单片机中断问题30例及解决办法

    千次阅读 2019-05-29 13:39:34
    1、单片机外中断INT0为下降沿触发,当中断被触发后cpu执行中断程序,若本次中断的程序还未执行完INT0又来了个相同的下降沿中断信号怎么办?cpu会怎么处理?若是定时器中断呢?串口中断呢?
  • 细说内核中断机制

    千次阅读 2018-05-01 20:25:58
     中断通常分为同步中断和异步中断:2 同步中断是当指令执行时由CPU控制单元产生的,之所以称为同步,是因为只有在一条指令终止执行后CPU才会发出中断。 ◎ 异步中断是由其他硬件设备依照CPU时钟信号随机产生的。...
  • 关于C51的中断函数要注意的几个问题(高手绕行)  最近在虾潭逛,发现一些小虾米对C51中断函数有些不了解,今天周末,抽空发个技术帖子,希望对小虾米有所帮助,如 错误之处,还请指正,就当抛砖引玉吧! ...
  • RISC-V学习笔记【中断和异常】

    千次阅读 2021-04-05 20:15:43
    一般来说由处理器内部的事件或程序执行的事件引起的程序跳转称为异常;一般的由处理器外部因素引起的程序跳转称为中断 广义上来说中断和异常都被处理器视为异常,一般将其分为同步异常和异步异常 同步异常 同步...
  • 在调试时,发现有中断有 挂起、激活、失能等状态,考虑这些状态都是干啥用的呢!他们是Cortex-M核所共有的,因此这里不针对与具体用的STM32 MCU,直接上升到 Cortex-M内核来了解一下! 简介   中断(也称为“异常...
  • 中断、异常、trap 的区别

    千次阅读 2019-03-11 14:17:23
    【1】无论是中断,还是异常和陷阱,对应的处理函数,一般都可以称其为中断服务程序ISR, 都只是个函数 具体函数里面要做什么事情,是由你写程序的人决定的。 【2】 比如中断中处理对应的事情,异常自己决定...
  • 嵌入式(二十三):中断

    千次阅读 2020-05-29 15:41:11
    在执行程序的过程,由于某种外界的原因,必须尽快终止当前的程序执行,而去执行相应的处理程序,待处理结束后,在回来继续执行被终止的程序。这种机制——称计算机中断系统 b、计算机系统传送数据的几种方式: ...
  • 中断响应时间/中断步骤/中断

    千次阅读 2017-06-29 10:10:32
     计算机也是采用的这种方法,五个中断源,每个中断产生后都到个固定的地方去找处理这个中断的序,当然在去之前首先要保存下面将执行的指令的地址,以便处理完中断后回到原来的地方继续往下执行程序。...
  • MSP430中断原理分析

    千次阅读 2019-04-28 09:35:17
    中断很大程度上体现了款单片机的性能,从这一点将MSP430在中断方面做得很不错,主要是提供了非常丰富的中断源,基本的IO中断,定时器中断和一些接口中断(SPI,UART,I2C)等等。 现在我就谈谈关于MSP430中断的...
  • DSP中断总结

    千次阅读 2018-07-03 13:35:55
    1 中断概述中断定义:由硬件或软件驱动的信号,使DSP将当前的程序挂起,执行另个称为中断服务程序(ISR)的任务。C55x支持32个ISR。有些ISR可以由软件或硬件触发,有些只能由软件触发。当CPU同时收到多个硬件中断...
  • CPU中断的工作原理,从最底层讲起

    千次阅读 2020-05-16 11:46:26
    前言  中断的概念属于硬件层。...可以看到在这关系链条,下层的变动会牵一发而动全身影响上层。而上层想要提高效率,改变机制也必须得到下层的支持。  像 I/O 处理的不断演进,从占用CPU等待到通
  • arduino 计时器和中断

    万次阅读 多人点赞 2019-11-03 12:43:01
    定时器0:计时器1:定时器2:Timer3,Timer4,Timer5:计时器寄存器时钟选择和定时器频率计时器模式什么是中断?定时器中断计时器溢出:输出比较匹配:定时器输入捕捉:PWM和计时器 本教程说明了Arduino板的计时器和...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 67,534
精华内容 27,013
热门标签
关键字:

中断服务程序中至少有一条