2009年2月23日星期一

嵌入式系统中的usleep延迟

作者:Sam(甄峰) sam_code@hotmail.com

Sam在作嵌入式系统中,发现类似usleep这样的函数在不同平台上延迟并不相同。所以如果想要延迟一段时间,尤其是比较精确的延迟,应慎重使用类似函数。

举例而言:
例1:
usleep(5000); //延迟5ms.

在PC-linux中,延迟时间大约在5020-5030微秒之间。
在Canmore(800M CPU)中,延迟则会大很多, 在8010微秒左右。
在X5平台(300M CPU)中, 延迟竟然大到20000微秒左右。

当然,这不排除Sam使用gettimeofday() 函数所用时间,但可以肯定的是,在不同CPU速度下,usleep() 延迟造成的效果应该差别很大。


例2:
usleep(50); //延迟50微秒
在PC-linux中,延迟时间大约在59-60微秒之间。
在Canmore(800M CPU)中,延迟则会大很多, 在4000微秒左右。
在X5平台(300M CPU)中, 延迟竟然大到20000微秒左右。


例3:
usleep(50000); //延迟50000微秒
在PC-linux中,延迟时间大约在50076微秒左右。
在Canmore(800M CPU)中,延迟则会大很多, 在56047微秒左右。
在X5平台(300M CPU)中, 延迟到60000微秒左右。


从上面的数据看,在嵌入式系统中,最好不用时用usleep这类函数,因为他们特别不准确。当延迟比较大时,稍微准确一些,但延迟小到一定程度时,延迟会非常不准确。好像有一个延迟最低点。低于这个数据后,不管你想要延迟多少,系统都会延迟这么久。例如X5平台的20000微秒。

没有评论: