Windows 中断程序设计
挂住/解挂中断向量的时机很重要。主窗口第一次被创建时会传送它WM-CREATE消息,这时是挂住中断向量的最好时机。退出时需解挂向量,否则Windows可能崩溃。主窗口接收到WM-DE-STROY之后进行解挂工作,是最适合的。解挂向量可先用INT35H,0204H功能将老的中断向量保存,退出时用INT35H,0205H恢复。
五、编程实现
有了DPMI的支持,我们就可以很方便地处理数据采集、串行通信等工业过程中的实时事件。下面以Windows3.1平台下中断方式实现的串行通信为例,说明中断程序的编制和实现。为便于参考,给出了详细的代码。开发平台BC3.1/BC4.5,其本身支持0.9版的DPMI,无需运行其它支持DPMI的软件。编程语言C,可与C++混合编译。
初始化COM1,9600波特率,每字符8bits,1个停止位,中断接收,查询发送。
//windows asy communication
//by Li Xiuming
//last modified on June 25,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()
{ //串口1初使化
s8259=inportb(0x21); //读入8259当前状态并保存
outportb(0x21,s82590xe8); //初始化8259,允许0x0c号中断
outportb(0x3fb,0x83);
outportb(0x3f8,0x0c);
outportb(0x3f9,0x00);
outportb(0x3fb,0x03);
outportb(0x3fc,0x08); //允许中断信号送到8259A,以便能中断
outportb(0x3f9,0x01); //0x01,中断允许
return 1;
}
void interrupt far DataReceive()
{ //中断接收子程序
static int i=0; //静态局部变量
char rechar=0; //每中断一次,i自动加1
rechar=inportb(0x3f8); //从数据口读出发送过来的数据
if(inflag==0)
{
if(rechar!=?s? i==0) //帧起始
{
i=0;
goto ll;
}
datacom-r[i++]=rechar; //存入datacom-r[](通信缓冲区)
if(rechar==?e?) //帧结束
{
inflag=1;
i=0;
}
}
ll:outportb(0x20,0x20); //回送中断结束标志
}
//调用DPMI
//保存旧的0CH号保护模式中断向量
//设置新的保护模式中断服务例程
void InitCom(void)
{
asm{
cli
mov ax,204h
mov bl,0ch
int 31h
sti
}
old-vector=MK-FP(-CX,-DX);//保存
asm{ cli //设置新的0x0c中断服务例程
mov ax,205h
mov bl,0ch
mov cx,seg datareceive
mov dx,offset datareceive
int 31h
sti
}
InitCom1();
}
//恢复8259状态
//恢复0CH保护模式向量
void RestoreComm(void)
{
outportb(0x21,s8259);
asm{
cli
mov ax,205h
mov bl,0ch
mov cx,seg old-vector
mov dx,offset old-vector
int 31h
sti
}
}
在窗口第一次被创建时会传送它WM-CREATE消息,这时调用InitCom()即可。在主窗口关闭时,即主窗口中收到WM-DESTROY消息时,调用RestoreComm()恢复原来的状态。
这样在对串口初始化,设置中断服务例程后,通信事件发生时,会立即跳入中断子程序中执行,越过系统的消息队列,达到实时处理通信事件的目的。而数据处理模块可通过全局标志flag访问全局的数据通信缓冲区获取实时数据。这种实现方式与基于消息机制的Windows通信API实现相比具有实时性强的特点,因为它超过Windows系统的两极消息机制。
上述程序已在实际系统中得到应用。在Windows 3.1支持下,同时运行三个Windows任务:服务器SERVER(内有实时串行通信,多个网络数据子服务),客户CLIENT,FOXPRO数据库系统。整个系统运行良好。切换到WIN95平台下(支持0.9版DPMI),系统也运行良好。
参考文献
1 张豫夫、曹建文译.【澳】Barry Kauler著.Windows汇编语言及系统程序设计.北京大学出版社,1995
2 赵人任等译.【美】Mike Klein者.Windows程序员使用指南(一).北京:清华出版社,1995
3 刘林、陈红编译.80386硬件与接口技术.北京:北京希望电脑公司,1991
评论