精华内容
下载资源
问答
  • 中断服务程序设计实验

    千次阅读 2014-04-27 19:54:28
    中断服务程序设计实验 2.7.1 实验目的 1、 熟悉中断的概念、中断响应过程、中断向量表以及系统是如何根据中断类型号在中断向量表中得到该中断对应的中断服务程序的入口地址等内容。 2、 掌握中断服务程序的...

    中断服务程序设计实验

    2.7.1 实验目的

    1、 熟悉中断的概念、中断响应过程、中断向量表以及系统是如何根据中断类型号在中断向量表中得到该中断对应的中断服务程序的入口地址等内容。

    2、 掌握中断服务程序的设计方法。

    2.7.2 实验预习要求

    1、 复习中断的有关内容。

    2、 复习中断服务程序设计方法。

    3、 读懂“2.7.4 实验内容”中给出的源程序,以便上机调试。

    4、 从“2.7.5 实验习题”中任选一道题目,编写源程序,以便上机调试。

    2.7.3 中断服务程序设计方法简介

    由2.6节中的中断向量表可以看出,PC中断系统中中断类型可分为三类:

    磁盘操作系统DOS提供的中断服务程序,中断类型号从20H到2FH;

    系统主板BIOS芯片提供的BIOS中断服务程序,包括系统内部中断,中断类型号从00H到07H;系统8级外部中断,中断类型号从08H到0FH,它们对应于接在可编程中断控制器8259A的8个中断请求输入端IR0IR7的8个外部中断,其中IR2(中断类型号0AH)为系统保留,用户可通过该引脚实现对用户所需的外部硬件中断的管理;设备驱动程序,中断类型号从10H到1FH等;

    用户定义的中断,中断类型号从60H到7FH、F1H到FFH。用户可根据实际需要将某些通用性强的子程序功能通过中断服务程序来实现。一旦设置好了这样的中断服务程序,在其他应用程序中就可以调用这些中断服务程序。

    设计中断服务程序的步骤如下:

    1、 选择一个中断类型号

    如果采用硬件中断,则要使用硬件决定的中断类型号。在PC机系统中,使用了一片可编程中断控制器8259A来对外部硬件中断进行管理,具体内容参见教材264页“8259A应用举例”,可以看出IR2为系统保留,其中断类型号为0AH。若用户需要,可将用户所需的外部中断源发来的中断请求信号接到IR2,编写该中断所需的中断服务程序,并将该中断服务程序的入口地址写到中断向量表0AH4AH4+3四个单元中,这样,当接在IR2上的外部中断源发来中断请求信号时,系统就会根据得到的类型号(0AH)到中断向量表中找出其入口地址,并转去执行该中断服务程序。

    如果采用软件中断,即利用执行int n指令的方式执行中断服务程序,则可从系统预留给用户的中断类型号60H7FH、F1HFFH中选择一个。

    2、 将中断服务程序的入口地址置入中断向量表的相应的四个存储单元中

    确定了中断类型号,还要把中断服务程序入口地址置入中断向量表,以保证在中断响应时CPU能自动转入与该类型号相对应的中断服务程序。下面介绍两种将中断服务程序入口地址置入中断向量表的方法。

    (1) 直接装入法

    用传送指令直接将中断服务程序首地址置入矢量表中。设中断类型号为60H(此类型号对应的矢量表地址为从00180H开始的四个连续存储单元)。

    PUSH DS

    XOR AX,AX

    MOV DS,AX ;将数据段寄存器清零

    MOV AX,OFFSET INT60 ;将中断服务程序INT60所在段内的偏移地址送AX

    MOV DS:[0180H],AX ;将中断服务程序偏移地址送中断向量表00180H和00181单元

    MOV AX,SEG INT60 ;将中断服务程序INT60所在段的段地址送AX

    MOV DS:[0180H+2],AX ;将中断服务程序所在代码段的段地址送00182H和00183单元

    POP DS

    (2) DOS系统功能调用法

    功能号(AH)=25H;

    入口参数:(AL)=中断类型号,

    (DS)=中断服务程序入口地址的段地址

    (DX)=中断服务程序入口地址的偏移地址

    下面程序段完成中断类型号为60H的入口地址置入。

    PUSH DS ;保护DS

    MOV DX,OFFSET INT60 ;取服务程序偏移地址

    MOV AX,SEG INT60 ;取服务程序段地址

    MOV DS,AX

    MOV AH,25H ;送功能号

    MOV AL,60H ;送中断类型号

    INT 21H ;DOS功能调用

    POP DS ;恢复DS

    3、 使中断服务程序驻留内存,以便其他应用程序调用

    实现这一步骤的必要性在于:一旦中断服务程序驻留内存后,一般程序员使用这一新增的中断调用就如同调用DOS或BIOS的中断子程序一样,只要了解其入口要求和返回参数就可调用。程序驻留在内存后,它占用的存储区就不会被其他软件覆盖。使程序驻留内存,要求该程序以 .COM形式运行,这种种结构的程序要求入口定位于100H,并且数据和代码均在同一个段内,这样,.COM程序就被定位于低地址区,DOS常在低地址区增加驻留程序,而 .EXE程序被定位于高地址区。

    可采用DOS系统功能调用的方法实现程序驻留内存。

    功能号: (AH)=31H;

    入口参数: (DX)=驻留程序字节数

    该功能使当前程序的DX个字节驻留内存并返回DOS。

    2.7.4 实验内容

    编写一中断服务程序完成(AX)+(BX)结果放在(AX)中。要求中断类型号取60H;使用DOS系统功能调用将中断服务程序AX_BX60的入口地址装入中断向量表;使用INT 60H调用该中断服务程序并用DEBUG观察运行结果是否正确。

    程序框架

    CODE SEGMENT

    ASSUME CS: CODE

    START:

    MOV AX, 01H

    MOV BX, 02H

    INT 60H ;通过软中断指令调用中断服务程序实现(AX)+(BX)

    MOV AH, 4CH

    INT 21H ;返回DOS

    AX_BX60 PROC FAR ;中断服务程序

    ADD AX, BX

    IRET

    AX_BX60 ENDP

    CODE ENDS

    END START

    对上述源程序汇编连接生成*.EXE文件,使用TD观察运行结果,如图所示,执行完INT 60H后,AX寄存器的内容为0003H,结果正确。

    展开全文
  • 中断服务程序的编写

    千次阅读 2007-09-10 10:51:00
    中断服务程序的编写

    中断服务程序的编写
                                          陈晴阳  
     
    摘要:本文主要介绍C语言中中断服务程序的编写、安装和使用。由于硬中断服务程序的编写涉及到硬件端口读写操作,使得用户直接和硬件打交道,在程序设计过程中要用到的数据(如硬件端口地址等)比较多,这就使程序员和计算机的硬件设备间缺少一种“缓冲”的作用,况且,用汇编语言来直接对硬件编程要方便得多。本文仅对软中断程序的编写作个介绍。
    关键词:软中断、中断向量、中断向量表、TSR内存驻留、DOS重入、中断请求、段地址、偏移量、寄存器、BIOS、DOS、setvect ( )、getvect ( )、keep ( )、disable ( )、enable ( )、geninterrupt ( )、int86 ( )、interrupt
    对于一般的C语言爱好者而言,就如何在C中使用中断例程这一问题应该已经非常熟悉,例如,我们可以通过int86 ( )函数调用13H号中断直接对磁盘物理扇区进行操作,也可以通过INT86 ( )函数调用33H号中断在屏幕上显示鼠标光标等。其实,13H号也好,33H号也好,它们只不过就是一些函数,这些函数的参数通过CPU的寄存器传递。中断号也只不过是间接地指向函数体的起始内存单元,说它是间接的,也就是说,函数的起始段地址和偏移量是由中断号通过一种方法算得的(具体如何操作,下面会作解释)。如此一来,程序员不必要用太多的时间去写操作硬件的程序了,只要在自己的程序中设置好参数,再调用BIOS或DOS提供的中断服务程序就可以了,大大减小了程序开发难度,缩短了程序开发周期。那么中断既然是函数,就可以由用户任意的调用、由用户任意地编写。
    计算机内存的前1024个字节(偏移量00000H到003FFH)保存着256个中断向量,每个中断向量占4个字节,前两个字节保存着中断服务程序的入口地址偏移量,后两个字节保存着中断程序的入口段地址,使用时,只要将它们分别调入寄存器IP及CS中,就可以转入中断服务程序实现中断调用。每当中断发生时,CPU将中断号乘以4,在中断向量表中得到该中断向量地址,进而获得IP及CS值,从而转到中断服务程序的入口地址,调用中断。这就是中断服务程序通过中断号调用的基本过程。在计算机启动的时候,BIOS将基本的中断填入中断向量表,当DOS得到系统控制权后,它又要将一些中断向量填入表中,还要修改一部分BIOS的中断向量。有一部分中断向量是系统为用户保留的,如60H到67H号中断,用户可以将自己的中断服务程序写入这些中断向量中。不仅如此,用户还可以自己更改和完善系统已有的中断向量。
    在C语言中,提供了一种新的函数类型interrupt,专门用来定义中断服务程序,比如我们可以写如下的中断服务程序:
    /*例1:中断服务程序*/
    void interrupt int60()
    {
        puts("This is an example");
    }
    该中断的功能就是显示一个字符串,为什么不用printf ( )函数呢?这就牵涉到DOS的重入问题,后面将作一些介绍。
    一个简单的中断服务程序写好了,如何把它的函数入口地址填写到中断向量表中,以便在产生中断的时候能转入中断服务程序去执行呢?这里要用到setvect ( )和getvect ( )函数。setvect ( )有两个参数:中断号和函数的入口地址,其功能是将指定的函数安装到指定的中断向量中,getvect ( )函数有一个参数:中断号,返回值是该中断的入口地址。在安装中断以前,最好用disable ( )函数关闭中断,以防止在安装过程中又产生新的中断而导致程序运行混乱,待安装完成后,再用enable ( )函数开放中断,使程序正常运行。现在我们可以把上面的例子再丰富一下:
    /*例2:中断服务程序的编写、安装和使用*/
    #include
    #include
    #ifdef __cplusplus
       #define __ARGU ...
    #else
       #define __ARGU
    #endif
    void interrupt int60 (__ARGU) /*中断服务函数*/
    {
       puts("This is an example");
    }
    void install (void interrupt (*fadd)(__ARGU),int num) /*安装中断*/
    {
       disable(); /*关闭中断*/
       setvect(num, fadd); /*设置中断*/
       enable(); /*开放中断*/
    }
    void main()
    {
    install (int60,0x60);/*将int60函数安装到0x60中断*/
    geninterrupt (0x60); /*人为产生0x60号中断*/
    }
    有一定经验的读者很容易得到该程序的执行结果:在屏幕上显示“This is an example!”。
    编写、安装中断服务程序的方法就介绍这些。下面再浅谈一下内存驻留程序(TSR)的编写和使用。在C语言中,可以用keep ( )函数将程序驻留内存。这个函数有两个参数:status和size。size为驻留内存长度,可以用size=_SS+_SP/16-_psp得到,当然这也是一种估算的方法,并不是精确值。函数执行完以后,出口状态信息保存在status中。比如,对于上面的例子,将“geninterrupt (0x60);”改写成“keep(0,_SS+_SP/16-_psp);”后再执行程序,这一段程序就被驻留,此后在其它的任何软件或程序设计中,只要用到了60H号中断,就会在屏幕上显示“This is an example!”的字样。要恢复系统对60H号中断的定义,只能重新启动计算机。
    像上面的例子其实还很不完善,它没有考虑DOS系统环境的状态、没有考虑程序是否已经驻留内存、没有考虑退出内存驻留等问题。对于第二个问题还是很容易解决的:执行程序一开始就读取某一函数中断入口地址(如63H号中断)判断是否为空(NULL),如果为空就先将该地址置为非空再驻留内存,若为非空则表示已经驻留并退出程序。这一步判断非常重要,否则将会因为重复驻留占用过多内存空间而最后造成系统崩溃。至于其它两个问题,在此不多作说明,有兴趣的读者可以参考一些有关书籍。
    不仅如此,我们还可以通过在DOS下使用热键(Hotkey)来调用内存驻留程序。比如将《希望汉字系统》自带的《希望词典》驻留内存后,在任意时刻按下Ctrl+F11键,就能激活程序,出现词典界面。微机的键盘中有一个微处理芯片,用来扫描和检测每个按键的按下和释放状态。大多数按键都有一个扫描码,告知CPU当前的状态,但一些特殊的键如PrintScreen、Ctrl+Break等不会产生扫描码,而直接产生中断。正因为如此,我们可以将Ctrl+Break产生的中断号指向我们自己写好的程序入口地址,那么当按下Ctrl+Break后,系统就会调用我们自己的程序去执行,这实际上也就是修改了Ctrl+Break的中断向量。至于其它按键激活程序则可以利用9H号键盘中断捕获的扫描码来实现,在此不多作说明。例如,执行下面的程序后,退回DOS系统,在任意的时候按下Ctrl+Break后,屏幕的底色就会变成红色。
    /*例3:中断服务程序编写、安装和使用,内存驻留*/
    #include
    #include
    #ifdef __cplusplus
    #define __ARGU ...
    #else
    #define __ARGU
    #endif
    void interrupt newint(__ARGU); /*函数声明*/
    void install (void interrupt (*fadd)(__ARGU), int num);
    int main()
    {
    install (newint,0x1b); /*Ctrl+Break中断号:1BH*/
    keep(0,_SS+(_SP/16)-_psp); /*驻留程序*/
    return 0;
    }
    void interrupt newint(__ARGU)
    {
    textbackground(4); /*设置屏幕底色为红色*/
    clrscr(); /*清除屏幕*/
    }
    void install (void interrupt (*fadd)(__ARGU), int num)
    {
    disable();
    setvect(num,fadd); /*设置中断*/
    enable();
    }
    由于13H号中断是BIOS提供的磁盘中断服务程序,对于DOS下的应用程序,它们的存盘、读盘功能都是通过调用这一中断来实现的。有许多DOS下的病毒就喜欢修改13H号中断来破坏系统,例如,修改13H号中断服务程序,将其改成:
    /*例4:病毒体程序伪代码*/
    void interrupt new13(__ARGU)
    {
        if (病毒发作条件成熟)
        {   修改入口参数指向病毒程序入口地址;
             执行病毒代码;
        }
        调用原来的13H中断;
    }
    只要当任一软件(如EDIT.COM等)对磁盘有操作并且病毒发作条件成熟时,病毒就被激活。当然,这样做会导致可用内存空间减少,容易被用户发现。一些“聪明”的病毒又会去修改其它的中断向量,使得系统报告的内存大小和实际相符合。还有的病毒,当发现用户通过一些程序(如DEBUG.COM等)去跟踪它时,它会悄悄地溜掉,其基本原理仍然与修改中断有关。硬盘的0面0柱1扇区(Side 0 Cylinder 0 Sector 1)保存着重要的引导信息,一旦破坏,计算机将无法识别硬盘。我们可以写一个程序来防止任何软件(包括病毒)对这一扇区执行“写”操作,一定程度上实现了“写保护”的作用,它的基本原理就是修改13H号中断向量并常驻内存,监视着软件(包括病毒)对磁盘操作的每一个细节。读者请注意:本程序没有考虑内存驻留的退出,如果想恢复13H号中断,请重新启动计算机。
    /*例5:主引导扇区保护,请用Turbo C 2.0编译,MBSP.C*/
    #include
    #include
    #include
    #define STSIZE 8192
    #define PSP_ENV_PSP 0x2c
    #define PARA(x) ((FP_OFF(x)+15)>>4)
    typedef struct {
       unsigned bp,di,si,ds,es,dx,cx,bx,ax,ip,cs,flags;
    } INTERRUPT_PARAMETER;
    void install (void interrupt (*faddress)(), int num);
    void interrupt new13(INTERRUPT_PARAMETER p);
    int main()
    {
    union REGS regs;
    struct SREGS sregs;
    unsigned mem;
    unsigned far *pointer;
    char far *stack;
    printf("/n<> version 1.0/n/n");
       if ((stack=malloc(STSIZE))==NULL)
           {
           printf ("Not enough Memory!/n");
           exit(1);
           }
       if (getvect(0x62)!=NULL)
           {printf("Already Installed!/n");exit(1);}
       install(getvect(0x13),0x62);
       install (new13,0x13);
       pointer=MK_FP(_psp,PSP_ENV_PSP);
       freemem(*pointer);
       segread(&sregs);
       mem=sregs.ds+PARA(stack)-_psp;
       setblock(_psp,mem);
       keep (0,mem);
       return 0;
    }
    void install (void interrupt (*faddress)(), int num)
    {
       disable();
       setvect(num,faddress);
       enable();
    }
    void interrupt new13(INTERRUPT_PARAMETER p)
    {
        p.ax=_AX;
        p.cx=_CX;
        p.dx=_DX;
        if(_AH==0x03&&_CH==0&&_CL==0x01&&_DH==0&&_DL==0x80) return;
        enable();
        geninterrupt (0x62);
        disable();
        _AX=p.ax;
        _CX=p.cx;
        _DX=p.dx;
        return;
    }
    说明:在使用本程序以前,请:①用杀毒软件对计算机引导扇区、内存和所有文件进行一次全面的扫描,确信计算机中没有任何病毒;②有计算机汇编语言基础的读者可以自己写一个新的引导程序,先将本程序驻留内存,再调用原来的引导程序,以便在病毒还没有取得系统控制权以前开启防护功能。
    最后简要说明一下DOS系统重入问题。DOS是单用户单任务操作系统。如果程序在执行的过程中被打断,就有可能因为破坏了原来的程序运行环境而造成运行不正常,这是灾难性的。当中断产生后,CPU立即中止当前的程序去执行中断服务程序,如果在中断服务程序中又有对DOS中断的调用(如DOS的21H号中断)时,这样必定会重写环境全局变量(例如PSP程序段前缀就会被改成正在执行的中断程序的PSP),这样原来的环境被破坏,原来的程序也就无法正确执行。当中断调用完成并返回后,用户得到的结果是出乎意料的。所以在编写中断服务程序时应该避免DOS系统功能调用,在C语言的中断服务程序中不应该出现malloc ( )、printf ( )、sprintf ( )等函数。
    参考文献:《C高级实用程序设计》王士元编著,清华大学出版社,1996.3
     
    展开全文
  • 中断处理程序中断服务例程

    千次阅读 2017-07-20 11:27:21
    1 什么是中断2中断处理程序3中断服务例程4request_irq函数分析 1. 什么是中断 简单来说中断就是硬件设备与处理器的一种交流方式,比如当我按下一个键时,只有当处理器知道我按下了这个键并且做出相应...
    
    

    1. 什么是中断

    简单来说中断就是硬件设备与处理器的一种交流方式,比如当我按下一个键时,只有当处理器知道我按下了这个键并且做出相应的处理时,按键这个操作才是有效的。我们知道处理器的速度远远高于外围设备的速度,处理器与外设选择合适的交流方式就格外重要。轮询是一种方式,这种方式是内核周期性地对设备状态进行查询并作出相应的的动作,但这种方式会让内核做大量的无用功,这显然是不明智的。更好的方式是让外设在其需要的时候向内核发送信号,这就是中断机制。

    2.中断处理程序

    当一个中断发生时,内核应该有相应的处理方法,这个方法就是中断处理程序,一个中断处理程序对应一个中断号。中断处理程序是管理硬件的驱动程序的一部分,如果设备需要中断,相应的设备驱动程序就需注册中断处理程序。注册方式:使用request_irq()函数

    1. int
    2. request_irq(unsigned int irq, irqreturn_t (*handler)(int, void *, struct pt_regs *),unsigned long irqflags, const char * devname, void *dev_id)

    函数参数: 
    irq:表示要分配的中断号 
    handler:函数指针,指向中断的实际中断处理函数 
    irqflags:中断处理程序的标志,举例来说: IRQF_DISABLED被设置后内核在处理中断处理程序本身期间要禁止所有的其他中断。 
    devname:与中断相关的设备的ASCII文本表示 
    dev_id:用于共享中断线,当一个中断处理程序需要释放时,dev_id提供唯一的标志信息。

    3.中断服务例程

    一条中断线对应一个中断一个中断处理程序,而多个设备可能共享一条中断线,那么如何让中断处理程序为不同的设备提供不同的处理方法。这就引出了中断服务例程。一个中断处理程序对应若干个中断服务例程。

    中断处理程序就相当于某个中断向量的总的处理程序,比如IRQ0x09_interrupt()是中断号为9的总处理程序,假如这个9号中断由5个设备共享,那么这5个设备都分别有其对应的中断服务例程。也就是说当有多个设备需要共享某个中断线时,中断处理程序必须要调用ISR,此时会调用handle_IRQ_event()

    4.request_irq函数分析

    1. int
    2. request_irq(unsigned int irq, irqreturn_t (*handler)(int, void *, struct pt_regs *),
    3. unsigned long irqflags, const char * devname, void *dev_id)
    4. {
    5. int retval;
    6. struct irqaction * action;
    7. if (irq >= ACTUAL_NR_IRQS) //中断号是否超过最大值
    8. return -EINVAL;
    9. if (!handler) //函数指针是否为空
    10. return -EINVAL;
    11. #if 1
    12. /*
    13. * Sanity-check: shared interrupts should REALLY pass in
    14. * a real dev-ID, otherwise we'll have trouble later trying
    15. * to figure out which interrupt is which (messes up the
    16. * interrupt freeing logic etc).
    17. */
    18. if ((irqflags & SA_SHIRQ) && !dev_id) { //若中断共享但dev_id为NULL则出错
    19. printk(KERN_ERR
    20. "Bad boy: %s (at %p) called us without a dev_id!\n",
    21. devname, __builtin_return_address(0));
    22. }
    23. #endif
    24. action = (struct irqaction *)
    25. kmalloc(sizeof(struct irqaction), GFP_KERNEL); //创建irqaction结构体
    26. if (!action)
    27. return -ENOMEM;
    28. action->handler = handler; //将函数参数传给结构体
    29. action->flags = irqflags;
    30. cpus_clear(action->mask);
    31. action->name = devname;
    32. action->next = NULL;
    33. action->dev_id = dev_id;
    34. #ifdef CONFIG_SMP
    35. select_smp_affinity(irq);
    36. #endif
    37. retval = setup_irq(irq, action); //注册中断irqaction结构体
    38. if (retval)
    39. kfree(action);
    40. return retval;
    41. }
    1. struct irqaction {
    2. irqreturn_t (*handler)(int, void *, struct pt_regs *);//具体的中断服务例程
    3. unsigned long flags;//一组中断标志
    4. cpumask_t mask;
    5. const char *name;//中断设备名称
    6. void *dev_id;指定设备的主设备号和次设备号
    7. struct irqaction *next;//指向共享中断线的下一个 irqaction结构体
    8. int irq;//申请的中断号
    9. struct proc_dir_entry *dir;
    10. };
    展开全文
  • 中断服务程序

    千次阅读 2014-10-14 11:41:48
    中断服务程序:处理器处理“急件”,可理解为是一种服务,是通过执行事先编好的某个特定的程序来完成的,这种处理“急件”的程序被称为——中断服务程序。 当中央处理器正在处理内部数据时,外界发生了紧急情况,...

    中断是嵌入式系统中重要的组成部分,这导致了很多编译开发商提供一种扩展—让标准C支持中断。

    具代表事实是,产生了一个新的关键字 __interrupt。

    下面的代码就使用了__interrupt关键字去定义了一个中断服务子程序(ISR),请评论一下这段代码的。


    __interrupt double compute_area (double radius) 
    {
        double area = PI * radius * radius;
        printf("\nArea = %f", area);
        return area;
    }


    这个函数有太多的错误了,以至让人不知从何说起了:

    1)  ISR 不能返回一个值。如果你不懂这个,那么你不会被雇用的。

    2)  ISR 不能传递参数。如果你没有看到这一点,你被雇用的机会等同第一项。

    3)  在许多的处理器/编译器中,浮点一般都是不可重入的。有些处理器/编译器需要让额处的寄存器入栈,有些处理器/编译器就是不允许在ISR中做浮点运算。

    此外,ISR应该是短而有效率的,在ISR中做浮点运算是不明智的。

    4) 与第三点一脉相承,printf经常有重入和性能上的问题。如果你丢掉了第三和第四点,我不会太为难你的。不用说,如果你能得到后两点,那么你的被雇用前景越来越光明了。

     

    不能在中断服务程序中执行类似操作的原因是运算时间太长,不能在中段中作复杂的工作,你可以在中断服务程序中置一个标志位.然后在主程序中查询此位,判断是否执行计算子程序.当然这样做会在中断产生与实际的中断响应之间产生一定的延迟,如果你的系统对时间不太敏感还好,如果非常敏感可以考虑采用rtos。否则。。。多加几句对中断标志位的判断语句。。。。

    在主程序中监测是否被置位来决定子程序是否执行.可能存在以下问题,就是,中断返回后要执行几个耗时比较长的子程序才能执行判断标志位的语句,这样,可能会有太长的时间间隔.如果你在几个耗时比较长的子程序之间加上一句判断语句,就会减小中断产生与中断响应之间的时间延迟.

     中断活动的全过程大致为:

    1、中断请求:中断事件一旦发生或者中断条件一旦构成,中断源提交“申请报告”,与请求CPU暂时放下目前的工作而转为中断源作为专项服务

    2、中断屏蔽:虽然中断源提交了“申请报告”,但是,是否得到CPU的响应,还要取决于“申请报告”是否能够通过2道或者3道“关卡”(中断屏蔽)送达CPU(相应的中断屏蔽位等于1,为关卡放行;反之相应的中断屏蔽位等于0,为关卡禁止通行);

    3、中断响应:如果一路放行,则CPU响应中断后,将被打断的工作断点记录下来(把断点地址保护到堆栈),挂起“不再受理其他申请报告牌”(清除全局中断标志位GIE=0),跳转到中断服务子程序

    4、保护现场:在处理新任务时可能破坏原有的工作现场,所以需要对工作现场和工作环境进行适当保护;

    5、调查中断源:检查“申请报告”是由哪个中断源提交的,以便作出有针对性的服务;

    6、中断处理:开始对查明的中断源进行有针对性的中断服务;

    7、清除标志:在处理完毕相应的任务之后,需要进行撤消登记(清除中断标志),以避免造成重复响应;

    8、恢复现场:恢复前面曾经被保护起来的工作现场,以便继续执行被中断的工作;

    9、中断返回:将被打断的工作断点找回来(从堆栈中恢复断点地址),并摘下“不再受理其他申请报告牌”(GIE=1),继续执行原先被打断的工作


    展开全文
  • 中断服务程序(ISR)

    千次阅读 2012-08-13 22:23:56
    中断服务程序 关键词:软中断中断向量、中断向量表、TSR内存驻留、DOS重入、中断请求、段地址、偏移量、寄存器、BIOS、DOS、setvect ( )、getvect ( )、keep ( )、disable ( )、enable ( )、geninterrupt ( )、...
  • c语言单片机中断服务程序

    千次阅读 2018-01-28 02:28:00
    中断服务特殊功能寄存器配置 */ void init() { TMOD = 0x01 ; // 定时器16为计数工作模式 TH0 = 0x4b ; TL0 = 0xfd ; // 50ms ET0 = 1 ; // 开定时器0中断 TR0 = 1 ; // 启动定时器0 EA ...
  • windows驱动注册中断服务程序

    千次阅读 2011-08-17 21:11:48
    一个驱动程序的标准中断服务例程的必要功能和建立一个ISR的需求。 8.1 ISR需求 8.1.1 ISR性能 8.1.2 附加的需求的驱动程序例程 8.1.3 建立一个ISR 8.2 ISR基本功能 8.3 ISR重叠I/O操作功能 1.1 ISR需求 一...
  • 在开始写中断函数之前,我们来一起回顾一下,单片机的中断系统。  中断的意思(学习过微机原理与接口技术的同学,没学过单片机,也应该知道),我们在这里就不讲了,首先来回忆下中断系统涉及到哪些问题。  (1)...
  • 在开始写中断函数之前,我们来一起回顾一下,单片机的中断系统。  中断的意思(学习过微机原理与接口技术的同学,没学过单片机,也应该知道),我们在这里就不讲了,首先来回忆下中断系统涉及到哪些问题。  ...
  • EXTI中断程序实例

    千次阅读 2015-04-19 16:45:50
    EXTI中断程序实例
  • 8086中断处理程序分析

    千次阅读 2017-09-02 14:50:41
    中断程序介绍, 中断处理程序:由于cpu随时检测程序的中断信息,也就是执行中断程序,所以中断程序必须存储在内存某个段空间中 而中断处理程序的入口地址,即中断向量必须存储在对应的中断向量表表项中,通俗的讲...
  • 中断服务类型号为60 DATA SEGMENT MESG DB 'This is an Interruption Service Program!$' DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: mov ax,DATA mov ds,ax push ds mov dx,offset disp60 ...
  • 中断处理程序的设计

    千次阅读 2018-10-03 20:51:32
    在嵌入式系统的设计中,与外设...与数据收发相关的中断中断处理程序与外部程序(操作系统和应用程序)之间的数据交换方式的设计是中断处理程序设计的一个关键部分,直接影响系统的工作效率,甚至是一些偶发性故障...
  • BIOS中断号BIOS字体及颜色属性INT 10HAH=02H 设置光标位置AH=06H 按指定范围滚动窗口AH=13H 显示字符串INT 13HAH=00H 重置磁盘驱动器AH=02H 读取磁盘扇区 BIOS字体及颜色属性 INT 10H AH=02H 设置光标位置 BIT ...
  • 中断时计算机科学中最基本、也是十分重要的一个概念...定义:中断就是使CPU暂时挂起当前正在进行的工作并转向某紧急事件的服务与处理程序(该服务与处理程序称为中断服务程序),在执行完中断服务程序后再返回到被中止
  • 中断处理程序

    万次阅读 2011-11-19 11:20:55
    本章将深入到DOS系统内部探讨中断处理程序的内容。与其他计算机编程不一样,中断处理程序这个名词听起来就很难懂。用最简单的话来说,中断处理程序就是对应于中断激活的程序。  读者可能已发现,中断处理实际上并...
  • 中断服务函数

    千次阅读 2020-01-17 14:44:45
    中断问题也是面试嵌入式岗位时,面试官比较喜欢拷问的问题之一,作为一个嵌入式开发人员,自然少不了与中断打交道,裸机程序中作为前台服务程序,发挥着重要的作用。 中断服务函数应该注意的四大点: 1.中断服务...
  • 中断程序设计

    千次阅读 2014-11-30 16:15:35
    中断程序设计 实验目的: 1.掌握中断概念,掌握中断程序设计方法 2.掌握中断程序调试方法 实验步骤: 1.编辑 利用编辑器(记事本,也可采用其它编辑器)建立一个名为ASM3.ASM的文本文件,内容如下: ASSUME DS...
  • 中断向量,中断向量表 ,中断服务函数

    千次阅读 多人点赞 2019-07-29 12:31:52
    所谓中断是指CPU在正常执行程序的过程中,由于内部/外部事件的触发或由程序的预先安排,引起CPU暂时中断当前正在运行的程序,而转去执行为内部/外部事件或程序预先安排的事件的服务程序,待中断服务程序执行完毕...
  • 7.4.2 程序中断方式

    千次阅读 2016-09-22 17:21:05
    程序中断是指在计算机执行现行程序的过场中,出现某些急需处理的异常情况或特殊请求,CPU暂停中断现行程序,而专区对这些异常情况或特殊情况进行处理,在处理完毕后CPU又自动返回到现行程序的断点处,继续执行原程序...
  • 时钟中断处理程序

    千次阅读 2008-12-23 11:33:00
    时钟中断处理程序可以划分为两个部分:体系结构相关部分和体系结构无关部分。 与体系结构相关的例程作为系统定时器的中断处理程序而注册到内核中,以便在产生时钟中断时,它都能够相应地运行。这部分处理程序主要...
  • 所谓中断是指CPU在正常执行程序的过程中,由于内部/外部事件的触发或由程序的预先安排,引起CPU暂时中断当前正在运行的程序,而转去执行为内部/外部事件或程序预先安排的事件的服务程序,待中断服务程序执行完毕...
  • linux内核分析--中断中断处理程序

    千次阅读 2014-04-12 12:00:05
    在前面的这篇文章linux内核分析--中断的分类
  • 汇编设置中断处理程序并用调用

    千次阅读 2019-05-18 13:52:53
    源码: data segment ends stack segment ends code segment start : CLI ;设置中断向量 MOV AX,SEG INTROUT9 MOV DS, AX MOV DX, OFFSET INTROUT9 MOV AL, 9 ;将中断处理程序INTRO...
  • PIC单片机之中断程序

    万次阅读 2013-01-29 00:19:33
    什么是中断程序呢?  形象的生活比喻就比如你现在这在看我的文章,突然你的朋友喊你一起去烤地瓜,这时候你就中断了看文章和朋友烤地瓜去了,烤完地瓜之后你又回来看文章。烤地瓜这件事就好比中断程序,他中断了你...
  • 1,中断处理程序中不能使用有睡眠功能的函数,如ioremap,kmalloc,msleep等,理由是中断程序并不是进程,没有进程的概念,因此就没有休眠的概念; 2,中断处理程序中的延时可以用忙等待函数来代替,如ndelay,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 343,647
精华内容 137,458
关键字:

中断服务程序的功能