关键字: RTX 实时平台 Sleep(1)
继上一篇”RTX实时平台介绍(1)-让你的Win32程序享受到实时控制的好处”, 这里我以Sleep(1)来具体展开RTX实时平台的介绍。
在工控或图像采集程序里,我们一定能找到这样的语句:
while(1)说明程序处于一个无限循环的过程,比如图像采集程序,创建一个线程,在线程添加如上语句,就可以让程序一直处于采集状态,直到销毁。那么为什么要加上Sleep(1)呢?
因为Windows系统它是一个preemptive multitasking 和 multithreading的操作系统,也就是该采集程序一旦优先执行,没有Sleep(1)作为暂时的延时的话,该程序将占有所有资源,导致鼠标无法移动,其他程序无法同步执行。
从这里可以看出,Sleep(1)充当的是一个非常关键的角色,在特定的环境下Sleep(1)将直接影响程序执行的效率。
但windows系统自身的Sleep(1)函数,一方面延时不准确,另一方面很不稳定,会受到其他程序的影响。
延时不准确,导致触发信号不能及时发送和接收,势必扰乱工业控制的执行程序。
延时不稳定,比如Sleep(1),预想延时1ms, 但实际延时超过10ms。这个直接影响生产设备运行的效率,导致产品输出大打折扣。
这也就是为什么要采用实时平台来实现实时控制。
下面就一个Sleep(1)在Win32和RTSS环境下的对比来说明:
1) Sleep(1)实验情况
实验1: 组装台式机
Intel(R) Core(TM)2 Duo CPU E4500@2.2GHz
技嘉GA-P31-S3G主板
Intel P31+ICH7芯片组
实验2: 笔记本 HP ProBook4411s
Intel® Core(TM)2Duo CPU T6570@2.1GHz
Intel PM45+ICH9M芯片组
Win32平台下加载5M大小的图像采集:
实验比较:
| 最大误差值 | 稳定性 | |||
平台 | RTSS(us) | Win32(us) | RTSS | Win32 | |
台式机 | 100 | 14700 | 好 | 中 | |
笔记本 | (无图像采集) | 100 | 1100 | 好 | 中 |
(加载图像采集) | 100 | 13700 | 好 | 差 |
由此可以看出:
n RTSS下的时间延迟误差非常小
n RTSS下的时间延迟稳定性好,不受Win32程序影响
2) 实例代码说明
针对该程序,其他就是在RTX平台上创建一个Timer(100us), 另存为Timer-0.并添加相应的代码。
第一步打开RTX平台编辑器,在最左边Function Tree/Time and Delay, 选择Read_HAL_Clock_Time, 并返回给Q0. 然后同一目录下添加Sleep(1),再选择Read_HAL_Clock_Time, 并返回给Q1, 最后在Math and Logical Operation下对Q1和Q0进行相减,返回值给Q2.
第二步点击界面右下方【Item Check】,检查有没有错误。
第三步点击界面左上方【Save as Timer】保存为Timer-0,这样就创建了一个Timer用来检查Sleep(1)的时间延迟。
对应的,在Win32程序上创建一个线程来读取RTSS的延时
其他部分就直接看源代码。
RTX runtime, 安装程序链接:
RTX8.1DemoSetup-Part1/2 http://download.csdn.net/source/2367420
RTX8.1DemoSetup-Part2/2 http://download.csdn.net/source/2367426
RTX平台程序下载(试用版)
RTX实时平台-Win32程序实现实时控制-Part1/2 http://download.csdn.net/source/2386537
RTX实时平台-Win32程序实现实时控制-Part2/2 http://download.csdn.net/source/2386544
演示程序Sleep(1)源代码:
http://download.csdn.net/source/2388231
Hongxin
2010-5-24
PC Based实时系统开发
hongxin.he#gmail.com