您好!欢迎光临工博士商城

研华科技服务商

产品:2379    

咨询热线:18621383621

QQ QQ
您当前的位置:首页 » 新闻中心 » 研华科技--可以测量指令时间的方法
产品分类
新闻中心
研华科技--可以测量指令时间的方法
发布时间:2021-04-23        浏览次数:339        返回列表
在研华IO卡的技术支持过程中,经常会有人问到一些函数的执行时间。比如说,客户咨询,普通的研华AO卡片,执行***常见的DRV_AOVoltageOut指令,需要多长时间。因为这种问题,经常会影响到客户控制系统的控制环速度。由于这个函数的执行时间涉及到硬件,与之相关的包括:CPU主频、总线频率、内存读写速率、主板芯片组性能(PCI桥工作能力)、是否有硬件(板卡)的回馈信号、操作系统类型、应用程序语言等各种软硬件因素,根本不可能有一个量化的方法对其进行较为***的估计。虽然理论推算不太可能,但我们可以换一种思路,设计一种简单易用的方法实际测量这个指令时间,下面这种方法就是利用Windows系统自身的API函数测量指令时间的方法,其测算精度可达1μs。
首先我们来看一下要用到的两个基本函数:

 

1、QueryPerformanceCounter Function

 

 

 

 

 

The QueryPerformanceCounter function retrieves the current value of the high-resolution performance counter.

 

 

Syntax

 

 

BOOL QueryPerformanceCounter(      

    LARGE_INTEGER *lpPerformanceCount

 

 

);

 

 

Parameters

 

 

lpPerformanceCount

 

 

[out] Pointer to a variable that receives the current performance-counter value, in counts.

 

这个函数的作用就是用来获取系统当前时刻的计数值,Windows操作系统在开机后会开始进行一个计数,计数精度可达1μs。

 

2、QueryPerformanceFrequency Function

 

 

 

 

 

The QueryPerformanceFrequency function retrieves the frequency of the high-resolution performance counter, if one exists. The frequency cannot change while the system is running.

 

 

Syntax

 

 

BOOL QueryPerformanceFrequency(      

    LARGE_INTEGER *lpFrequency

 

 

);

 

 

Parameters

 

 

lpFrequency

 

 

[out] Pointer to a variable that receives the current performance-counter frequency, in counts per second. If the installed hardware does not support a high-resolution performance counter, this parameter can be zero.

 

这个函数可以告知我们这个计数器每秒钟的计数值。对每一个确定的系统而言,这个值是恒定不变的。
我们可以设想一下,如果我们在一条指令执行的前后分别获取当时的系统计数值,就能算出它们的差值,把这个差值除以每秒钟的计数值,得出的时间就是指令执行的时间(以秒为单位)。
下面我就用VC来实现这个设想,选择VC主要是因为这个操作用到的这两个API函数属于系统内部资源,使用VC调用起来更方便。而且VC编写的程序,编译效率和执行时间比起其它语言来都有一定优势,可以尽量减少估算误差。
首先我们需要添加要使用的头文件:


除了编写研华程序需要的头文件外,这个测试程序中还需要用到winnt.h,它直接关系到前面提到的两个API函数的调用。
做好这个准备后,我们编写一个简单界面


当点击“Test”按钮时,会完成我上面设想的操作,计算出指令时间,并且显示在界面上。


首先我们获取系统的频率并显示在界面上


这一步是分别获取指令前后的两个计数值。

 

 

 


***后是计算指令时间并显示。
我们可以看看程序的执行效果:

 

 

 


如上图所示,我测试的指令是DRV_DeviceClose(),选择的设备是研华自己的DEMO BOARD,多次测试结果表明,这个函数的执行时间基本上在3-7个μs之间。
而在同样的软硬件环境下,测试DRV_DeviceOpen()指令,执行时间在1ms左右,两种指令的执行时间差距在两个数量级以上。
使用,这种方法,我们可以对多种研华DAS卡函数作出基本指令时间的推算,会在后续推出这方面的专题。
分享到: 


 

联系热线:18621383621   联系人:卢华蓉 联系地址:上海市黄浦区北京东路668号赛格电子G区五层

技术和报价服务:星期一至星期六8:00-22:00 研华科技服务商