我目前正在制定一项必须定期开展工作的计划。目前我使用以下结构:
int main(int argn, char** argv) {
for(;;) {
//Do work - the programm spends 5-8ms here
nanosleep(...); //Sleep 10ms
}
return 0;
}
问题是:一个循环执行应始终持续10ms。由于在循环的工作部分花费了大量的时间,我无法入睡只是睡了10ms ...
解决方案可能是使用clock_gettime()
来衡量工作时间,并相应地调整nanosleep()
。但是我对这个解决方案不满意,因为将代码放在测量区域之外很容易......
我在互联网上寻找替代方案,我找到了三个电话:
如果解决方案无法移植到Windows或其他操作系统,那也没关系。
但我不确定哪种解决方案最适合我的问题。有什么建议或意见吗?我提到的4种替代方案的优缺点是什么?
编辑:此解决方案还有另一个问题:如果我获得正确的文档,nanosleep
系统调用会使进程进入睡眠状态至少10毫秒,但可能需要更长时间如果系统负载不足......有没有办法优化它?
EDIT2:供您参考:在工作部分,网络请求发送到网络上的另一台设备(能够及时回复请求的微控制器或PLC)。结果正在处理并发送回设备。我知道Linux不是一个实时操作系统,并不是这种任务的最佳选择......如果解决方案不是完美的实时解决方案就没问题,但是尽可能多地实时获取它会很好。
答案 0 :(得分:1)
检查调用nanosleep
之前的时间并计算在那里睡多长时间。无需测量任何代码。只需记下从nanosleep
返回的时间,并计算您需要多长时间睡觉。
答案 1 :(得分:1)
信号处理是最优选的方式。我更喜欢timer_create,因为它是符合POSIX.1-2001的posix函数。 Microsoft还提供help for writing POSIX Standard Code。
答案 2 :(得分:0)
使用clock_nanosleep
可让您请求睡眠直到给定的绝对时间(TIMER_ABSTIME
标志),而不是持续时间。然后,您可以在每次迭代时将目标绝对时间增加10ms。
使用clock_nanosleep
还允许您(如果需要)使用单调时钟选项,并避免在程序运行时处理用户/管理员重置系统时钟的可能性。