在linux上每10ms定期执行一次函数

时间:2014-03-04 07:20:19

标签: c++ c linux

我目前正在制定一项必须定期开展工作的计划。目前我使用以下结构:

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()。但是我对这个解决方案不满意,因为将代码放在测量区域之外很容易......

我在互联网上寻找替代方案,我找到了三个电话:

  • timer_create
  • getitimer
  • 报警
  • timerfd_create

如果解决方案无法移植到Windows或其他操作系统,那也没关系。

但我不确定哪种解决方案最适合我的问题。有什么建议或意见吗?我提到的4种替代方案的优缺点是什么?

编辑:此解决方案还有另一个问题:如果我获得正确的文档,nanosleep系统调用会使进程进入睡眠状态至少10毫秒,但可能需要更长时间如果系统负载不足......有没有办法优化它?

EDIT2:供您参考:在工作部分,网络请求发送到网络上的另一台设备(能够及时回复请求的微控制器或PLC)。结果正在处理并发送回设备。我知道Linux不是一个实时操作系统,并不是这种任务的最佳选择......如果解决方案不是完美的实时解决方案就没问题,但是尽可能多地实时获取它会很好。

3 个答案:

答案 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还允许您(如果需要)使用单调时钟选项,并避免在程序运行时处理用户/管理员重置系统时钟的可能性。