我目前正在制定一个必须定期做一些工作的计划。 目前我使用以下结构:
int main(int argn, char** argv) { for(;;) { //Do work - the programm spends 5-8ms here nanosleep(...); //Sleep 10ms } return 0; }
问题是:一个循环执行应该总是持续10ms。 由于在循环的工作部分花费了大量的时间,所以我不能简单地睡10ms …
解决scheme可能是测量clock_gettime()
工作时间,并相应地调整nanosleep()
。 但是我对这个解决scheme并不满意,因为在测量的区域之外放置代码是非常容易的。
我已经search了互联网的替代品,我发现了三个电话:
如果解决scheme不能移植到Windows或其他操作系统,那也没关系。
但我不确定哪个解决scheme最适合我的问题。 任何意见或build议? 我提到的4个select有什么优点和缺点?
编辑:也有这个解决scheme的另一个问题:如果我得到的文档权利, nanosleep
系统调用进程进入睡眠至less10ms,但它可能需要更长的时间,如果系统负载…有什么办法优化?
编辑2:为了您的信息:在做工作部分networking请求是对networking上的另一个设备(一个微控制器或一个能够及时回答请求的PLC)进行的。 结果正在处理并发送回设备。 我知道Linux不是一个实时的操作系统,并不是最佳的这种任务…如果解决scheme不是完美的实时,这是没有问题的,但它将是很好的获得尽可能多的实时。
使用clock_nanosleep
,它可以让你请求睡眠,直到给定的绝对时间( TIMER_ABSTIME
标志),而不是持续时间。 然后你可以在每次迭代时简单地递增目标绝对时间10ms。
使用clock_nanosleep
也允许你(如果你想)使用单调时钟选项,并避免在程序运行时处理用户/管理员重置系统时钟的可能性。
检查在nanosleep
睡眠之前的时间,并计算在那里睡多久。 将不需要测量任何代码。 只要注意从nanosleep
睡休息时间,并计算你需要多少时间睡觉的时间。
信号处理是最好的方法。我更喜欢timer_create,因为它是符合POSIX.1-2001的posix函数。 微软还为编写POSIX标准代码提供帮助 。