Google
 
高速随机数据流的中断驻留接收技术方案

作者: 王为民 武警技术学院光电系 710086
郭秀明 武警技术学院图书馆 710086
姜 琳 武警技术学院计算中心 710086
点此查看原贴
【摘要】本文给出了一种“ 高速随机数据流的中断驻留接收技术方案”,详细描述
了内存驻留中断接收、开设数据缓冲区、数据段地址保存、驻留/解除和数据缓冲区
读取,讨论了高级语言程序信息处理,举出了该技术方案在“程控电话自动计费系
统”中应用的实例,介绍了调试方法和步骤,给出了汇编语言中断驻留接收源程序
和高级语言读取数据缓冲区数据及调用源程序。

关键词:随机数据流 信息处理 软件技术 计算机应用

一、问题的提出
  对于测量控制、数据通信等许多计算机应用系统而言,应用系统既要完成对高
速串行随机数据流的实时信息接收任务,又要完成对接收数据的实时数据处理、自
动数据库管理、实时动态图形显示和各种统计报表生成/打印等信息处理任务。通
常,对接收数据的实时信息处理由高级语言程序在微机前台进行,而对高速串行随
机数据流的实时信息接收只能采用中断方式在微机后台进行。
  作者经过长期研究,摸索总结出了一种“ 高速随机数据流的中断驻留接收技术
方案”,该技术方案为高级语言程序在微机前台进行信息处理,中断驻留接收程序
在微机后台进行信息接收,采用该技术方案解决了高级语言程序同时进行信息处理和
信息接收在时间上相互冲突的矛盾。在“程控电话自动计费系统”中采用该技术方
案,解决了跑单问题,实践证明:该技术方案切实可行,技术先进,可操作性强,
具有一定的推广应用价值。
二、中断驻留接收技术方案
1、内存驻留中断接收
  根据被接收数据是高速串行随机数据流这一特点,用汇编语言或C语言编制一个
中断驻留接收程序,常驻留内存,完成对高速随机数据流的中断驻留接收任务。
2、开设数据缓冲区
  中断驻留接收程序在内存中开设一个数据缓冲区,用于暂存高速串行随机数据
流。该数据缓冲区为循环存储结构,定义数据缓冲区读/写指针为 RP/WP,中断驻
留接收程序初始化RP/WP均指向数据缓冲区首单元;进入微机串行通信口COM中断,
中断驻留接收程序将接收到的字节数据存入写指针指向的数据缓冲区单元,然后,
写指针WP加一,当写指针超出数据缓冲区时,写指针返回到初始位置。
3、数据段地址保存
内存中断驻留初始化程序初始化时,将中断驻留接收程序数据段地址DS保存在内存
中断矢量表为用户程序保留的空闲单元(例如 0:03C8H~0:03C9H) ,以便高级语言
程序访问数据缓冲区和读/写指针单元时用。

4、驻留/解除
  内存中断驻留初始化程序首先进行驻留/解除处理。
若未驻留过,则进行驻留过程,步骤如下:
①初始化微机串行通信口COM
②初始化中断屏蔽寄存器
③保存原有中断矢量 
④用中断驻留接收程序的段地址和偏移量初始化内存中断矢量表 
⑤保存数据段地址DS 
⑥初始化读/写指针 
⑦驻留中断接收程序 
⑧返回操作系统

若已经驻留过,则进行解除过程,步骤如下:
①恢复原有中断矢量
②释放内存空间 
③返回操作系统。
5、数据缓冲区读取
  用C语言或QBASIC语言编制一个“读取数据缓冲区数据”应用程序,该应用程序
经编译、连接后,生成一个可执行文件,供高级语言信息处理程序调用。“读取数
据缓冲区数据”应用程序功能如下:
1、打开一个输出数据文件
2、在内存中断矢量表指定单元读取中断驻留接收程序数据段地址DS
3、以DS为段地址,在内存指定单元读取读/写指针RP/WP
4、比较RP和WP,若RP等于WP,则给数据文件写标志字节 00H,关闭数据文件,返回
调用;若RP不等于WP,则先给数据文件写标志字节01H,然后从读指针指向单元读取
一个字节数据,写入数据文件,读指针加一,当读指针RP超出数据缓冲区时,使读
指针返回起始位置;识别接收数据,若不是指定的信息包结束标志字节,则继续重
复上述读取数据操作,直到信息包结束标志字节被接收为止,关闭数据文件,返回
调用。
三、高级语言信息处理
  当在微机前台工作的高级语言信息处理程序可以处理一个信息包时,调用一次
