当前位置: 首页 > 面试题库 >

Linux下1ms分辨率定时器推荐方式

劳英华
2023-03-14
问题内容

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

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

有比在主循环中不断查询更好的方法吗?建议的解决方案是什么?

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

更新
我正在使用2.6.26内核。我知道您可以使其在1kHz时中断,然后可以将POSIX timer_
*函数编程为最高1ms,但这似乎并不可靠,我也不想使用它,因为在某些情况下它可能需要新的内核系统。一些备用内核似乎仍配置了100Hz。我将需要检测到这一点。该应用程序可能在我的系统以外的其他设备上运行:)

我无法入睡1ms,因为可能有网络事件需要我做出反应。

我的解决方法
由于并不是那么重要,我只声明全局计时器具有100ms的分辨率。使用自己的计时器的所有事件都必须设置至少100毫秒的计时器到期时间。我或多或少在想是否会有更好的方法,因此是一个问题。

为什么我接受答案 我认为自由空间的答案最能说明为什么没有实时Linux系统是不可能实现的。


问题答案:

在主循环中轮询也不是解决问题的方法-您的进程可能不会获得太多的CPU时间,因此在您的代码开始运行之前,将经过10ms以上的时间,从而使其无意义。

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

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



 类似资料:
  • 我想用Java模拟TCP。 我找到了System.nanotime()方法,但是没有方法可以在指定的微秒或纳秒内阻塞线程。如果有这样的方法,那么请让我知道。system.nanotime()只是给出了以纳秒为单位的相对时间间隔。 我可以使用System.nanotime()在使用busy-loop的线程中执行纳秒级延迟,但这将浪费CPU时间,而CPU本来可以用于接收数据线程或处理线程。 另一个令人

  • 问题内容: 在Windows下,有一些方便的功能,如from 可以创建高分辨率计时器。Linux有类似的东西吗? 问题答案: 在此之前ows-queryperformancecounter-on-osx)有人问过它-但是基本上,您可以使用boostptime函数,或者可以基本实现相同目的的POSIX clock_gettime()函数。

  • 问题内容: 我想用Java模拟TCP。 为此,我有多个线程,例如每个TCP连接的发送者和接收者线程。 我的问题是,我想暂停(如Thread.sleep())线程数微秒的时间间隔。这样我就可以模拟流控制,发送者线程将在发送下一个数据包之前阻塞几微秒,同时接收和数据处理线程可以使用CPU。但是我找不到任何执行sleep()或wait()的方法来获得微秒或纳秒分辨率。如何以微秒或纳秒分辨率阻塞(暂停)J

  • 如果安装了 Linux 的图形界面,则使用图形界面修改分辨非常方便也很简单。但是如果只安装了字符界面,难道就不能修改分辨率了吗? 当然是可以的,只要利用 GRUB 的配置文件就可以完成。当然需要确定内核是否支持 CONFIG_FRAMEBUFFER_CONSOLE 功能,如果没有开启这项功能,则需要重新编译内核。査询方法如下: [root@localhost ~]# grep "CONFIG_FR

  • 功能介绍 获取百度移动统计平台的全部屏幕分辨率列表 接口 https://openapi.baidu.com/rest/2.0/mtj/svc/config/getScreenList?access_token={ACCESS_TOKEN} 请求参数 参数名 类型 描述 样例 access_token string 用户登入后获取的token 1.a6b7dbd428f731035f771b8d

  • 好的,这里有一个奇怪的问题,我有问题(用gcc btw编译) 下面是用于命令提示的Mandelbrot分形生成器的源代码。我以前做过这项工作,我想加快自己的测试速度,看看我能以多快的速度生成命令提示符中实际生成Mandelbrot分形所需的代码。我经常这样做是为了给自己找点乐子 不管怎样,我遇到了一个新问题,我不太明白问题是什么。当分形呈现时,无论我设置了多少次迭代或什么转义值,它都将始终显示为椭