首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

基于PCI总线的中断处理机制(2)

基于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总线的中断处理机制,并给出了中断处理程序的开发要点,对计算机硬件或软件开发人员可提供较大帮助。
继承事业,薪火相传
返回列表