- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
在嵌入式 linux 内核模块中,我正在尝试实现每秒发生的测量操作,并且我正在使用 hrtimer 来提供计时。下面的函数是设置定时器时注册的回调。值得关注的是为 hrtimer 的下一个回调触发器添加时间的正确方法。我使用“hrtimer_add_expires_ns”的理解是,这会将 xx ns 添加到上次设置的计时器“过期”时间。
static enum hrtimer_restart delay_callback (struct hrtimer* MeasDelay)
{
hrtimer_add_expires_ns (MeasDelay, MS2NS(1000));
printk (KERN_ALERT "Delay Callback (%d).\n", DelayCount);
if (0 == DelayCount)
{
/* Reset delay counter */
DelayCount = MEASDELAYSECS;
/* Setup stuff to do when counter reaches zero */
}
else
{
/* Drop the counter */
DelayCount--;
}
return HRTIMER_RESTART;
}
当运行此代码并查看/var/log/syslog 时,我发现日志中存储的消息的“漂移”时间不断增加:
Feb 15 13:48:15 blah: [ 4731.033628] Delay Callback (5).
Feb 15 13:48:16 blah: [ 4732.034576] Delay Callback (4).
Feb 15 13:48:17 blah: [ 4733.035861] Delay Callback (3).
Feb 15 13:48:18 blah: [ 4734.036855] Delay Callback (2).
Feb 15 13:48:19 blah: [ 4735.038025] Delay Callback (1).
Feb 15 13:48:20 blah: [ 4736.039170] Delay Callback (0).
Feb 15 13:48:21 blah: [ 4737.040332] Delay Callback (5).
Feb 15 13:48:22 blah: [ 4738.041493] Delay Callback (4).
Feb 15 13:48:23 blah: [ 4739.042621] Delay Callback (3).
Feb 15 13:48:24 blah: [ 4740.043792] Delay Callback (2).
Feb 15 13:48:25 blah: [ 4741.044949] Delay Callback (1).
Feb 15 13:48:26 blah: [ 4742.046109] Delay Callback (0).
Feb 15 13:48:27 blah: [ 4743.047264] Delay Callback (5).
Feb 15 13:48:28 blah: [ 4744.048436] Delay Callback (4).
Feb 15 13:48:29 blah: [ 4745.049567] Delay Callback (3).
Feb 15 13:48:30 blah: [ 4746.050725] Delay Callback (2).
Feb 15 13:48:31 blah: [ 4747.051852] Delay Callback (1).
Feb 15 13:48:32 blah: [ 4748.054040] Delay Callback (0).
每个回调执行时间戳略多于预期的 1 秒。我确实知道时间戳是存储消息的时间,但我希望时间会“抖动”而不是不断前进......如果计时器正在做我期望的事情,即在最后一次过期后增加一秒时间(不是“现在”)。
换句话说,我希望记录的时间戳总是尝试从初始计时器开始时间起一秒的倍数(编辑时间戳以显示如果计时器在 xxxx.040000 开始时我的预期) :
Feb 15 13:48:21 blah: [ 4737.040073] Delay Callback (5).
Feb 15 13:48:22 blah: [ 4738.040100] Delay Callback (4).
Feb 15 13:48:23 blah: [ 4739.040098] Delay Callback (3).
Feb 15 13:48:24 blah: [ 4740.040050] Delay Callback (2).
Feb 15 13:48:25 blah: [ 4741.040110] Delay Callback (1).
Feb 15 13:48:26 blah: [ 4742.040101] Delay Callback (0).
Feb 15 13:48:27 blah: [ 4743.041234] Delay Callback (5).
Feb 15 13:48:28 blah: [ 4744.040030] Delay Callback (4).
Feb 15 13:48:29 blah: [ 4745.040075] Delay Callback (3).
Feb 15 13:48:30 blah: [ 4746.040099] Delay Callback (2).
Feb 15 13:48:31 blah: [ 4747.040057] Delay Callback (1).
Feb 15 13:48:32 blah: [ 4748.040040] Delay Callback (0).
感谢您帮助我们更好地理解 linux hrtimers 的使用。
最佳答案
HR 计时器和 printk
使用不同的时间源,因此它们测量的间隔不需要相等。
printk
使用基于 jiffies 的低分辨率(但快速)时间源。 HR 计时器,顾名思义,使用分辨率更高的时间源(如果可用)。
您可以检查计时器的字段 ._softexpires
和 .node.expires
是否以 fixed 步长递增。正是这些字段负责触发计时器。
关于linux - 为什么我在使用 linux hrtimer 进行一秒回调时会出现时间漂移?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35421143/
我希望创建能够快速重复的功能 - 大约 50 毫秒。然而,我需要在调用中尽可能保持一致性,并且我发现 NSTimer 有点不稳定。看来我可能会从 mach_absolute_time 找到一些保持时间
根据 API 文档以及之前的 SO threads , SystemClock.elapsedRealtime() 应该即使在设备处于 sleep 状态时也能保持准确的时间。这不是我观察到的。 我编写
我想开发在谷歌地图上绘制当前位置的应用程序。在这里,我通过 LocationManager(GPS 提供商和网络提供商)的 onLocationChanged 获取位置详细信息。我能够获取位置详细信息
我有一个使用 MKMapView 的简单 iPhone 应用程序。它有一个分段控件,可以调整要缩放的区域(街道、社区、城市、州、世界)。它工作正常,但如果我缩小到州级别并回到街道,我注意到中心点已经移
我正在尝试在连接到本地 NTP 服务器的 Mac 上获取实际的 NTP 漂移。 读取/var/db/ntp.drift 文件时,根据PPM to milliseconds conversion 得到-
我有一个 AWS Cloud Formation 堆栈。我启动并停止了该堆栈中的 EC2 实例。现在堆栈已漂移,下面是漂移结果。我该如何解决这个问题,因为预期和实际都是相同的。 最佳答案 我不相信这与
我是一名优秀的程序员,十分优秀!