保护模式软件开发环境DJGPP在实时高速数据采集中的应用
http://www.bjx.com.cn/files/wx/xddzjs/2003-11/15.htm
高强业,王宪平,李圣怡,白奉天
(国防科技大学 机电工程与自动化学院湖南 长沙410073)
摘 要:介绍一种DOS下的32位C/C++保护模式软件开发环境DJGPP,他通过DPMI(DOS保护模式接口)实现DOS下32位保护模式软件的开发。结合嵌入式计算机PC/104及12位DAS模块PCM3718HG,具体说明DJGPP在实时、高速数据采集情况下的应用,有较强的实用性。
关键词:DPMI(DOS保护模式接口);实时;实模式;保护模式
Borland C是一款功能强大使用方便的DOS下的C语言开发环境,适用于大多数情形下DOS应用程序的开发。可是,当涉及到大量的高速数据采集时,用Borland C就不是很合适,因为他是工作在16位实模式下,编程时往往会因为1 MB的内存限制而碍手碍脚(用BC写32位程序并不是很方便),而DJGPP却可以很好地解决这个问题。DJGPP为一种DOS下的32位C/C++保护模式软件开发环境,他通过DPMI(DOS保护模式接口)接口实现DOS下32位保护模式软件的开发,很好地克服了1 MB内存的限制,这对于开发小型的实时高速数据采集系统不失为一种好的选择。
1DOS保护模式接口DPMI
Windows是工作在保护模式下的,他除了提供标准服务外,还支持一组特殊的DOS服务,称为DOS保护模式接口DPMI,由一些INT 2FH和INT 31H服务组成。他使应用程序能够访问PC系列计算机的扩充内存,同时维护系统的保护功能。INT 2FH为实模式下的调用,通过他可以获得实模式到保护模式的交换入口,调用实模式-保护模式的交换入口指针。INT 31H为保护模式下的调用, DPMI通过INT 31H来定义了一个新的接口,使得保护模式的应用程序能够用他作分配内存、修改描述符以及调用实模式软件等工作。
DPMI是由Microsoft,Intel,IBM,Lotus,Phar Lap,Rational systems,Borland,Quarterdeck及其他公司等联合建立的一种约定,他规定了一组服务程序,并可在保护模式下使用INT 31H来调用他们。这些服务程序的提供者,被称之为DPMI服务程序(server),如Microsoft Windows 3.0,Watcom的DOS/4GW,PMODE以及在将要介绍的DJGPP里要用到的CWSDPMI等,而这些服务程序的使用者,被称之为客户程序(client),如保护模式下的DOS扩展程序。
DPMI服务程序可以提供以下的服务:
(1)扩充内存的管理;
(2)描述符表的管理;
(3)中断及异常的管理;
(4)保护模式及实模式应用程序的通信;
(5)实模式调用的仿真;
(6)调试管理;
(7)DMA虚拟。
DPMI服务程序可由多种不同环境来建立,包括OS/2 2.0甚至UNIX,提供了在各种不同环境下,运行扩展的DOS应用程序的途径。
2DJGPP的安装及编制的集成开发环境RHIDE
DJGPP为DOS下32位C/C++保护模式软件开发环境,是一个GNU软件,即共享软件,可以通过网络得到他整个系统的源代码,并且可以任意修改。DJGPP的源程序按照内容被分割成许多压缩子文件,可以根据自己的需要,下载安装所需要的子源文件。
DJGPP的安装很简单,只要把所需的压缩子源文件解压到指定的路径即可,一般都安装到C盘根目录下的文件夹DJGPP中。可以在DOS下用pkunzip或unzip32来解压,也可以在Windows下解压,但是要注意,一定要用支持长文件名的解压程序,否则,在使用时可能找不到超过DOS的8+3文件格式的库文件和头文件。
DJGPP安装好以后,接下来就需装载DPMI服务程序,即保护模式引擎。DJGPP专用的DPMI服务程序有CWSDPMI,他是纯32位程序,使用线性地址;具有虚拟内存管理功能;可以使用所有硬件资源;可以直接对I/O口直接编程等。为了简化程序设计,CWSDPMI已经把大部分的DPMI接口融合到他的运行时库里,程序员只要调用C函数即可,而无需直接调用DPMI功能。CWSDPMI的装载方法同上,但解压后需在DOS下运行一次CWSDPMI.EXE,这样CWSDPMI才算正式装载完毕,接下来设置一下环境变量,就可以随便做自己想做的事情。
DJGPP拥有丰富的外围软件,尤其是专为DJGPP编制的集成开发环境RHIDE,他的界面是按照BORLAND C/C++3。1仿制而成,所有的操作及功能键都很雷同,他内置的DEBUG不仅功能超过了TURBO DEBUG,而且稳定性一流。同时这套IDE(集成开发环境)不仅支持C,而且支持C++,OBJ C,PASCAL ASM,ADA等多种语言,使得混合编程极为容易。最为难能可贵的是,在RHIDE界面的右上角还可以显示应用程序可以使用的虚拟内存和物理内存。例如,笔者使用的是内存为62 MB的嵌入式计算机PC/104,当使用RHIDE时,他的右上角会显示为184 M/57 M,即应用程序可以使用184 MB虚拟内存及高达57 MB的DPMI物理内存,这对实时高速数据采集非常重要。
目前,DJGPP还不是很完善,也有许多BUG,但比起其他商业化的C系统,他的发展要快得多,因为他是GNU软件,无数计算机高手在不断地完善他,为他注入新的活力,被发现的BUG也会在第一时间被去除。
3应用实例
我们用PC/104及12位DAS模块PCM3718HG进行A/D转换及数据采集,PCM3718HG为美国AD公司生产的A/D板,他通过PC总线接口接到PC/104上,可以接16个单端模拟输入或8个双端模拟输入。
我们的实验系统工作时间很短,所以采集数据的时间也很短(最短时仅为3 s),而且采集的数据量较大,因此,如果数据采集应用程序能够不受实模式下1 MB内存限制,可以使用扩充内存的话,将会极大地提高数据处理的速度,更好地保证系统的实时性。
鉴于DJGPP不受1 MB内存限制可以任意使用物理内存的特点,这里采用RHIDE来编制数据采集应用程序。可以先建立一个或几个很大的缓冲区(数组)来存放数据,等到数据采集完毕以后,再把采集的数据从内存中导出来。
他之所以在DOS下编程而不在Windows下:Windows的强大功能及良好的图形用户界面(GUI)是不可否认的,但是在Windows下并不能直接对I/O端口进行操作,而在DOS下却可以。在本例中,通过I/O端口直接对PCM3718HG中的寄存器进行读写,操作非常方便。
下面给出本例在RHIDE中用C语言编制的数据采集应用程序的部分源程序,这里我们用了DAS模块PCM3718HG的6个双端模拟输入端口,进行6路数据采集。源程序如下:






