【问题标题】:programming EXACT timer which calles a function in c language every x seconds编程 EXACT 计时器,每 x 秒调用一次 c 语言中的函数
【发布时间】:2019-12-22 15:16:16
【问题描述】:

我的程序的一部分需要一些帮助。我想每隔 x 秒调用一个函数。 大多数灵魂的问题是,调用 sleep() 或 w/e 函数的时间会随着时间的推移而堆积。

一个例子:如果我想用 sleep(1) 每秒调用一个函数,它需要 1 秒 + 一个非常小的 x(调用 sleep() 函数的时间)。 所以需要 1,x 秒。不是 1.0 秒。

在很长一段时间内,x 会累积“大量”时间。

我想要一个代码 sn-p,它每秒执行一次,这样我就可以在没有任何额外延迟的情况下获得准确的时间戳。 我认为这是实时编程问题的一部分。

那里有一些工作代码吗?

请帮我解决这个问题。 :)

FloKL

【问题讨论】:

  • Linux 不是实时操作系统。对于您正在尝试做的事情,即让您的代码以 100% 的可预测性运行,您需要一个合适的 RTOS。有一种叫做 [RTLinux][1] 的东西可以为 Linux 系统提供实时功能。 [1]:windriver.com/products/linux/download/#product_versions

标签: c linux timer real-time


【解决方案1】:
 int X = 10;
 int t1 = (int)time(NULL);
 while(1==1){
     // execute your process
     ...
     // calculate next tick
     t1 = t1 + X;
     sleep(t1 - (int)time(NULL));
 }

【讨论】:

  • 非常感谢!这对我有帮助!是否也有非阻塞解决方案?处理器在等待下一次执行时可以处理自己的东西吗?
  • @FloKl 如果“非阻塞”是指“非轮询,非忙等待”,那么是的,任何涉及 sleep() 的解决方案都满足此要求。当您调用sleep() 时,操作系统会为您的进程分配最少的资源,并且可以做其他事情。
  • 这段代码的一个问题是它会有长达一秒的“抖动”。这可以通过调用诸如gettimeofdayclock_gettime 之类的函数而不是time 来避免,但代价是必须对struct timevalstruct timespec 执行更复杂的算术。
【解决方案2】:

您可以将您的睡眠调用重新编码为有效传递1 - a 而不是1,其中a 是一个调整计算以消除累积的x。 (显然你需要调整睡眠单元,因为a 通常会小于1)。

否则,C 没有直接提供“精确”时间的便利。您需要为此使用外部硬件。并且期望为原子钟级别的准确性付出很多钱。

【讨论】:

  • 非常感谢。你的答案和angelito的解一样对吧?
  • @FloKl 正确解决方案的基本特征是每次通过循环调用time()(或通过从外部时钟获取时间来同步您的程序的其他函数)。 angelito 的回答明确了这个电话;芭丝谢芭的回答没有。
  • @SteveSummit:是的,没错。我没有尝试解决方案,因为它会与准确性要求相矛盾。是的,angelito 的回答实现了我在第一段中的建议。
【解决方案3】:

建议使用函数:setitimer(),通过头文件暴露:<sys/timer.h>

建议阅读 setitimer 的 MAN 页面了解所有详细信息

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-13
    • 1970-01-01
    • 1970-01-01
    • 2017-10-28
    • 2019-04-08
    • 1970-01-01
    • 2012-03-14
    • 2021-12-03
    相关资源
    最近更新 更多