我一直在将嵌入式linux程序的主循环转换为在服务器上运行,其中一个很好的东西就是运行非root用户。该程序负责定期从网络设备请求IO扫描 - 每2ms。今天我用/ dev / rtc替换了对nanosleep的调用。在这个特殊的情况下,我们可以摆脱足够的延迟,但我想知道当我们在具有更严格的时序要求的嵌入式设备上运行时,是否可以留下纳米睡眠呼叫(大型项目就是这种情况) )。性能有很大差异吗?
答案 0 :(得分:2)
这取决于Linux内核版本。从时间(7)手册页:
High-Resolution Timers Before Linux 2.6.21, the accuracy of timer and sleep system calls (see below) was also limited by the size of the jiffy. Since Linux 2.6.21, Linux supports high-resolution timers (HRTs), optionally configurable via CON‐ FIG_HIGH_RES_TIMERS. On a system that supports HRTs, the accuracy of sleep and timer system calls is no longer constrained by the jiffy, but instead can be as accurate as the hardware allows (microsec‐ ond accuracy is typical of modern hardware).
注意:“jiffy”是“Greg”答案中提到的计时器滴答频率。另请注意,系统调用此引用包括nanosleep()。
也就是说,如果您的嵌入式目标上有足够的内核版本,nanosleep()应该足够好了。如果你有一个较旧的内核版本,你确实受到时钟滴答频率的限制,在这种情况下你可能会遇到问题,因为2 ms与CONFIG_HZ = 1000的1 ms滴答频率非常接近。
答案 1 :(得分:1)
nanosleep的man-page建议使用内核定时器,使其对“HZ”(内核“tick”)的值敏感。刻度通常为1000HZ(1ms),但对于嵌入式系统,此值可能不一定相同,您可以根据可用的时序源配置内核参数。
由于/ dev / rtc使用中断,它不会将您绑定到HZ,因此时间可能更敏感。当然,这也取决于您的RTC硬件。
如果有疑问,请进行精简抽象,让您设置时间并传递回调,以便在实现之间切换,并且与嵌入式系统一样 - 在真实设备上进行测量。