如果你有精确的计时要求,那么计时器分辨率很重要,这是实时应用的典型要求。 Linux 中的默认计时器是以可配置的频率运行的时钟,对于嵌入式系统,通常为 100 Hz,对于服务器和台式机,通常为 250 Hz。 两个计时器滴答之间的间隔是,称为jiffy,在前面给出的例子中,在嵌入式 SoC 上是 10 毫秒,在服务器上是 4 毫秒。
Linux 从 2.6.18 版的实时内核项目中获得了更精确的计时器,现在只要有高分辨率的计时器源代码和设备驱动程序,它们就可以在所有平台上使用--这几乎总是如此。 您需要使用CONFIG_HIGH_RES_TIMERS=y
配置内核。
启用此功能后,所有内核和用户空间时钟都将精确到底层硬件的粒度。 很难找到实际的时钟粒度。 显而易见的答案是clock_getres(2)
提供的值,但它总是要求 1 纳秒的分辨率。 稍后我将介绍的cyclictest
工具有一个选项,可以分析时钟报告的时间以猜测分辨率:
cyclictest -R Unable to change scheduling policy! Probably missing capabilities, either run as root or increase RLIMIT_RTPRIO limits.
# cyclictest -R # /dev/cpu_dma_latency set to 0us WARN: reported clock resolution: 1 nsec WARN: measured clock resolution approximately: 708 nsec
您还可以查看如下字符串的内核日志消息:
# dmesg | grep clock OMAP clockevent source: timer2 at 24000000 Hz sched_clock: 32 bits at 24MHz, resolution 41ns, wraps every 178956969942ns OMAP clocksource: timer1 at 24000000 Hz Switched to clocksource timer1
dmesg | grep clock [ 0.000000] clocksource: arch_sys_counter: mask: 0xffffffffffffff max_cycles: 0x171024e7e0, max_idle_ns: 440795205315 ns [ 0.000001] sched_clock: 56 bits at 100MHz, resolution 10ns, wraps every 4398046511100ns [ 3.547681] clocksource: jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 7645041785100000 ns [ 3.618101] clocksource: Switched to clocksource arch_sys_counter [ 12.053175] rtc-efi rtc-efi: setting system clock to 2021-10-08 02:17:05 UTC (1633659425)
[root@centos7 ~]# dmesg | grep clock [ 0.000000] clocksource: arch_sys_counter: mask: 0xffffffffffffff max_cycles: 0x171024e7e0, max_idle_ns: 440795205315 ns [ 0.000001] sched_clock: 56 bits at 100MHz, resolution 10ns, wraps every 4398046511100ns [ 4.502670] clocksource: jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 19112604462750000 ns [ 4.575639] clocksource: Switched to clocksource arch_sys_counter [ 13.261341] rtc-efi rtc-efi: setting system clock to 2022-01-06 04:02:14 UTC (1641441734) [root@centos7 ~]#