Board logo

标题: 基于PCI总线的中断处理机制(2) [打印本页]

作者: yuyang911220    时间: 2015-10-21 10:49     标题: 基于PCI总线的中断处理机制(2)

4  中断处理流程及编程要点
    在Win9x环境下通常需要通过设备驱动程序来访问硬件资源,VtoolsD是常用的第三方VxD设备驱动程序开发工具。下面以VC++6.0为开发环境,结合VtoolsD工具及本文所讨论的中断机制来介绍中断处理程序的开发要点。
4.1 主程序编写要点

图5 中断处理主程序流程
    在主程序中要完成中断的初始化工作,其流程见图5。在编程中需注意下述几点:
① 获取配置资源
    在系统初始化期间若发现新设备,则Win9x会发出PnP_NEW _DEVNODE消息,此时VxD就可以利用CONFIGMG_Register_Device_Driver和 CONFIGMG_Get_Alloc_Log_Conf等函数来获取PCI设备的配置资源,并将配置信息放入一个类型为CMCONFIG的结构 config中。
② 设置中断向量
    从config中可获得系统为9052配置的中断号IRQ,据之保存原中断向量,然后设置中断向量使其指向用户中断服务例程,以便CPU响应中断时自动进入用户的中断处理子程序。
VtoolsD提供了VsharedHardwareInt类来实现硬件中断处理,用户从中派生出Mic_IOINT类,其中成员函数OnSharedHardwareInt是用户的中断处理子程序。

③ 允许9052中断
    允许9052产生中断可通过编程9052的INTCSR寄存器来实现。假设应用系统利用9052 LINTi2的上升沿来产生中断,则代码如下:

④ 开放中断屏蔽寄存器的相应位
    外部中断事件未受82C59的屏蔽且有足够高的优先级时,才能向CPU发出中断请求,所以在CPU开中断之前必须去除82C59对应中断的屏蔽。这可用VSharedHardwareInt类中的physicalUnmask()函数实现。

4.2 子程序编写要点
    中断处理子程序的流程如图6所示。在编写中断处理子程序时,要注意下述两点:
① 清9052中断
    因PCI中断是电平检测的,则当它得到响应后应及时撤消其请求,以免引起不应该有的第二次中断,这可通过对INTCS的位11写1来实现。代码如下:

② 清PC机相应中断标志
    中断返回前,或进入中断子程序后允许动态改变中断的优先级,则要向82C59发中断结束命令以清除PC机的相应中断标志位。若中断来自主片,则只对主片发结束命令,若来自从片,则要向主片和从片分别发结束命令。这可用VSharedHardwareInt类中的sendPhysicalEOI()函数实现。
5  结束语
    本文从计算机硬件和软件相结合的角度深入系统地介绍了基于PCI总线的中断处理机制,并给出了中断处理程序的开发要点,对计算机硬件或软件开发人员可提供较大帮助。




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0