[问题] 如何获得稳定的Timer

楼主: ghostx2 (Ghostx2)   2016-05-28 11:47:27
为了获得1ms cycle time
目前使用两个方式达成
第一个方式使用Thread搭配while循环
使用Stopwatc跟SpinWait、Thread.Sleep(1)搭配
另一个方式使用media timer(timeSetEvent)
两个方式目前都可以得到1ms cycle time
但只要有新的执行绪建立
当下会影响目前已存在的timer
这个现象据我测试强制GC也会
但不同的电脑受到影响的程度不一
我目前使用Acer VN7就很容易受到影响
公司的工业电脑影响程度较低
但也还没达到稳定程度
提高程式即时性也没什么用
还有什么招可试吗?
感谢
目前已参考网络文章标题如下
KB-测试Thread.Sleep的精确度
KB-Thread.Sleep, 别赖床!
Timer surprises, and how to avoid them
Priority-induced starvation: Why Sleep(1) is better than Sleep(0) and the
Windows balance set manager
作者: m339606 (mize)   2016-05-28 13:09:00
程式的方式不可能有准确的计时,CPU的时脉等等都有影响例如我的case是每一秒都要tick,但是一定会有0~100ms的误差,与CPU时脉还有负载有关1ms计时的误差会更严重,建议要精准的话走电路设计触发会好些
作者: Litfal (Litfal)   2016-05-28 21:47:00
用while(isOk()) Thread.SpinWait(100); 精度会比Sleep高缺点是CPU占用率会比较高,而且要达到lms的精度也可能不够让执行续忙碌(空转)会让它"比较不容易"被context switch而Sleep则会主动让出控制权,就会发生switch。只要发生switch,什么时候再轮到你是不可控的,所以计时精度高不了。
作者: m339606 (mize)   2016-05-29 00:24:00
帮楼上补充,要看os层是不是允许你持续的吃cpu时间,否则一样会被switch,如果要准确1ms真心建议往电路ㄑ比较好
作者: zel (柚植)   2016-05-29 03:32:00
Thread.sleep 不是以15ms计算吗?试试看拉高处理序与执行续的层级,然后锁定在单一核心执行试试看?但要完全刚好是1ms很难,毕竟(1)记数最小单位通常是1个tick interval,1ms不是它的整数倍(2)执行排程的最高层级是留给windows自己用要不就换Win Embedded,印象中有提供api,或是装RTX(要从比较底层开始写不是很了解,待板上高手补充)另外建议时间计数参考kernel的QueryPerformanceCounter
楼主: ghostx2 (Ghostx2)   2016-05-29 10:33:00
Thread.Sleep能不能到1ms要看硬件能不能支援至少我测了4台电脑都可以, 目前我循环有再尝试用Thread加while另一个用media timer两者都还是会受到Context Switch影响, 有时候1ms变100ms我知道没法完全稳定到1ms,只是在找方法把这影响压到最低另外RTX API要买SDK授权测试了指定核心,这个也没法对抗Context Switch影响
作者: largesperm (reindeer)   2016-05-29 14:08:00
这样的需求不是应该买专业 real time 软件吗INtime 这类的软件在 windows 要做到 real time 没想像中的简单啊

Links booklink

Contact Us: admin [ a t ] ucptt.com