windows编程:Windows中断编程来源: 发布时间:星期二, 2008年12月30日 浏览:2次 评论:0
、前 言
Windows提供强大功能以及友好图形用户界面(GUI)使得它不仅广泛用作管理事务型工作支持平台也被工业领域工程人员所关注但Windows3.1并非基于优先级来调度任务无法立即响应外部事件中断也就不能满足工业应用环境中实时事件处理和实时控制应用要求因此如何在Windows环境中处理外部实时事件直是技术人员尤其是实时领域工程人员所关注问题目前已有思路方法大都采用内挂实时多任务内核方式如windows实时控制软件Software包FLX等而iRMX实时操作系统则把Windows3.1当作它个任务来运行对于大型工程项目开发人员可采用购买实时软件Software然后集成方式对中小项目从投资上考虑就不很经济如何寻找种简明思路方法来处理外部实时事件依然显得很必要 本文首先阐述windows消息机制及中断机制然后结合DPMI接口给出种保护模式下中断设计思路方法以处理外部实时事件经实际运行结果表明该思路方法具有简洁、实用、可靠特点并同样可运行于Win95 2、Windows消息机制 Windows是消息驱动式系统 Windows消息提供了应用和应用的间、应用和Windows系统的间进行通讯于段应用要实现功能由消息来触发并靠对消息响应和处理来完成 Windows系统中有两种消息队列种是系统消息队列另种是应用消息队列计算机所有输入设备由 Windows监控当个事件发生时windows先将输入消息放入系统消息队列中然后再将输入消息拷贝到相应应用队列中”应用中消息循环从它消息队列中检索每个消息并发送给相应窗口中个事件发生到达处理它窗口必须经历上述过程值得注意是消息非抢先性即不论事件急和缓总是按到达先后排队(些系统消息除外)这就使得些外部实时事件可能得不到及时处理 3、windows保护模式及中断机制 1.Windows保护模式 保护模式指是线性地址由个选择符间接生成该选择符指向描述表中某项;而实模式中则通过个段/偏移量对来直接寻址80386(486) CPU提仪保护模式能力包括个64K虚拟地址空间和个4G段尺寸Windows3.1实现时有所差别它支持标准模式和增强模式标准模式针对286机器不周本文探讨范围增强模式是对386以上CPU而言windows正是使用保护模式来打破lM屏障并且执行简单内存保护它使用选择器、描述器和描述器表控制访问指定内存位置和段描述器表包括全局描述器表局部描述器表、中断描述器表保护模式和实模式有许多区别其中显著差异是访问内存机制区别 2.中断机制 (1)实模式中断 为了便于理解我们先回顾实模式中断 在实模式下中断向量表IVT起到相当重要作用无论来自外部硬件中断或是内部软中断INTn在CPU中都产生同样响应 ①CPU将当前指令指针寄存器(IP)、代码段寄存器(CS)、标志寄存器压入堆栈 ②然后CPU使用 n值作为指向中断向量表IVT索引在IVT中找出服务例程远地址 ②CPU将此远地垃装入CS:IP寄存器中并开始执行服务例程 ④中断例程总以IRET指令结束此指令使存在堆栈中 3个值弹出并填入CS、IP和标志寄存器CPU继续执行原来指令 (2)保护模式中断 保护模式中断过程和实模式中断过程类似但它不再使用中断向量表IVT而使用中断描述符表(IDT)值得提是Windows运行时IVT还存在应用并不使用它Windows仍然使用但含义已区别‘ (1)IVT结构:IVT在RAM 0000:0000的上占据开始1024字节它仍然由 BIOS启动例程设置由DOS填充到RAM中 ②IDT中断描述符表:保护模式下Windows操作系统为实现中断机制而建立个特殊表即中断描述符表IDT该表被用来保存中断服务例程线性地址它们是真正24位或32位地址没有段:偏移值结构中断描述器表最多可含有256个例 程介绍说明详细介绍说明请见[3] IDT结构见图2 ②当中断或异常发生时处理过程和实模式类丁当前CS; IP值和标志寄存器值被存储保存内容还包括CPU其他内部寄存器值以及目 前正在被执行任务有关信息(若必须发生任务切换话)CPU设法获取中断向量后以它为索引值查找IDT中服务例程远地址接着将控制转移到该处服务例程这是和实模式转移到IVT区别所在保护模式使用IDTR寄存器分配和定位内存中IDT中断描述符表IDT在内存中是可移动和IVT固定在内存中刚好相反 IDT中断描述符表在 Windows中起决定性作用理解了windows保护模式中断机制有助于我们理解中断服务设计它关键就在于如何将服务例程地址放入IDT中断描述符表中当中断发生时如何将断点地址及CPU各寄存器值保护起来中断结束时如何将保护值恢复 windows系统本身并不提供实现上述功能API而DOS保护模式接口DPMI正具备了上述功能 下面我们首先介绍DPMI接口然后基于它实现Windows下中断服务设计 4、DOS保护模式接口 DMPI Windows除了标准服务外还支持组特殊DOS服务称为DOS保护模式接口 DPMI由些INT2FH和INT31H服务组成它使应用能够访问 PC系列计算机扩充内存同时维护系统保护功能 DPMI通过软件Software中断31h来定义了个新接口使得保护模式应用能够用它作分配内存修改描述符以及实模式软件Software等工作 Windows为应用提供 DPMI服务即Windows是DPMI宿主(host)应用是DPMI客户(client)可通过INT31H得到DPMI服务INT 31H本身提供多功能其中它中断管理服务允许保护模式用于拦截实模式中断并且挂住处理器异常有些服务能够和 DPMI宿主合作以维护应用虚拟中断标志 可以用INT31H来挂住保护模式中断向量以中断方式处理外部实时事件利用 INT 21H功能0205H:设置保护模式中断向量将特定中断保护模式处理地址置入中断向量里方式: AX=0205HBL=中断号CX:(E)DX=中断处理选择符:偏移值返回:执行成功CF=清零执行失败CF置位 挂住/解挂中断向量时机很重要主窗口第次被创建时会传送它WM—CREATE消息这时是挂住中断向量最好时机退出时需解挂向量否则Windows可能崩溃上窗口接收到WM_DESTROY的后进行解挂工作,是最适合解挂向量可先用INT35H0204H功能将老中断向量保存退出时用INT35H0205H恢复 5、编程实现 有了DPMI支持我们就可以很方便地处理数据采集、串行通信等工业过程中实时事件下面以Windows3.1平台下中断方式实现串行通信为例介绍说明中断编制和实现为便于参考给出了详细代码开发平台BC3.1/BC4.5其本身支持0.9版DPMI无需运行其它支持DPMI软件Software编程语言C可和C++混合编译 化COM19600波特率每8bits1个停止位中断接收查询发送 //windows asy COmmunica60n //by Li Xiumi98 //last modied _disibledevent=MK_FP(_CX,_DX); asm{ cli mov ax,205h mov bl,0ch mov cx,seg datareceive mov dx,off datareceive 31h sti } InitCom; } void restore_Comm(void) { outportb(0x21,s8259); asm{ cli mov ax,205h mov bl,0ch mov cx,seg old_vector mov dx,off old_vector 31h sti } } 在窗口第次被创建时会传送它WM_CREATE消息,这时initCom即可在主窗口关闭时即主窗口中收到 WM_DESTROY消息时Restore Comm恢复原来状态 这样在对串口化设置中断服务例程后通信事件发生时会立即跳入中断子中执行越过系统消息队列达到实时处理通信事件目而数据处理模块可通过全局标志f18访问全局数据通信缓冲区获取实时数据这种实现方式和基于消息机制Windows通信API实现相比具有实时性强特点它超过了Windows 系统两极消息机制上述已在实际系统中得到应用在windows3.1支持下同时运行 3个Windows任务服务器SERVER(内有实时串行通信多个网络数据子服务)客户CLIENT,FOXPRO数据库系统整个系统运行良好切换到WIN95平台下系统也运行良好 0
相关文章
读者评论
发表评论 |