1、北京阿尔泰科技发展有限公司 软件版本:5.0 发行时间:2001 年 12 月1PCI2010 Win95/98/NT/2000 驱 动 程 序 使 用 说 明 书请您务必阅读使用 纲要 ,他会使您事半功倍!目 录 第一章 版权 信息第二章 绪 论第一节 使用纲要第二节 驱动程序功 能概述第三章 PCI 即插即用设备 驱动程序安装第一节 Windows95、98、 Me 环境下 PCI 设备驱 动程序安装第二节 WindowsNT 环 境下 PCI 设备 及驱 动程序安装第三节 Windows2000 环境下 PCI 设备及驱动程 序安装第四节 PCI 接口程序及测试、示范程 序的安装第五节
2、PCI 设备软件测试系 统的介绍第六节 本驱动 程序软件的关键文件第四章 PCI 即插即用设备操作函数接口介绍第一节 设备驱 动接口 函数列表第二节 设备对 象管理函数原型说明第三节 程序查询方 式 AD 采样操作 函数原型说明第四节 中断方式 AD 采样操作函数原型说明第五节 AD 硬件参数系统保存与读取函数原型说明第六节 程序方式输出 DA 函数原型说明第七节 测频函数原型说明第八节 简易 的数字 IO 输入输出开关量操作函数原型说明第九节 PCI 内存映射寄存器操作函 数原型说明第五章 共用函数介绍第一节 公用接口函数列表第二节 公用接口函数原型说明第三节 其他函数第六章 硬件参数结构第
3、一节 AD 硬 件参数 结构 (PCI2010_PARA_AD)第二节 用于 数字 I/O 输出参数 (PCI2010_PARA_DO ) 第三节 用于数字 I/O 输入参 数(PCI2010_PARA_DI)第七章 数据转换与排列规则第一节 如何将 AD 原 始数据 LSB 转换电压值 Volt第二节 DA 的电压值如何转换成输出到 DA 转换器的 LSB 原码数据第三节 关于采集函数的 PADBuffer 缓冲区中的数据排放规则第四节 关于测试应用程序创建并形成的 数据文件格式第八章 上层用户函数接口应用实例第一节 怎样使用 ReadDeviceProAD_NotEmpty 函数直 接取得
4、 AD 数据第二节 怎样使用 ReadDeviceProAD_Half 函数直接取得 AD 数据第三节 怎样使用 ReadDeviceIntAD 函数直接取得 AD 数据第四节 怎样使用 SetDeviceDO 函数进行更便捷的数字开关量输出操作第五节 怎样使用 GetDeviceDI 函数进行更便捷的数字开关量输入操作第九章 底层用户函数接口应用 实例第一节 怎样使用映射寄存器读写函数直接编写 DA 的底层输出程序?第二节 怎样使用映 射寄存器读写函数直接编写开关量输入输出程序第十章 高速大容量、连续不 间断数据采集及存盘技术详解第一节 使用程序查询方式实现 该功能第二节 使用中断方式实现该
5、功能附录 A LabView/CVI 图形语言专述北京阿尔泰科技发展有限公司 软件版本:5.0 发行时间:2001 年 12 月2第一章 图形化编程语 言 LabVIEW 环 境及其开放性第二章 LabView 驱动 程序接口第一节 内 嵌式驱 动程序介绍第二节 内嵌式驱 动器的原 型说明第三节 如何使用我 公司的现有的驱动接口直接创建外挂式设备驱动器第四节 如何使用我 公司 为用 户已定制好的外挂式驱动器第五节 如何在 LabView 中用上层函数实 现 AD 采集第六节 怎样用上层函数实现 DA 的输出操作第七节 怎样 用上层函数实现开 关量输入输出操作第一章 版权信息本软件产品及相关套件
6、均属北京市阿尔泰科技发展有限公司所有,其产权受国家法律绝对保护,除非本公司书面允许,其他公司、单位、我公司授权的代理商及个人不得非法使用和拷贝,否则将受到国家法律的严厉制裁。您若需要我公司产品及相关信息请及时与我们联系,我们将热情接待。第二章 绪 论第一节、使用纲要一、使用上层用户函数,高效、简单如果您只关心通道及频率等基本参数,而不必了解复杂的硬件知识和控制细节,便可如能所需,那么我们强烈建议您使用上层用户函数,它们就是几个简单的形如 Win32 API 的函数,具有相当的灵活性、可靠性和高效性。诸如 InitDeviceProAD、ReadDeviceProAD_NotEmpty 、Set
7、DeviceDO 等。而底层用户函数如WriteRegisterULong、ReadRegisterULong、WritePortByte、ReadPortByte则是满足了解硬件知识和控制细节、且又需要特殊复杂控制的用户。但不管怎样,我们强烈建议您使用上层函数(在这些函数中,您见不到任何设备地址、寄存器端口、中断号等物理信息,其复杂的控制细节完全封装在上层用户函数中。 )对于上层用户函数的使用,您基本上可以必参考硬件说明书,除非您需要知道板上 D 型插座等管脚分配情况。二、如何管理 PCI 设备由于我们的驱动程序采用面向对象编程,所以要使用设备的一切功能,则必须首先用 CreateDevic
8、e 函数创建一个设备对象句柄 hDevice,有了这个句柄,您就拥有了对该设备的绝对控制权。然后将此句柄作为参数传递给其他函数,如 InitDeviceProAD 可以使用 hDevice 句柄以程序查询方式初始化设备的 AD 部件,ReadDeviceProAD 函数可以用 hDevice 句柄实现对 AD 数据的采样读取,SetDeviceDO 函数可用实现开关量的输出等。最后可以通过ReleaseDevice 将 hDevice 释放掉。二、如何用非空查询方式取得 AD 数据当您有了 hDevice 设备对象句柄后,便可用 InitDeviceProAD 函数初始化 AD 部件,关于采样
9、通道、频率等的参数的设置是由这个函数的 pPara 参数结构体决定的。您只需要对这个 pPara 参数结构体的各个成员简单赋值即可实现所有硬件参数和设备状态的初始化。然后用 StartDeviceProAD 即可启动 AD 部件,开始 AD 采样,然后便可用ReadDeviceProAD_NotEmpty 反复读取 AD 数据以实现连续不间断采样。当您需要暂停设备时,执行StopDeviceProAD,当您需要关闭 AD 设备时,ReleaseDeviceProAD 便可帮您实现(但设备对象 hDevice 依然存在) 。(注:ReadDeviceProAD_NotEmpty 虽然主要面对批量
10、读取,高速连续采集而设计,但亦可用它以单点或几点的方式读取 AD 数据,以满足慢速采集需要) 。具体执行流程请看下面的图 2.1.1。三、如何用半满方式取得 AD 数据当您有了 hDevice 设备对象句柄后,便可用 InitDeviceProAD 函数初始化 AD 部件,关于采样通道、频率等的参数的设置是由这个函数的 pPara 参数结构体决定的。您只需要对这个 pPara 参数结构体的各个成员简单赋值即可实现所有硬件参数和设备状态的初始化。然后用 StartDeviceProAD 即可启动 AD 部件,开始 AD 采样,接着调用GetDevStatusAD_Half 函数以查询 AD 的存
11、储器 FIFO 的半满状态,如果达到半满状态,即可用ReadDeviceProAD_Half 函数一批半满长度(或半满以下)的 AD 数据,然后再接着再查询 FIFO 的半满状态,若有效再读取,就这样反复查询状态反复读取 AD 数据即可实现连续不间断采样。当您需要暂停设备时,执行StopDeviceProAD,当您需要关闭 AD 设备时,ReleaseDeviceProAD 便可帮您实现(但设备对象 hDevice 依然存在) 。(注:ReadDeviceProAD_Half 函数在半满状态有效时也可以单点或几点的方式读取 AD 数据,只是到下一次半满信号到来时的时间间隔会变得非常短,而不再是
12、半满间隔) 。具体执行流程请看下面的图 2.1.2。四、如何用中断方式取得 AD 数据当您有了 hDevice 设备对象句柄后,便可用 InitDeviceIntAD 函数初始化 AD 部件,关于采样通道、频率等的参北京阿尔泰科技发展有限公司 软件版本:5.0 发行时间:2001 年 12 月3数的设置是由这个函数的 pPara 参数结构体决定的。您只需要对这个 pPara 参数结构体的各个成员简单赋值即可实现所有硬件参数和设备状态的初始化。同时应调用 CreateSystemEvent 函数创建一个内核事件对象句柄 hEvent 赋给InitDeviceIntAD 的相应参数,它将作为接受
13、AD 半满中断事件的变量。然后用 StartDeviceIntAD 即可启动 AD 部件,开始 AD 采样,接着调用 Win32 API 函数 WaitForSingleObject 等待 hEvent 中断事件的发生,在中断未到时,自动使所在线程进入睡眠状态(不消耗 CPU 时间) ,反之,则立即唤醒所在线程,执行它下面的代码,此时您便可用ReadDeviceIntAD 函数一批半满长度(或半满以下)的 AD 数据,然后再接着再等待 FIFO 的半满中断事件,若有效再读取,就这样反复读取 AD 数据即可实现连续不间断采样。当您需要暂停设备时,执行 StopDeviceIntAD,当您需要关闭
14、 AD 设备时,ReleaseDeviceIntAD 便可帮您实现(但设备对象 hDevice 依然存在) 。 (注:ReadDeviceIntAD 函数在半满中断事件发生时可以单点或几点的方式读取 AD 数据,只是到下一次半满中断事件到来时的时间间隔会变得非常短,而不再是半满间隔,但它不同于半满查询方式读取,由于半满中断属于硬件中断,其优先级别高于所有软件,所以您单点或几点读取 AD 数据时,千万不能让中断间隔太短,否则,有可能使您的整个系统被半满中断事件吞没,就象死机一样,不能动弹。 切忌、切忌!)具体执行流程请看图 2.1.3。注意:图中较粗的虚线表示对称关系。如红色虚线表示 Creat
15、eDevice 和 ReleaseDevice 两个函数的关系是:最初执行一次 CreateDevice,在结束是就须执行一次 ReleaseDevice。北京阿尔泰科技发展有限公司 软件版本:5.0 发行时间:2001 年 12 月4开始创建设备对象CreateDevice()初始化设备对象 ADInitDeviceProAD()启动 AD 设备StartDeviceProAD()以非空查询方式读取 AD 数据ReadDeviceProAD_NotEmpty()用户对采集到的 AD 数据进行处理其代码应由用户根据需要编写需要再紧接着读取 AD 数据以实现连续采集吗?是释放 AD 设备Rele
16、aseDeviceProAD()需要改变通道或频率或清FIFO 后再采集吗?否需要释放设备对象ReleaseDevice()不需要结 束图 2.1.1 非空查询方式 AD 采集实现过程接着上次再读 AD 数据重新初始化AD北京阿尔泰科技发展有限公司 软件版本:5.0 发行时间:2001 年 12 月5以半满查询方式读取 AD 数据ReadDeviceProAD_Half()需要开始创建设备对象CreateDevice()初始化设备对象 ADInitDeviceProAD()启动 AD 设备StartDeviceProAD()用户对采集到的 AD 数据进行处理其代码应由用户根据需要编写需要再状态
17、读取 AD 数据以实现连续采集吗?是释放 AD 设备ReleaseDeviceProAD()需要改变通道或频率或清FIFO 后再采集吗?否释放设备对象ReleaseDevice()不需要结 束图 2.1.2 半满方式 AD 采集实现过程再接着上次查半满状态和读 AD 数据重新初始化AD查 FIFO 半满状态,半满吗?GetDevStatusAD_Half向其他线程抛出一定时间(如 1 毫秒或 1 微秒)Sleep(1)或DelayTimeNs(10)没有半满半满北京阿尔泰科技发展有限公司 软件版本:5.0 发行时间:2001 年 12 月6不等于 0,且等于 0xe1000000用户对采集到的
18、 AD 数据进行处理其代码应由用户根据需要编写等于 0不需要开始创建设备对象CreateDevice()初始化设备对象 ADInitDeviceIntAD()启动 AD 设备StartDeviceIntAD()以半满中断方式读取 AD 数据ReadDeviceIntAD ()需要再紧接着读取 AD 数据以实现连续采集吗? 是释放 AD 设备ReleaseDeviceIntAD()需要改变通道或频率或清FIFO 后再采集吗?否需要释放设备对象ReleaseDevice()结 束图 2.1.3 半满中断方式 AD 采集实现过程再接着上次等待中断事件重新初始化AD等待半满中断事件WaitForSin
19、gleObject(hEvent)若中断事件未到,则睡眠,不往下执行创建内核事件对象CreateSystemEvent()若中断事件到达,则被唤醒,往下执行判断函数返回值不等于 0,且不等于 0xe1000000一级缓冲溢出,退出吗?不是释放内核事件对象ReleaseSystemEvent()北京阿尔泰科技发展有限公司 软件版本:5.0 发行时间:2001 年 12 月7五、如何实现开关量的简便操作当您有了 hDevice 设备对象句柄后,便可用 SetDeviceDO 函数实现开关量的输出操作,其各路开关量的输出状态由其 pPara 中的成员变量 DO0-DO15 决定。由 GetDevic
20、eDI 函数实现开关量的输入操作,其各路开关量的输入状态由其 pPara 中的成员变量 DI0-DI15 决定。六、如何实现 DA 的简便输出当您有了 hDevice 设备对象句柄后,首先用 InitDevProDA 函数实现 DA 的复位操作,然后反复调用WriteDevProDA 函数输出每一个 DA 数据。七、哪些函数对您不是必须的?当公共函数如 CreateFileObject, WriteFile,ReadFile 等一般来说都是辅助性函数,除非您要使用存盘功能。如果您使用上层用户函数访问设备,那么 GetDeviceAddr,WriteRegisterByte, WriteRegi
21、sterWord, WriteRegisterULong, ReadRegisterByte, ReadRegisterWord, ReadRegisterULong 等函数您可完全不必理会,除非您是作为底层用户管理设备。而 WritePortByte, WritePortWord, WritePortULong, ReadPortByte, ReadPortWord, ReadPortULong 则对 PCI 用户来说,可以说完全是辅助性,它们只是对我公司驱动程序的一种功能补充,对用户额外提供的,它们可以帮助您在NT、Win2000 等操作系统中实现对您原有传统设备如 ISA 卡、串口卡、并
22、口卡的访问,而没有这些函数,您可能在新操作系统中无法继续使用您原有的老设备(除非您自己愿意去编写复杂的硬件驱动程序) 。第二节 驱动程序功能概述一、数据传输采集方式我公司提供的驱动程序完全支持 程序查询方式、硬件中断方式、直接内存存取 DMA)方式 。您从我公司所购买的硬件产品能支持的数据采集方式,我们的驱动程序均予以满足。二、数据传输与数据处理的独立性为了提高数据吞吐率以及实现实时数据处理(如随时取数、随时暂停设备、随时开始传输、随时存盘、随时显示波形、随时设备控制输出等功能), 我们采用一种最新、最灵活的设计思想,即数据采集传输和数据处理相独立的思想。即用我们所创建的设备对象在 Windo
23、ws 系统空间管理一个一级强制性缓冲队列,该缓冲队列可支持 128K 字(即 256K 字节)的系统内存空间 Buffer,该队列采用先进先出策略和动态链表等技术来更高效地管理这个 Buffer。这个队列缓冲与用户数据缓冲区相独立,设备对象在后台负责数据采集和传输,将其数据映射到相应的队列缓冲单元,且维持一个动态链表,并向用户发送相应的通知消息。而用户则不必知道内部的任何复杂操作,而只须在这个消息到来时,使用 ReadDeviceIntAD 函数读一批 AD 数据或几批即可。重要的是,在这个消息没有到来时,用户代码不必花任何 CPU 时间去轮询等待,而用户正好利用这段空闲时间去处理更多的任务。
24、即轻松实现了数据采集与数据处理的同步并发进行。这将是最高效的。这个队列缓冲跟先进先出存储器 FIFO 芯片功能基本一致,只不过这个缓冲是一个被软件仿真的 FIFO 存储器。使用这项技术的最大优点就是完全解决了在多任务环境中实现高速连续采集数据难的问题。特别是整个系统突然繁忙的时候,比如用户在高速采集数据或实时存盘时,偶而移动窗口或改变窗口大小或弹出对话框时,这项技术足以保证所采集的数据完整无缺。如果用户希望应用程序有更好的处理能力和克服操作系统的陡然忙碌对连续数据采集的影响,可以考虑在用户模式中再使用二级缓冲队列和相应的缓冲区链表技术。具体细节请参考 NT 下的中断演示程序。 (目前在 Win
25、dow NT 中完全支持此项技术,在以后的 Win2000 和WinXP 版本中应该会进一步提供)。三、连续不间断大容量采集存盘 在虚拟仪器、实验室数据分析、医疗设备、记录仪等诸多研究和应用领域中,对数据的要求很高,一方面数据容量较大,如几百兆甚至几仟兆,另一方面采样速度都较高,如 200KHz,300KHz 等,更重要是要求在高速长时间的采集数据过程中,不能丢掉一个点,必须全部存入硬盘,同时还要进行一些点的抽样分析,这在 DOS 环境中实现起来就有较大的难度,就更别说在 Windows 这样的多任务环境中(对于 Windows 多任务机制请参阅有关Windows 手册) 。大家知道 Wind
26、ows 的各应用程序总是不断地被任务调度器调度,循环处在睡眠、排队、就绪、触发运行等状态中。Win95 任务之间的切换密度至少大于 1 毫秒,那么如果要以 300KHz 频率采样(即每 3.3 微秒就得传输一个数据) ,很显然有大量的数据在传输中由于任务之间的切换而被丢失掉。这就是基于 Windows 客户程序在传统模式下,高速连续采集传输数据时所具有的局限性。为了突破这种局限性,就得采用别的办法,如非客户程序、内核程序、驱动程序(如 VxD、微代码)等,再加上我们所掌握的新技术,如内存映射、直接写盘技术以及独有的设计思想便可以很好的解决这些问题。从 1998 年 9 月开始,已有部分用户实际
27、使用,反映良好。我们自己也经过全面测试,比如在 Windows95 下使用无 FIFO 芯片的 BH5104 模板,实际结果是:以 200KHz 频率,双通道采集正弦波且存盘,写满整个硬盘近 4000 兆数据,其时间长达个小时左右,随后再读盘回放磁盘数据,整个波形没有发现任何串道、断点和畸形状。当然 PCI2010 等 PCI 设备同样具这样的性能。它不仅具有一级硬件缓冲FIFO(其缓冲深度可调 1KB、2KB、4KB、8KB、16KB 等) ,同样具有第二节中叙述的二级强制队列缓冲,这个软件防真的缓冲比一级缓冲要大几十倍。如果用户需要的话,可以在应用程序中再建立循环式用户缓冲,即可实现高速不
28、间断大容量采集存盘功能。北京阿尔泰科技发展有限公司 软件版本:5.0 发行时间:2001 年 12 月8四、后台工作方式我们的驱动程序为用户提供了后台工作方式进行数据传输,这样可以保证您的前台应用程序能实时高效的进行数据处理。后台方式的特点是在进行数据采集和传输过程中不占用客户程序的任何时间,当采集的数据长度达到客户指定的值时便触发客户事件,客户程序接受该事件便开始进行数据处理。在数据处理的同时,驱动程序依然在进行下一批数据的传输,即实现了并行操作,极大的提高了数据的吞吐量和计算机系统的整体处理能力。五、与设备无关性通过总结各数据采集卡的的共同特点,设计了基本一致的接口方式,可以让您的应用程序
29、不仅能适应您所购买的我公司第一种产品,同时也能不经修改地适应我公司的其他同类产品(只有极少数设备需要极少的修改,其修改的比例基本不超过 5%) 。所以可以保证您的应用程序在我们的硬件产品基础上极为容易地进行功能和应用扩展,节省您的大部分软件投资,极大的缩短工程开发周期。六、驱动程序的坚固性我们的驱动程序都是经过严密彻底的测试和验证,并经部分用户试用之后,确认没有任何问题后才予以正式发行的,所以当您使用起来应该有十足的安全感。七、驱动程序特点由于我们的驱动程序均采用动态虚拟技术(Windows 95) ,微内核代码(Windows NT)因此可动态装载和卸载,而且可以重入,即可实现多道任务同时访
30、问硬件设备的功能。这样可以保证您的软硬件资源可以被充分有效的利用。特别是在 Windows NT 下,采用队列突发机制,可以实现几十道线程序同时访问一设备的功能。八、高效与灵活兼备如果您只是应用系统的上层用户,您多半不愿意了解 PCI 硬件设备的各种复杂控制和操作协议,而只需要设置好您最关心的硬件参数(比如采集的 AD 通道、采样频率等) ,然后用一个读数的函数,跟上 AD 数据缓冲区和请求采集的数据长度,一执行程序便可以得到外部的数据,试想,这是不是一种最高效、最简单易用的方式。这种方式我们优先提供。比如下面将介绍的接口函数:InitDeviceProAD、ReadDeviceProAD 等
31、两三个函数便可以帮助上层用户实现数据采集;但如果您是较为底层的用户,对硬件设备很熟悉,且有更特殊的编程和控制模式,那么您可能需要对硬件进行直接编程,就象传统的 ISA 总线设备,您想用 C 语言的 outp、inp ,汇编语言的 out、in 的命令访问这些 ISA 设备的形式来访问 PCI 设备的各个寄存器,那么我们为您提供了这类似的方法,只是函数名不一样,如写寄存器函数名为:WriteRegisterULong(32 位方式), 读寄存器函数名为 ReadRegisterULong(32 位方式),但是功能更强,不仅有 32 位的,更有 16 位的,8 位的读写函数。它能访问硬件说明书里提
32、供的任何一个寄存器。凡未注明,本设备所列寄存器均以 32 位方式访问,当然,随着设备与驱动程序的升级,我们还会提供 64 位的寄存器读写接口。九、安装程序特点关于驱动程序的安装方式我们采用大多数 Windows 应用程序所使用的标准模式,因而简捷、方便、直观。您只需执行安装盘上的 Setup.exe 启动文件即可进行驱动程序的安装工作。在安装过程中您设置好安装目标路径以及文件夹名称等信息后,安装程序便自动而又快捷地为您安装好驱动程序,随后您便可以用驱动程序接口编写应用程序或用我们提供的简易测试程序测试设备了。十、多语言编程环境本系统提供 Visual C+、C+ Builder、 Visual
33、 Basic、Delphi、 LabView、LabWindows/CVI 的函数接口,使您完全可以根据自己的需要和喜爱选择合适的编程语言。请记住,您得使用 32 位编程模式。但对于 LabWindows/CVI接口,属于定制服务,如果用户需要,请另与我公司或指定代理商联系以便协商解决。十一、为 Visual Basic 环境提供直接的多线程支持在 VB 环境中进行各种实时控制和用户级后台操作,不用子线程,那简直是不可想象的事情。但是在通常情况下,要在 VB 环境中实现多线程操作并不象 VC 那么容易了。往往要相当复杂的对象操作,而且很不具有灵活性。但是有了我们的驱动程序支持,使这件事变得极为
34、容易,甚至比 VC 还要容易。比如执行 CreateVBThread 函数,跟上hThread 和 NewRoutine 两个参数,即可创建线程对象,并获得对象句柄,随后便可用 ResumeThread 函数启动子线程。在 VB 应用程序中,可以创建任意多个子线程。十二、我公司动态库与其他公司动态库的比较 值得注意的是,我们的 DLL 库不同于其它许多公司所编写的那样,只是对动态库的简单直接地调用,其硬件控制、数据传输代码都放在 DLL 中,那么其代码的优先执行级别跟一般的用户程序是一样的,它总要定期地、不断地被系统级任务调度器调度,所以当这些代码在负责传输数据时往往被瞬时中断,有时这个时间还
35、很长,故此,极有可能造成丢点的严重现象。且这种方案不可能提供硬件中断以及内存直接存取(DMA)方式来传输数据,这样难以满足用户的各种需求。为了解决这些问题,在 Win95、Win98 环境下,我们没有把硬件控制、数据传输代码简单地放在 DLL 中,而是通过动态虚拟技术以 VxD 的形式放在了 Windows 系统空间中,以 CPU 的 0 级环级别同系统代码协同工作,也就是说它可以获得与任务调用器一样的级别,且不受任务调度器的调度管理。在 NT 环境下,我们通过微内核技术把硬件控制、数据传输代码以微内核代码(简称微代码)形式放在 NT 的内核模式中,成为 NT 操作系统的一部分,并可根据代码的
36、重要程度进一步迅速临时提升 CPU 的 IRQL 级别,使这些代码以高优先级,高速度工北京阿尔泰科技发展有限公司 软件版本:5.0 发行时间:2001 年 12 月9作,极大的提高了数据采集和传输的质量。而我们的 DLL 的主要任务不是采集数据,而是对驱动程序的全面封装,对用户负责简化所有复杂的繁琐的操作细节,特别是 Windows 底层管理,提供简洁一致的函数接口供用户使用。它具体表现在从用户空间到系统空间(Windows95,98 ) 、从用户模式到内核模式(Windows NT)、从 CPU 的 3 级环到 0级环(Windows) 等相互间的转换以及设备 I/O 请求的来回传递。所以,
37、我们的驱动程序不是 DLL,而是形如*.VxD(Win95)或*.SYS (NT)的代码文件。通过这样的技术便能实现设备所有功能,极大范围地满足用户需要。十三、跨平台设计至今,Windows95 与 Windows NT 是两大主流操作系统,它们各有其优点,但随着计算机的进一步网络化以及追求高可靠性和高稳定性,Windows NT 在不远的将来便会最终取代其它相关的 Windows 平台,成为更先进的视窗操作系统。为保护用户的软硬件投资,满足用户更长远的需要,我们不仅同时提供了基于 Windows95(98)和Windows NT 操作平台的驱动程序,而且尽力做到了跨平台设计,使您的用户程序不
38、用作怎么修改,一般只须在不同的平台重新编译、链接,便可运行在两种平台上。十四、LabView/CVI 支持LabView/CVI 是美国国家仪器公司(National Instrument)的虚拟仪器开发平台,特别是基于图形化编程的LabView 语言,在测量、工控、虚拟仪器方面受到广大工程师和用户的青睐。其全球销售量仅次于 C+语言。我们自主开发的硬件(PCI、USB 、ISA 总线系列)产品提供了基于 LabView 的驱动软件接口模块,与 LabView 软件平台完全兼容,让您轻松实现图形化编程。十五、纳秒级高效与高精度延时定时操作最新设计的 DelayTimeNs 函数可以为您提供精度
39、高达 100 纳秒的延时,且这个延时是相当高效的。因为人们惯用的方法是简单循环的执行 CPU 的某条指令来实现的,如汇编语言的“nop”指令。这个方法固然能实现延时的目的,但是延时精度低以外,更糟糕的是它抢占了 CPU 大量的宝贵时间。特别是在多任务多线程环境中,这种延时方法将导致整个应用程序乃至整个 Windows 系统的低效。现举列说明:将如在应用程序中有 A、B 俩线程(线程优先级相等) ,A 线程负责以程序半满查询方式采集数据,设 FIFO 深度为 4K(4096 个点) ,即半满为 2048 个点。且采集频率为 100KHz(10 微秒 1 个点) ,即每相邻两个半满时间间隔为 20
40、480 微秒。B 线程在 A 线程的同步下,负责窗口波形显示或数据存盘或数据分析等大量耗时操作。如果既要保证 A 线程能将每一批半满数据取回送入用户缓冲区,又要保证 B 线程在 A 线程的同步下,将用户缓冲区中的数据进行一一波形绘制或全部存盘或分析等,而这些工作极有可能比 A 线程需要更多的 CPU 时间。由此可见两个线程必须有足够的 CPU 时间。但是系统中只有一个CPU,两个线程只能分时占有 CPU 时间片。又因在线程调度策略中,由于级别相等,所以 AB 线程平等占用 CPU时间。尽管 A 线程采用半满方式读一批数据,但是在半满信号没有到来时,它依然要花掉大量的 CPU 时间去轮询延时等持
41、半满信号。这个时间经计算每次竟高达 20480 多微秒。但是实际上在每个半满信号到来时,从 FIFO 中取回 2048 个点可能只需要几十微秒就足够了,那么致少有 20000 微秒在这个延时中被牺牲掉了。而这正是普通方法的弊端。试想:如果能在每两个半满信号之间,将这 20000 微秒从 A 线程中让出来,让线 B 线程及主程序,岂不可以极大的提高整个应用程序处理效率?因此我们为您提供了 DelayTimeNs 函数,它不仅可以在每次轮询半满信号时,如果半满信号无效,即可抛出以 100 纳秒为单位的时间数给其他线程或应用程序。以提高整体效率。同时也可以应用在其他许多场合。 (其实现范例代码请参考
42、第八章函数接口应 用实例 ) 。十六、对传统总线设备的支持由于某些用户可能除了使用现在流行的高级设备,如 PCI、USB 等总线的设备,但同时还要沿用以前购置的老设备(如基于 ISA 总线、并口、串口等设备)这些设备只能使用 I/O 地址,而不象 PCI 设备那样能使用内存映射地址。特别是对这些设备的访问,只能使用汇编语言的 in、out 指令和 C 语言的 outp、inp 等函数来实现读写。但是这些手段只能在 DOS、Win3.1、Win95 等操作系统中使用,如果您要在 Windows NT、Windows 2000、Windows XP中使用,那是绝对不行的。因为这些指令已被操作系统作
43、为权限控制,不允许用户在上层应用程序中使用这为了尽可能的保护您的前期投资,我们为您提供了能直接访问这些老设备的相应接口。如 WritePortByte、ReadPortByte 等。注意,为了提高速度,您应使用带后缀“Ex”函数访问设备,如 WritePortByteEx、ReadPortByteEx 等,因这些函数通过驱动程序底层的支持,突破了操作系统的某些限制,使它们能在用户直接访问 I/O 端口。十七、自动卸载功能在您已安装了本软件系统后,如果不再准备使用本系统,您可以通过我们为您提供的组件 unInstallShield 从Windows 系统中自动卸载本软件系统。十八、LabView
44、/CVI 支持如果您采用 Typical 安装选项,那么您一般可以得到我们为您提供的如下组件:Hardware Help 硬件使用说明 Word 帮助文档;ReadmeFile 安装目录等信息简介;Setup 关于硬件参数设置的应用程序; Software Help 软件使用说明 Word 帮助文档;北京阿尔泰科技发展有限公司 软件版本:5.0 发行时间:2001 年 12 月10Test Application 基于 Microsoft Visual C+代码的硬件测试应用程序;Visual C+ Sample Microsoft VC+演示程序(这个程序对驱动程序演示说 明最全面) ;Vi
45、sual Basic Microsoft VB 演示及接口程序文件(PCI2010.Bas)C+ Builder Borland C+ Builder 演示程序;Delphi Borland Delphi 演示及接口程序文件(PCI2010.Pas) ;LabView 美国国家仪器公司(National Instrument)的虚拟仪器开发平台的演示程序及接口模块程序UnInstallShield 本软件卸载应用程序;第三章 PCI 即插即用设备驱动程序安装第一节 Windows95、98、Me 环境下 PCI 设备驱动程序安装一、安装步骤第一步 将 PCI 设备按硬件要求插入计算机主板上的任
46、意一个 PCI 插槽中,并将其固定好,连接好其外接设备后,打开计算机电源,启动 Windows95/98/Me 系统。第二步 如果您正确地插好了 PCI 设备,Windows 系统在启动过程中便会发现这个新的 PCI 设备,并弹出“找到新硬件”的对话框,几秒钟后,便进入“添加新硬件向导”对话框的第一步,它告之所发现的新硬件的设备类型为“PCI Card”或“PCI Input Device” ,在然后请单击“下一步”按钮。第三步 “添加新硬件向导”对话框的第二步,询问您是自动搜索 PCI 的驱动程序,还是手工从列表中选择。您最好单选第二个选项“显示指定位置的所有驱动程序列表,以便可从列表中选择所需的驱动程序”然后单击“下一步”按钮。