关键字: RTX 实时平台 Sleep(1)
继上一篇”RTX实时平台介绍(1)-让你的Win32程序享受到实时控制的好处”, 这里我以Sleep(1)来具体展开RTX实时平台的介绍。
在工控或图像采集程序里,我们一定能找到这样的语句:
while(1)
{
…
Sleep(1);
…
}
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 ProBook 4411s
Intel® Core(TM)2 Duo 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的延时
rt_wait_timer_tick(0); //等待Timer
iRTSSTime = (int)(read_Q_variable(2)/1000); //读取Q2值
其他部分就直接看源代码。
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
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/hongxin7/archive/2010/05/24/5620067.aspx