关 闭

新闻中心

EEPW首页 > 工控自动化 > 设计应用 > Windows 中断程序设计

Windows 中断程序设计

作者: 时间:2012-10-19 来源:网络 收藏

挂住/解挂向量的时机很重要。主窗口第一次被创建时会传送它WM-CREATE消息,这时是挂住向量的最好时机。退出时需解挂向量,否则可能崩溃。主窗口接收到WM-DE-STROY之后进行解挂工作,是最适合的。解挂向量可先用INT35H,0204H功能将老的向量保存,退出时用INT35H,0205H恢复。

五、编程实现

有了DPMI的支持,我们就可以很方便地处理数据采集、串行通信等工业过程中的实时事件。下面以3.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访问全局的数据通信缓冲区获取实时数据。这种实现方式与基于消息机制的通信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


上一页 1 2 下一页

评论


相关推荐

技术专区

关闭