Windows 中断程序设计

上传人:re****.1 文档编号:499523750 上传时间:2022-08-01 格式:DOC 页数:9 大小:22.50KB
返回 下载 相关 举报
Windows 中断程序设计_第1页
第1页 / 共9页
Windows 中断程序设计_第2页
第2页 / 共9页
Windows 中断程序设计_第3页
第3页 / 共9页
Windows 中断程序设计_第4页
第4页 / 共9页
Windows 中断程序设计_第5页
第5页 / 共9页
点击查看更多>>
资源描述

《Windows 中断程序设计》由会员分享,可在线阅读,更多相关《Windows 中断程序设计(9页珍藏版)》请在金锄头文库上搜索。

1、Windows 中断程序设计摘要该文讨论inds3.1的中断机制,并结合dpi接口给出一种中断程序设计方法,以越过系统和应用程序的消息队列,处理外部实时事件。一、前言inds提供强大的功能以及友好的图形用户界面(gui),使得它不仅广泛的用作管理事务型工作的支持平台,也被工业领域的工程人员所关注。但inds3.1并非基于优先级来调度任务,无法立即响应外部事件中断,也就不能满足工业应用环境中实时事件处理和实时控制应用的要求。因此,如何在inds环境中处理外部实时事件一直是技术人员尤其是实时领域工程人员所关注的问题。目前已有的方法大都采用内挂实时多任务内核的方式,如inds下的实时控制软件包flx

2、等,而irx实时操作系统那么把inds3.1当作它的一个任务来运行。对于大型的工程工程,开发人员可采用购置实时软件然后集成方式。对中小工程,从投资上考虑就不很经济。如何寻找一种简明的方法来处理外部实时事件仍然显得很必要。本文首先阐述inds的消息机制及中断机制,然后结合dpi接口,给出一种保护形式下中断程序的设计方法,以处理外部实时事件。经实际运行结果说明,该方法具有简洁、实用、可靠的特点,并同样可运行于in95。二、inds的消息机制inds是一消息驱动式系统,见图1。inds消息提供了应用程序与应用程序之间、应用程序与inds系统之间进展通讯的手段。应用程序要实现的功能由消息来触发,并靠对

3、消息的响应和处理来完成。inds系统中有两种消息队列,一种是系统消息队列,另一种是应用程序消息队列。计算机的所有输入设备由inds监控,当一个事件发生时,inds先将输入的消息放入系统消息队列中,然后再将输入的消息拷贝到相应的应用程序队列中。应用程序中的消息循环从它的消息队列中检索每一个消息并发送给相应的窗口函数中。一个事件的发生,到达处理它的窗口函数必需经历上述过程。值得注意的是消息的非抢先性,即不管事件的急与缓,总是按到达的先后排队(一些系统消息除外),这就使得一些外部实时事件可能得不到及时的处理。图1三、inds的保护形式及中断机制1.inds的保护形式保护形式指的是线性地址由一个选择符

4、间接生成的,该选择符指向描绘表中的某一项;而实形式中那么通过一个段/偏移量对来直接寻址。80386(486)pu提供的保护形式才能包括一个64k的虚拟地址空间和一个4g的段尺寸。inds3.1实现时有所差异,它支持标准形式和增强形式。标准形式针对286机器,不属本文讨论范围。增强形式是对386以上pu而言,inds正是使用保护形式来打破1的屏障并且执行简单的内存保护。它使用选择器、描绘器和描绘器表控制访问指定内存的位置和段。描绘器表包括全局描绘器表、部分描绘器表、中断描绘器表。保护形式与实形式有许多不同。其中显著的差异是访问内存的机制不同。2.中断机制(1)实形式中断为了便于理解,我们先回忆实

5、形式中断。在实形式下,中断向量表ivt起到相当重要的作用。无论来自外部硬件的中断或是内部的软中断intn,在pu中都产生同样的响应。pu将当前的指令指针存放器(ip)、代码段存放器(s)、标志存放器压入堆栈。然后pu使用n值作为指向中断向量表ivt的索引,在ivt中找出效劳例程的远地址。pu将此远地址装入s:ip存放器中,并开场执行效劳例程。中断例程总以iret指令完毕。此指令使存在堆栈中的三个值弹出并填入s、ip和标志存放器,pu继续执行原来的指令。(2)保护形式中断保护形式中断过程与实形式中断过程类似,但它不再使用中断向量表ivt,而使用中断描绘符表(idt)。值得一提的是,inds运行时

6、ivt还存在,应用程序并不使用它,inds仍然使用,但含义已不同。ivt构造:ivt在ra的00000000之上,占据开场的1024字节。它仍然由bis启动例程设置,由ds填充到ra中。idt中断描绘符表:保护形式下,inds操作系统为实现中断机制而建立的一个特殊表,即中断描绘符表idt。该表被用来保存中断效劳例程的线性地址,它们是真正的24位或32位地址,没有段:偏移值构造。中断描绘器表最多可含有256个例程说明,详细说明请见【3】。idt构造见图2。图2当中断或异常发生时,处理过程与实形式类同。当前的sip值和标志存放器值被存储。保存的内容还包括pu其他内部存放器的值,以及目前正在被执行的

