下面我们首先介绍DPMI接口,然后基于它实现Windows下中断服务程序的设计。 四、DOS保护模式接口 DMPI Windows除了标准服务外,还支持一组特殊的DOS服务,称为DOS保护模式接口 DPMI,由一些INT2FH和INT31H服务组成。它使应用程序能够访问 PC系列计算机的扩充内存,同时维护系统的保护功能。 DPMI通过软件中断31h来定义了一个新的接口,使得保护模式的应用程序能够用它作分配内存,修改描述符以及调用实模式软件等工作。 Windows为应用程序提供 DPMI服务。即Windows是DPMI的宿主(host),应用程序是DPMI的客户(client),可通过INT31H调用得到DPMI服务。INT 31H本身提供多功能。其中它的中断管理服务允许保护模式用于拦截实模式中断,并且挂住处理器异常。有些服务能够和 DPMI宿主合作,以维护应用程序的虚拟中断标志。 可以用INT31H来挂住保护模式中断向量,以中断方式处理外部实时事件。利用 INT 21H,功能0205H:设置保护模式中断向量,将特定中断的保护模式处理程序的地址置入中断向量里。调用方式: AX=0205H,BL=中断号,CX:(E)DX=中断处理程序选择符:偏移值。返回:执行成功CF=清零,执行失败CF,置位。 挂住/解挂中断向量的时机很重要。主窗口第一次被创建时会传送它WM—CREATE消息,这时是挂住中断向量的最好时机。退出时需解挂向量,否则Windows可能崩溃。上窗口接收到WM_DESTROY之后进行解挂工作,是最适合的。解挂向量可先用INT35H,0204H功能将老的中断向量保存,退出时用INT35H,0205H恢复。 五、编程实现 有了DPMI的支持,我们就可以很方便地处理数据采集、串行通信等工业过程中的实时事件。下面以Windows3.1平台下中断方式实现的串行通信为例,说明中断程序的编制和实现。为便于参考,给出了详细的代码。开发平台BC3.1/BC4.5,其本身支持0.9版的DPMI,无需运行其它支持DPMI的软件。编程语言C,可与C++混合编译。 初始化COM1,9600波特率,每字符8bits,1个停止位,中断接收,查询发送。 //windows asy COmmunica60n //by Li Xiumi98 //last modified on June25,1996 #include<windows.h> #include<dos.h> void interrupt far DataReceive() ; void interrupt far( * old_vector)(); unsigned char dataCom_r[1024],datacom_s[1024]: int inflag=0 ; unsigned int s8259;
int InitCom1() { s8259=inportb(0x21); outportb(0x21,s8259&0xe8); outportb(0x3fb,0x83); outportb(0x3f8,0x0c); outportb(0x3f9,0x00); outportb(0x3fb,0x03); outportb(0x3fc,0x08); outportb(0x3f9,0x01); return 1; }
void interrupt far DataReceive() { static int i=0 ; char rechar =0 ; rechar=inportb(0x3f8); if(inflag==0) { if(rechar!='s'&&i==0) { i=0; goto l1; } datacom_r[i++]=rechar; if(rechar=='e') { inflag=1; i=0; } } l1:outportb(0x20,0x20); }
void InitCom(void) { asm{ cli; mov ax,204h mov bl,0ch int 31h sti } old_vector=MK_FP(_CX,_DX); asm{ cli mov ax,205h
上一篇:Windows应用程序设计的基本术语
下一篇:八皇后问题的java实现
|