gpt4 book ai didi

c - linux下1ms分辨率定时器推荐方式

转载 作者:IT王子 更新时间:2023-10-29 00:20:05 29 4
gpt4 key购买 nike

我需要一个在 Linux 下分辨率为 1ms 的计时器。它用于递增计时器值,计时器值又用于查看是否应触发各种事件。由于 glibc 要求,POSIX timerfd_create 不是一个选项。我尝试了 timer_create 和 timer_settimer,但我从它们那里得到的最好结果是 10 毫秒的分辨率,较小的值似乎默认为 10 毫秒的分辨率。根据联机帮助页,Getittimer 和 setitimer 的分辨率为 10 毫秒。

我目前能想到的执行此计时器的唯一方法是在我的主循环中使用 clock_gettime 和 CLOCK_MONOTONIC 测试是否已通过 ms,如果已通过则增加计数器(然后检查是否应触发各种事件).

有没有比在主循环中不断查询更好的方法呢?推荐的解决方案是什么?

我使用的语言是普通的旧 c

更新
我使用的是 2.6.26 内核。我知道你可以让它以 1kHz 的频率中断,然后 POSIX timer_* 函数可以被编程为最多 1ms 但这似乎不可靠而且我不想使用它,因为它可能需要一些新内核系统。一些库存内核似乎仍配置了 100Hz。我需要检测到这一点。该应用程序可能在我的系统之外的其他东西上运行:)

我不能睡 1 毫秒,因为可能有网络事件我必须使用react。

我是如何解决的因为它不是那么重要,所以我简单地声明全局计时器的分辨率为 100 毫秒。使用自己的计时器的所有事件都必须设置至少 100 毫秒的计时器到期时间。我或多或少想知道是否有更好的方法,因此提出了这个问题。

为什么我接受了这个答案我认为 freespace 的回答最能说明为什么没有实时 Linux 系统就不可能实现。

最佳答案

在主循环中轮询也不是一个答案 - 您的进程可能不会获得太多 CPU 时间,因此在您的代码开始运行之前会超过 10 毫秒,使其变得毫无意义。

10ms 是大多数非 realtime operating systems 的标准定时器分辨率。 (实时操作系统)。但这在非 RTOS 中没有实际意义——调度程序和调度程序的行为将极大地影响您对计时器到期的响应速度。例如,即使假设您有一个低于 10 毫秒分辨率的计时器,如果您的代码未运行,您也无法响应计时器到期。由于您无法预测您的代码何时运行,因此您无法准确响应计时器到期。

当然还有实时 linux 内核,参见 http://www.linuxdevices.com/articles/AT8073314981.html一个列表。 RTOS 提供了一些设施,您可以通过这些设施获得有关代码何时运行的软保证或硬保证。这是可靠且准确地响应计时器到期等的唯一方法。

关于c - linux下1ms分辨率定时器推荐方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/240058/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com