上述“读取数据缓冲区数据”应用程序,然后打开上述生成的数据文件,读取第一
个标志字节,若它为零,则关闭已打开的数据文件,继续执行后续程序;若它为1,
则从第二个字节开始连续读取字节信息,直至读完一个信息包为止,关闭已打开的
数据文件,再对信息包进行信息处理。

四、应用实例
  采用上述技术方案,对数字程控交换机计费端口输出到微机串行通信口的电话
计费信息进行后台中断驻留接收/缓冲/暂存,前台以 UCDOS60 为中文平台,
FOXRPO 2.5B为数据库管理软件,对程控电话计费信息进行实时处理、显示、自动数
据库管理、多种统计报表自动生成和输出打印。程控电话计费信息特征为 ①高速串
行随机数据流 ②数据通信速率 300 ~9600 bps ③数据帧格式为八位数据位、无奇
偶校验位、一位停止位 ④计费信息包长度为72字节⑤计费信息包结束标志字节为
0AH。电话计费信息流由微机串行通信口COM1输入;中断驻留接收程序数据段地址
DS保存在内存中断矢量表 0:03C8H~0:03C9H 单元,数据缓冲区容量为2KB,数据缓
冲区空间为DS:0200H~DS:09FFH,读指针单元 DS:0103H~0104H,写指针单元
DS:0105H~0106H;采用 INT60 (60H是为用户程序保留的中断类型号)中断作为与
常驻留程序连通之管道,当常驻留程序收到此中断信号时,便将所有中断向量还
原,并释放内存空间;高级语言读取数据缓冲区数据及调用源程序见附录一,汇编
语言中断驻留接收源程序见附录二。
五、调试方法和步骤
1、编写汇编语言中断驻留接收源程序
用汇编语言在文件编辑器上编写中断驻留接收源程序 *.asm,其格式应符合COM文件
格式要求。
2、汇编中断驻留接收源程序
用Borland Turbo Assembler v3.0 软件中的 Tasm.exe 对上述中断驻留接收源程序
进行汇编,生成目标文件 *.obj。
方法:C:\TD\TASM *
3、连接中断驻留接收目标文件
用Turbo C 2.0 或 Turbo C++ 3.0 软件中的 Tlink.exe 对上述目标文件进行连
接,生成COM文件 *.com。
方法:c:\td\tlink/t *
4、中断驻留
执行上述COM文件*.com,就完成了中断驻留接收程序的内存中断驻留任务。
5、调试中断驻留接收程序
用Debug在内存零段偏移地址为 03C8H~03C9H两单元查找数据段地址DS;再以DS为
段地址偏移地址为0103H~0106H 四个单元检查读/写指针是否正确。
6、模拟发送
由微机另外一个串行通信口向中断驻留接收串行通信口模拟发送一个信息包,再用
debug检查读/写指针单元的读/写指针是否正确,并观察数据缓冲区DS:0200H~
DS:09FFH是否有接收数据,收/发数据是否一样。
7、模拟接收
用附录一所示QBASIC高级语言读取数据缓冲区数据及调用源程序进行模拟接收,观
察接收效果。


六、结束语
  上述技术方案不仅适用于对高速串行随机数据流的实时信息接收和处理,也适
用于对高速并行随机数据流的实时信息接收和处理;上述实例数据缓冲区容量为
2KB,根据实际需要也可以增大或减小数据缓冲区容量;为了提高读/写磁盘和数据
传输速率,高级语言读取数据缓冲区数据及调用源程序采用RAM DISK 暂存数据文
件;可用Norton程序集中Sysinfo.exe程序在内存中断矢量表中查找为用户程序保留
的空闲单元;对高速串行随机数据流的实时信息接收也可采用智能信息采集卡来完
成,但要付出硬件开支;该技术方案属于多任务分级数据处理范畴,在计算机数据
通信系统和测量控制管理计算机应用综合系统中有着重要应用价值。

参考文献:
⒈宏汇编语言程序设计 张怀莲 电子工业出版社
⒉软盘加密与解密新技术 范修维 清华大学出版社

附录一:
高级语言读取数据缓冲区数据及调用源程序
REM XXCLXT.BAS
DECLARE SUB XXCL786 ( )
5 CALL XXCL786: IF INKEY$ <> "" THEN 60
10 OPEN "E:\JF.DAT" FOR INPUT AS #1
15 INPUT #1, FLAG
20 IF FLAG = 0 THEN 40
25 INPUT #1, RD
30 PRINT CHR$(RD);
35 IF RD <> 10 THEN 25
40 CLOSE #1
45 FOR K = 1 TO 20000
50 NEXT K
55 GOTO 5
60 STOP
65 END

