2024年5月4日发(作者:)

霹i稍嘶s_20∞下使用浮誊+|誊承瞧蝴

中断处理和壬/o读写

|。簟i

万岁

一、引胃

众所周知,windows2000是目前主流操作系统。它提供

,=j

j。劈孝

本实例的硬件部分由一块IsA接n的B码板,一块lsA接

口的编码板组成。B码板解调出同步脉冲,接至控制计算机

IsA总线的中断IRQ7;编码板在同步脉冲触发中断到来后,

编码并且从I/o端口发送数据。要求在windows

2000操作系的多线程和多任务的工作机制,为测控系统中的实时系统测控

软件提供了良好的开发平台。但是wmdows2000采用特有的

系统保护模式,所有涉及物理内存、磁盘、巾断以及端口读写

的操作,都必须通过一个内核wDM(win32

D订ver

统中,应用程序能够进行中断处理和直接f/o端日读写。

首先.使用WinD而ver的Ddver

wizard,对B码板进行中断

设置和I/O地址设置.对编码板进行I/O地址设置、D^ver

wjzard有很好的向导功能,可以根据硬件没备的特点.生成库

M0dem)

驱动程序完成,禁止用户态的应用程序直接操纵硬件。

以前,windows系统下设备驱动程序的开发采用DDK工

具,这种方法对开发人员要求比较高,并且对大多数非专门驱

动程序的研发人员来说,为实现应用程序中中断处理和I/0

文件。库文件中包括上面设置的中断号、I/o地址等资源情

况。接下来,就可以编写自己的应用程序。利用wind矾姻

2000支持多线程的特点,将应用程序设计为单进程多线程,

线程定义为中断监视线程和端口读写线程。

2.设计实现

(1)winD^vcr库文件的使用

使用Vc十+6O的向导创建MFC形式的应用程序.将

winDdver根目录下的include目录中的windⅣr

h文件复制到

应用程序中。Ⅵndrvr.h是winDriver提供的一个资源库文件.

端口读写,f面去花费大量时间和精力学习驱动程序的编写,是

很不实际叉不经济的。现在有许多第三方公司提供的驱动程序

开发工具.如winD五ver、Ddverwork、vT00ls等。它们提供友

好的编泽界面,并且提供了一些功能函数,来支持用户完成访

问硬件的工作。

下面结合实例,详细介绍在Vc++6.0中借助winDnver

实现中断处理和直接I/O端口读写。里面有一些功能函数,在应用程序中使用这些函数,可直接操

控硬件。

二、软件编程与设计

1设计思想

(2)中断监视线程的设计

中断监视线程是优先级最高的线程。在线程主体中完成:

—Zdh㈧瞰钿舡■址■址d山蛐■蟛d苎.姒h蟛.昱抽蟛.芏龇h蟛础山甥破鼬h垃k扯埘扫射蛐h虹“唯时扫蛳b缝d由牡・lmh驰触"—L酗h蛐■“时mh缝・驻

PrlvateSubF0rm

Loaa{BVVal

senderAs

Svstem

Ob

Ject.

BvVa

As

SvstemEventA呜s)HandIesMyBase

Dlm

rec

As

New

ADODB

Recofdset()

2Ⅵ一1058为Msserver服务器名,叼一1059为0mcle

Load

服务器名,“user”,“p踮s”分别为用户名及口令。

3.一次只能连接一种数据库。要连接多种数据库要重新

定义ADOAccess对象。以上程序在Vlsual

通过。

studio

DB

DB

DB

ConnAccessf。e:\testmdb)

test)

’DBConnSQLServer(“wl一1058“

Conn0口BC(。test0DBC”】

COnnorac

NET中凋试

l’w

059

7,

sVstem”manage

rec=DB00enTabe{“DEM0

rec=DB

DB刚MsGrId(MSG

EndSub

d1rec)

customer)

0pen丁ab旧f“doc』et)

五、结论

卜面方法介绍了刚面世不久的VisualBagic.HET中有关数

据库的开发,ADO在vi叫a1

Basic.NE

说明:

l你的机上要有灿cess数据库文件(e:、test

mdb),Ms

server数据库中有数据库ten,docjile为其test巾的表,Oracle

数据库中有表DEMO.cu810mer.

r中的应用,连接几种最

实用的数据库,且介绍r编写组件的方法,并且通过实例开绍

了怎样调用该组件。利用该知识擞大地方便了软件开发者访问

数据的能力,提高了开发效率:

(收稿日期:2003年2月27目)

辨涵淼

万方数据 

调用winDdver提供的功能函数初始化B码板;调用封装的函

数In’e”uptThre“En出le(),诙封装函数调片i功能函数

wDJntw趾t()获取中断事件.一旦中断事件发生,立刻执行用

户定义的中断服务程序,在中断服务程序中设置同步事件有信

号。,

编程实例:

VOID

lSA-BIIhreaa

{HANDLEhwD

nof

A圾EndThreadlO)://结束线程

(3)端口读写线程的设计

本线程用来从编码板的端口凄取数据。在线程主体中完

成:初始化编码板;用API函数w撕tF0rsingleObject来等待同

步事件,一旦有I司步事件到来,则调用w-n嘶ver功能函数

used

wDJrans胁()来执}j凄端口操作。