该程序与一般的DOS下的C程序基本一样,区别只是在于缓冲区(数组)的大小。在该程序里定义了6个2 MB的缓冲区,当然还可以更大一些,因为程序可以使用的DPMI物理内存达到57 MB,而在BC 3.1里这根本是不可能的。在RHIDE里,程序的编译、连接操作和在BC 3.1里一模一样。上述源程序在RHIDE中经过编译、连接后生成了SIXCHANNEXE可执行文件,该文件执行后,成功地实现了数据的采集并将数据导入到PC/104中的FLASH卡中。
4结语
鉴于Windows的强大功能及友好的图形用户界面,很多人选择在Windows下编制数据采集实时软件。但是如果大家能够回过头来,尝试一下在DOS下用DJGPP编制实时软件,说不定会给大家一个意外的惊喜。
参考文献
[1]Andrew Schulman,等.未公开的DOS核心技术[M].熊桂喜,等译北京:清华大学出版社,1992
[2]任大庆.保护模式DOS程序设计原理与方法[J].内蒙古大学学报,1996,(6)
[3]DJ Delorie. README1ST file for DJGPP Version 2.03
[ Last edited by firstsail on 2008-11-27 at 18:13 ]
http://www.bjx.com.cn/files/wx/xddzjs/2003-11/15.htm
高强业,王宪平,李圣怡,白奉天
(国防科技大学 机电工程与自动化学院湖南 长沙410073)
摘 要:介绍一种DOS下的32位C/C++保护模式软件开发环境DJGPP,他通过DPMI(DOS保护模式接口)实现DOS下32位保护模式软件的开发。结合嵌入式计算机PC/104及12位DAS模块PCM3718HG,具体说明DJGPP在实时、高速数据采集情况下的应用,有较强的实用性。
关键词:DPMI(DOS保护模式接口);实时;实模式;保护模式
Borland C是一款功能强大使用方便的DOS下的C语言开发环境,适用于大多数情形下DOS应用程序的开发。可是,当涉及到大量的高速数据采集时,用Borland C就不是很合适,因为他是工作在16位实模式下,编程时往往会因为1 MB的内存限制而碍手碍脚(用BC写32位程序并不是很方便),而DJGPP却可以很好地解决这个问题。DJGPP为一种DOS下的32位C/C++保护模式软件开发环境,他通过DPMI(DOS保护模式接口)接口实现DOS下32位保护模式软件的开发,很好地克服了1 MB内存的限制,这对于开发小型的实时高速数据采集系统不失为一种好的选择。
1DOS保护模式接口DPMI
Windows是工作在保护模式下的,他除了提供标准服务外,还支持一组特殊的DOS服务,称为DOS保护模式接口DPMI,由一些INT 2FH和INT 31H服务组成。他使应用程序能够访问PC系列计算机的扩充内存,同时维护系统的保护功能。INT 2FH为实模式下的调用,通过他可以获得实模式到保护模式的交换入口,调用实模式-保护模式的交换入口指针。INT 31H为保护模式下的调用, DPMI通过INT 31H来定义了一个新的接口,使得保护模式的应用程序能够用他作分配内存、修改描述符以及调用实模式软件等工作。
DPMI是由Microsoft,Intel,IBM,Lotus,Phar Lap,Rational systems,Borland,Quarterdeck及其他公司等联合建立的一种约定,他规定了一组服务程序,并可在保护模式下使用INT 31H来调用他们。这些服务程序的提供者,被称之为DPMI服务程序(server),如Microsoft Windows 3.0,Watcom的DOS/4GW,PMODE以及在将要介绍的DJGPP里要用到的CWSDPMI等,而这些服务程序的使用者,被称之为客户程序(client),如保护模式下的DOS扩展程序。
DPMI服务程序可以提供以下的服务:
(1)扩充内存的管理;
(2)描述符表的管理;
(3)中断及异常的管理;
(4)保护模式及实模式应用程序的通信;
(5)实模式调用的仿真;
(6)调试管理;
(7)DMA虚拟。
DPMI服务程序可由多种不同环境来建立,包括OS/2 2.0甚至UNIX,提供了在各种不同环境下,运行扩展的DOS应用程序的途径。
2DJGPP的安装及编制的集成开发环境RHIDE
DJGPP为DOS下32位C/C++保护模式软件开发环境,是一个GNU软件,即共享软件,可以通过网络得到他整个系统的源代码,并且可以任意修改。DJGPP的源程序按照内容被分割成许多压缩子文件,可以根据自己的需要,下载安装所需要的子源文件。
DJGPP的安装很简单,只要把所需的压缩子源文件解压到指定的路径即可,一般都安装到C盘根目录下的文件夹DJGPP中。可以在DOS下用pkunzip或unzip32来解压,也可以在Windows下解压,但是要注意,一定要用支持长文件名的解压程序,否则,在使用时可能找不到超过DOS的8+3文件格式的库文件和头文件。
DJGPP安装好以后,接下来就需装载DPMI服务程序,即保护模式引擎。DJGPP专用的DPMI服务程序有CWSDPMI,他是纯32位程序,使用线性地址;具有虚拟内存管理功能;可以使用所有硬件资源;可以直接对I/O口直接编程等。为了简化程序设计,CWSDPMI已经把大部分的DPMI接口融合到他的运行时库里,程序员只要调用C函数即可,而无需直接调用DPMI功能。CWSDPMI的装载方法同上,但解压后需在DOS下运行一次CWSDPMI.EXE,这样CWSDPMI才算正式装载完毕,接下来设置一下环境变量,就可以随便做自己想做的事情。
DJGPP拥有丰富的外围软件,尤其是专为DJGPP编制的集成开发环境RHIDE,他的界面是按照BORLAND C/C++3。1仿制而成,所有的操作及功能键都很雷同,他内置的DEBUG不仅功能超过了TURBO DEBUG,而且稳定性一流。同时这套IDE(集成开发环境)不仅支持C,而且支持C++,OBJ C,PASCAL ASM,ADA等多种语言,使得混合编程极为容易。最为难能可贵的是,在RHIDE界面的右上角还可以显示应用程序可以使用的虚拟内存和物理内存。例如,笔者使用的是内存为62 MB的嵌入式计算机PC/104,当使用RHIDE时,他的右上角会显示为184 M/57 M,即应用程序可以使用184 MB虚拟内存及高达57 MB的DPMI物理内存,这对实时高速数据采集非常重要。
目前,DJGPP还不是很完善,也有许多BUG,但比起其他商业化的C系统,他的发展要快得多,因为他是GNU软件,无数计算机高手在不断地完善他,为他注入新的活力,被发现的BUG也会在第一时间被去除。
3应用实例
我们用PC/104及12位DAS模块PCM3718HG进行A/D转换及数据采集,PCM3718HG为美国AD公司生产的A/D板,他通过PC总线接口接到PC/104上,可以接16个单端模拟输入或8个双端模拟输入。
我们的实验系统工作时间很短,所以采集数据的时间也很短(最短时仅为3 s),而且采集的数据量较大,因此,如果数据采集应用程序能够不受实模式下1 MB内存限制,可以使用扩充内存的话,将会极大地提高数据处理的速度,更好地保证系统的实时性。
鉴于DJGPP不受1 MB内存限制可以任意使用物理内存的特点,这里采用RHIDE来编制数据采集应用程序。可以先建立一个或几个很大的缓冲区(数组)来存放数据,等到数据采集完毕以后,再把采集的数据从内存中导出来。
他之所以在DOS下编程而不在Windows下:Windows的强大功能及良好的图形用户界面(GUI)是不可否认的,但是在Windows下并不能直接对I/O端口进行操作,而在DOS下却可以。在本例中,通过I/O端口直接对PCM3718HG中的寄存器进行读写,操作非常方便。
下面给出本例在RHIDE中用C语言编制的数据采集应用程序的部分源程序,这里我们用了DAS模块PCM3718HG的6个双端模拟输入端口,进行6路数据采集。源程序如下:






该程序与一般的DOS下的C程序基本一样,区别只是在于缓冲区(数组)的大小。在该程序里定义了6个2 MB的缓冲区,当然还可以更大一些,因为程序可以使用的DPMI物理内存达到57 MB,而在BC 3.1里这根本是不可能的。在RHIDE里,程序的编译、连接操作和在BC 3.1里一模一样。上述源程序在RHIDE中经过编译、连接后生成了SIXCHANNEXE可执行文件,该文件执行后,成功地实现了数据的采集并将数据导入到PC/104中的FLASH卡中。
4结语
鉴于Windows的强大功能及友好的图形用户界面,很多人选择在Windows下编制数据采集实时软件。但是如果大家能够回过头来,尝试一下在DOS下用DJGPP编制实时软件,说不定会给大家一个意外的惊喜。
参考文献
[1]Andrew Schulman,等.未公开的DOS核心技术[M].熊桂喜,等译北京:清华大学出版社,1992
[2]任大庆.保护模式DOS程序设计原理与方法[J].内蒙古大学学报,1996,(6)
[3]DJ Delorie. README1ST file for DJGPP Version 2.03
[ Last edited by firstsail on 2008-11-27 at 18:13 ]