7、任务的有关信息(假设必须发生任务切换的话)。pu设法获取中断向量后,以它为索引值,查找idt中的效劳例程远地址,接着将控制转移到该处的效劳例程。这是与实形式转移到ivt的不同所在。保护形式使用idtr存放器分配和定位内存中的idt中断描绘符表。idt在内存中是可挪动的,与ivt固定在内存中刚好相反。idt中断描绘符表在inds中起决定性的作用。理解了inds下保护模式的中断机制。有助于我们理解中断效劳程序的设计,它的关键就在于如何将效劳例程的地址放入idt中断描绘符表中。当中断发生时,如何将断点地址及pu各存放器值保护起来;中断完毕时,如何将保护的值恢复。inds系统本身并不提供实现上述功能的

8、api,而ds保护形式接口dpi正具备了上述的功能。下面我们首先介绍dpi接口,然后基于它实现inds下中断效劳程序的设计。四、ds保护形式接口dpiinds除了标准效劳外,还支持一组特殊的ds效劳,称为ds保护形式接口dpi,由一些int2fh和int31h效劳组成。它使应用程序可以访问p系列计算机的扩大内存,同时维护系统的保护功能。dpi通过软件中断31h来定义了一个新的接口,使得保护形式的应用程序可以用它作分配内存,修改描绘符以及调用实形式软件等工作。inds为应用程序提供dpi效劳。即inds是dpi的宿主(hst),应用程序是dpi的客户(lient),可通过int-31h调用得到d

9、pi效劳。int-31h本身提供多功能。其中它的中断管理效劳允许保护形式用于拦截实形式中断,并且挂住处理器异常。有些效劳可以和dpi宿主合作,以维护应用程序的虚拟中断标志。可以用int31h来挂住保护形式中断向量,以中断方式处理外部实时事件。利用int31h,功能0205h:设置保护形式中断向量,将特定中断的保护形式处理程序的地址置入中断向量里。调用方式:ax=0205h,bl=中断号,x(e)dx=中断处理程序选择符:偏移值。返回:执行成功f=清零,执行失败f=置位。挂住/解挂中断向量的时机很重要。主窗口第一次被创立时会传送它-reate消息,这时是挂住中断向量的最好时机。退出时需解挂向量,

10、否那么inds可能崩溃。主窗口接收到-de-stry之后进展解挂工作,是最合适的。解挂向量可先用int35h,0204h功能将老的中断向量保存,退出时用int35h,0205h恢复。五、编程实现有了dpi的支持,我们就可以很方便地处理数据采集、串行通信等工业过程中的实时事件。下面以inds3.1平台下中断方式实现的串行通信为例,说明中断程序的编制和实现。为便于参考,给出了详细的代码。开发平台b3.1/b4.5,其本身支持0.9版的dpi,无需运行其它支持dpi的软件。编程语言,可与+混合编译。初始化1,9600波特率,每字符8bits,1个停顿位,中断接收,查询发送。/indsasyuniat

11、in/bylixiuing/lastdifiednjune25,1996#inludeinds.h#inludeds.hvidinterruptfardatareeive();vidinterruptfar(*ld-vetr)();unsignedhardata-r1024,data-s1024;intinflag=0;unsignedints8259;intinit1()/串口1初使化s8259=inprtb(0x21);/读入8259当前状态并保存utprtb(0x21,s82590xe8);/初始化8259,允许0x0号中断utprtb(0x3fb,0x83);utprtb(0x3f8,

12、0x0);utprtb(0x3f9,0x00);utprtb(0x3fb,0x03);utprtb(0x3f,0x08);/允许中断信号送到8259a,以便能中断utprtb(0x3f9,0x01);/0x01,中断允许return1;vidinterruptfardatareeive()/中断接收子程序statiinti=0;/静态部分变量harrehar=0;/每中断一次,i自动加1rehar=inprtb(0x3f8);/从数据口读出发送过来的数据if(inflag=0)i=0;gtll;data-ri+=rehar;/存入data-r(通信缓冲区)inflag=1;i=0;ll:utp

13、rtb(0x20,0x20);/回送中断完毕标志/调用dpi/保存旧的0h号保护形式中断向量/设置新的保护形式中断效劳例程vidinit(vid)aslivax,204hvbl,0hint31hstild-vetr=k-fp(-x,-dx);/保存asli/设置新的0x0中断效劳例程vax,205hvbl,0hvx,segdatareeivevdx,ffsetdatareeiveint31hstiinit1();/恢复8259状态/恢复0h保护形式向量vidrestre(vid)utprtb(0x21,s8259);aslivax,205hvbl,0hvx,segld-vetrvdx,ffse

14、tld-vetrint31hsti在窗口第一次被创立时会传送它-reate消息,这时调用init()即可。在主窗口关闭时,即主窗口中收到-destry消息时,调用restre()恢复原来的状态。这样在对串口初始化,设置中断效劳例程后,通信事件发生时,会立即跳入中断子程序中执行,越过系统的消息队列,到达实时处理通信事件的目的。而数据处理模块可通过全局标志flag访问全局的数据通信缓冲区获取实时数据。这种实现方式与基于消息机制的inds通信api实现相比具有实时性强的特点,因为它超过inds系统的两极消息机制。上述程序已在实际系统中得到应用。在inds3.1支持下,同时运行三个inds任务:效劳器server(内有实时串行通信,多个网络数据子效劳),客户lient,fxpr数据库系统。整个系统运行良好。切换到in95平台下(支持0.9版dpi),系统也运行良好。参考文献1张豫夫、曹建文译.【澳】barrykauler著.inds汇编语言及系统程序设计.北京大学出版社,19952赵人任等译.【美】ikeklein者.inds程序员使用指南(一).北京:清华出版社,19953刘林、陈红编译.80386硬件与接口技术.北京:北京希望电脑公司,1991

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 工作计划

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号