一旦中断或异常发生,CPU首先根据中断或异常向量号找到对应的描述符,从描述符中提取出中断或异常处理程序,然后把控制转移到中断或异常处理程序。中断或异常处理程序就是上面介绍的使用汇编语言编写的中断处理程序。
根据上面的描述,所有的异常和中断的处理都会调用一个通用的中断异常处理程序gl_general_int_handler。而目前情况下,该处理程序在MASTER.BIN中使用C语言实现,即GeneralIntHandler函数,该函数用如下代码实现:
可见,该函数没有进行过多的处理,仅仅是调用了System对象的DispatchInterrupt函数(见System对象的定义)。DispatchInterrupt函数做如下处理:
(1)根据中断向量号ucVector定位到特定的中断对象链表。
(2)如果中断链表中没有任何中断对象,则调用一个缺省的中断或异常处理程序。
(3)否则,依次调用该链表中中断对象的中断处理函数,直到有一个中断处理函数返回TRUE为止。(www.xing528.com)
代码如下:
可见,这种中断处理的实现支持中断共享,即支持多个设备使用同一条中断引脚。一个中断发生后,操作系统会轮询所有相同中断向量的中断对象(中断对象链表),并调用其处理函数,如果处理函数返回TRUE,则说明该中断已经得到处理,于是直接返回,否则会一直遍历整个中断对象链表。
下面是中断处理函数的原型:
其中,lpParam由驱动程序指定,该函数也在驱动程序中实现。需要注意的是,该函数一旦被调用,需要尽快判断自己是不是对应的中断处理程序(通过读取硬件寄存器判断),如果是,则进行进一步处理,最后必须返回TRUE,否则,为了不影响系统的整体效率,需要中断处理程序尽快返回FALSE。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。