基于ISA总线与KH-9300的数据采集系统软件设计
(1)编写中断服务程序由于产生中断时,必须保留被中断程序中断时的一些现场数据,即保存断点,这些值都在寄存器中,以便恢复中断时使这些值复原。以继续执行原来被中断的程序。 Turbo C为此提供一种新的函数类型:inter-rupt,它将保存由该类型函数所指寄存器的值,而在退出该函数时,再复原这些寄存器的值,因而用户的中断服务程序必须定义成该类型的函数,如中断服务程序名为myp,则可将这个函数说明为:
Void interrupt myp(unsigned bp,unsigned di,unsigned si,unsigned ds,unsigned es,unsigned dx,unsigned cx,unsignedbx,unsigned ax,unsiged ip,unsigned cs,unsigned flags)
小模式下程序只有1段,在中断服务程序中用户可像用无符号整数变量一样使用这些寄存器。若中断服务程序中不使用上述寄存器,则可不写这些寄存器参数,而写为:本文引用地址://m.amcfsurvey.com/article/195713.htm
对于硬件中断,则在中断服务程序结束前要将中断结束命令字送至系统的中断控制寄存器,其端口地址为0x20,中断结束命令字也为0x20,即outportb(0x20,0x20)。
在中断服务程序中,若不允许别的优先级较高的中断打断它,则要禁止中断,可用函数disable()来关闭中断。若允许中断,则可用开中断函数enable()来开启中断。
(2)安装中断服务程序定义中断服务程序后,还需将这个函数的人口地址填人中断向量表中,以便产生中断时程序能转入中断服务程序去执行。为防止正在改写中断向量表时,又产生别的中断而导致程序混乱,可先关闭中断,待改写完成后,再开启中断。
其中faddr是中断服务程序的入口地址,其函数名代表入口地址,而inum表示中断类型号,setvect()函数设置中断向量,上述定义的install()函数将完成把中断服务程序入口地址填入中断向量inum中。
(3)中断服务程序的激活对于硬件中断,在相应的中断请求线(IRQi,i=0,1,2,…,7)产生一个由低到高的中断请求电平,这个过程必需由接口电路来实现,这个电平可用程序控制实现,如发命令outportb(端口地址,命令)。然后程序等待中断,当中断产生时,便去执行中断。
(4)恢复被修改的中断向量为在主程序结束后,恢复原来的中断向量以指向原中断服务程序,在主程序开始时,存下原中断向量的内容,用getvect()实现,如j=(char*)getvect(0x1c),这样指针变量中将是0xlc中断程序的入口地址,当主程序结束时,可恢复原来的中断服务入口地址,可用setvect(0x1c,i),也可用install()函数再次安装。
4 程序设计
4.1 程序说明
程序主要分为主程序和中断处理子程序2部分。其中主要程序是采用 I/O接口的输入输出函数进行初始化。包括设置KH-9300定时计数器8254和中断控制器8259的工作方式、初值、开中断、触发方式,对计算机的 8259开中断等。在主程序的最后把采集的通道数据写入文件。而中断处理子程序是由CPU在每次接到IRQ5中断请求信号后立即执行,主要作用是把KH-9300卡的第2、3、4、5号通道的计数值采集到程序的变量中。主程序和中断处理子的程序流程分别如图1、图2所示。
4.2 编程注意事项
(1)不要用任何DOS功能调用,避免DOS重入。尽量避免使用与屏幕相关、检查状态、读键盘及任何磁盘I/O子程序:避免使用浮点(实数)运算。中断服务程序中所调用函数尽量是BIOS级库函数;(2)中断程序执行的时间应尽可能的短。若 ISR中消耗时间过长,在完成一次运行前有可能被再次调用,导致系统被挂起。(3)控制变量可以是全局变量,也可通过寄存器变量传递给interrupt 函数;(4)若实时控制系统对中断响应速度要求较高,可采用嵌入汇编技术。
评论