编程实例:

V0lD

ISAjduthread【not+usedl

WD

VERSlONverBuf:

WD_CARD—REGlSTER

ca『dReq,

hTh

read.

(//‘///打开设备操作.获得版本信电操作司.卜买例////7

/////从T定义编码板中斫号及I/0地址/////

WD工ARD.旦EG【STER

cafdReq。

caraReqcara

WDJNTERRuPT….HANDLE

hwD=vvD』pen|}.//打开设备

jf{hwD==1NVALlDHANDLEVALUE)

{Af×MessageBo×(40pen

devIce

retum。

ror

7”).

dwlem=1:

cardReg

caraRea

ca

ca

rd

tem【0】item=lTEMJO,

fNotSharable=TRUE:

i0dwA0dr=ISAPDU

j0且DD只:

10

dwBvtes=lSAPDU_O_BYTES.

rd

Item【0l

///’//l—iT为琵得版本信息辟作/////

BZER0(verBuf),

caraReg

ca,a

ltem【0l

cardReg

ca

rdItem

ste

0】

WD』e

rslon《hwD,&verB

uf),/7返回版本后鼻

ffverBufdwve

r<WD_yER)

{Af×MessageBoxI

er

rorlncorrect

WD_cardReg

r{hwD,&ca,dReg).

_工(cardRe日hCard==0j

W1NDRVR

versIon’

),

(AfxMessageBox

C“Fa【Ied

loc㈦ngdevIce),

return

WD

clOse{hwD):

return

w圳e(mbEndThread==FALSE)

,,//,7/,牲T定义B码撅中断号夏I/0地址////

ca州Reg

cara

cardReg

ca

(swltch(Wa听o

rSIngIeoblect【h20Event.1NFINITE¨

(case

dw『fem=1.//硬件种类

ltem[O】fNotsha『abIe=TRUE://硬件设备不

WAlTDBJECT』:

trans.

rd

ResetEventf

h20EvenT),//h20Event

J同步事件信号

供其他d用

caraReg

ca,d

vvDJRANSFER

BZER0(tfans)。

trans

cardReg

RQ。

cardReg

lteml0]怕m=iTEMjNTERRu口T.//硬1上类型

ca刑ffemf0

J』…dwfnterrup扛BTfNUnte

r‘upcU—

cara恤m[O】

【…dw0鲫ons=BTNUnter

ruptU一

card

cmdTrans=RP_BY丁E,

dwP0

rl=dwl0Addr:

Data

Bvte=pdata,

trans

trans

0PTlONS:

cardReg

ca

w0Jransfer

ChwD.&trans),

itom【O】ltem=rrEMJO,

lO

break.

case

rdReg

cara{tem[O】l

dwAddr=IsABTjO_ADDR://端

dwByies=1SABTj0_BYTES.

vvArrTIMEOUT:

r】基地址

cardReg

card

break:

Jtem[O10

defau{t:

reak

/7端]地址范围

WD』araRegIste

r(hwD,&cardReg)

lf(cardReahCard==0)

(AfxMessageBo×(仁afIed10ckmg

dev}ce),

return

wD』a州Unreglster{hwD,&cafdRegl,

WD

C10se(hwD)。

w川e(m_bEndThread==FALSE

Af×EndTh

read(0):

Ⅲ(!|n

cerrup汀hreadEnabfe(&hThread,hwD.&1nt,BTlNT—

Inte

ruot0Hand

er

NULLl

reak:

三、结束语

按照上面的方法,町以很方便地实现板卡的中断处理和

/,//j////Pt下为线程;;止前的操作/////,/////,7///

vVDCardUn

reg

ster(hwD,&cardReg).//取消j王陟,群放

系玩资源

WD_Close{hwD).//关闭设备

I/O端厂1读写,从而不必编写复杂的驱动程序。实践证明是切

实有效的:

(收稿日期:2003年2月22日)

万方数据 

Windows 2000下使用VC++6.0实现中断处理和I/O读写

作者:

作者单位:

刊名:

英文刊名:

年,卷(期):

被引用次数:

周杰

电脑编程技巧与维护

COMPUTER PROGRAMMING SKILLS & MAINTENANCE

2003,(4)

0次

本文链接:/Periodical_

授权使用:吉林大学(jldx),授权号:8b30a267-4fce-43ac-87ac-9ec400ebac68

下载时间:2011年4月13日