SUB XXCL786
100 OPEN "E:\JF.DAT" FOR OUTPUT AS #1
110 DEF SEG = &H0
120 DSL = PEEK(&H3C8)
130 DSH = PEEK(&H3C9)
140 DS = DSH * 256 + DSL
150 DEF SEG = DS
160 RPL = PEEK(&H103)
170 RPH = PEEK(&H104)
180 RP = RPH * 256 + RPL
190 WPL = PEEK(&H105)
200 WPH = PEEK(&H106)
210 WP = WPH * 256 + WPL
220 IF RP = WP THEN 360
230 PRINT #1, 1;
240 WPL = PEEK(&H105): IF INKEY$ <> "" THEN 370
250 WPH = PEEK(&H106)
260 WP = WPH * 256 + WPL
270 IF RP = WP THEN 240
280 RD = PEEK(RP): RP = RP + 1
290 IF RP = &H0A00 THEN RP = &H0200
300 PRINT #1, RD;
310 IF RD <> 10 THEN 240
320 RPH = INT(RP / 256)
330 RPL = RP - RPH * 256
340 POKE &H103, RPL
350 POKE &H104, RPH
360 PRINT #1, 0
370 CLOSE #1
END SUB

附录二:
汇编语言中断驻留接收源程序
code segment
assume cs:code,ds:code
org 0100h
start:
jmp init
;****** data area **********
rp dw ?
wp dw ?
old_int0c dd ?
old_int60 dd ?
imwm db ?
imws db ?
org 0200h
dloop db 2048 dup(?)
;****** int irq4 ************
;com1 port
new_int0c proc far
push ax
pushf
pop ax
and ah,0feh
push ax
popf
in al,21h
mov cs:imwm,al
or al,0fbh
out 21h,al
in al,0a1h
mov cs:imws,al
or al,0feh
out 0a1h,al
sti
push dx
push ds
push es
push di
mov dx,3fdh
in al,dx
test al,01h
jz new_int0c2
mov ax,cs
mov es,ax
mov di,cs:wp
mov dx,3f8h
in al,dx
mov es:[di],al
inc di
cmp di,0a00h
jne new_int0c1
mov di,0200h
new_int0c1:mov cs:wp,di

new_int0c2:pop di
pop es
pop ds
pop dx
mov al,cs:imwm
out 21h,al
mov al,cs:imws
out 0a1h,al
mov al,20h
out 20h,al
mov al,20h
out 0a0h,al
pop ax
iret
new_int0c endp
;****** int 60h **********
new_int60 proc far
push ax
push bx
push cx
push dx
push ds
mov dx,cs:word ptr old_int0c
mov ds,cs:word ptr old_int0c[2]
mov ax,250ch
int 21h
mov dx,cs:word ptr old_int60
mov ds,cs:word ptr old_int60[2]
mov ax,2560h
int 21h
pop ds
pop dx
pop cx
pop bx
pop ax
sti
iret
new_int60 endp

;***** main program **********
init:
sti
mov ax,3560h
int 21h
mov ax,es
cmp ax,0000h
je done
int 60h
push es
mov ax,es:[2ch]
mov es,ax
mov ah,49h
int 21h
pop es
mov ah,49h
int 21h
int 20h
done: mov word ptr old_int60,bx
mov word ptr old_int60[2],es
mov dx,offset new_int60
mov ax,2560h
int 21h
mov ax,350ch
int 21h
mov word ptr old_int0c,bx
mov word ptr old_int0c[2],es
mov dx,offset new_int0c
mov ax,250ch
int 21h

push es
mov ax,0
mov es,ax
mov ax,ds
mov es:[03c8h],ax
pop es
mov dx,3fbh
mov al,80h
out dx,al
mov dx,3f8h
mov al,18h
out dx,al
mov dx,3f9h
mov al,00h
out dx,al
mov dx,3fbh
mov al,03h
out dx,al
mov dx,3fch
mov al,0fh
out dx,al
mov dx,3f9h
mov al,01h
out dx,al
in al,21h
and al,0efh
out 21h,al
mov bx,offset dloop
mov wp,bx
mov rp,bx
mov dx,3f8h
in al,dx
sti
mov dx,offset init
int 27h
code ends
end start