Linux kernel 如何在多核机器上实现精确的定时?

Linux kernel 如何在多核机器上实现精确的定时?,linux-kernel,embedded,delay,lirc,Linux Kernel,Embedded,Delay,Lirc,我需要有一个家庭自动化应用多核机器(Allwinner A20处理器)的精确定时 利用bit banging lirc(红外远程模拟)控制某些高保真和电视设备 使用RF-OOK控制一些RF控制插头或电视/投影仪屏幕,将来可能会更多 问题是: 可用的内核只是遗留的(3.4.1xx左右),它使用BogoMIPS来控制udelay() 这台机器有两个处理器。“cat/proc/cpuinfo”显示第一个处理器上有1914.96个BogoMIPS,第二个处理器上有1664.12个BogoMIPS

我需要有一个家庭自动化应用多核机器(Allwinner A20处理器)的精确定时

  • 利用bit banging lirc(红外远程模拟)控制某些高保真和电视设备
  • 使用RF-OOK控制一些RF控制插头或电视/投影仪屏幕,将来可能会更多
问题是:

  • 可用的内核只是遗留的(3.4.1xx左右),它使用BogoMIPS来控制udelay()
  • 这台机器有两个处理器。“cat/proc/cpuinfo”显示第一个处理器上有1914.96个BogoMIPS,第二个处理器上有1664.12个BogoMIPS
  • LIRC的定时和配置文件似乎总是非常复杂,红外接收器工作不好。再次访问之后,我注意到(几年后)udelay似乎以编程方式使用1664.12 BogoMIPS作为基础,但实际上它使用的是1914.94 BogoMIPS。时间总是比预期快15%左右。我很确定这是因为处理器的计时不同
  • 如果我尝试使用usleep或usleep_range,我需要脱离原子上下文,在这种情况下,计时根本不起作用。实际上,我希望这样,例如,每当使用lirc bit BANG或OOK时,听音乐会经历一些混乱
有趣的是,我在dmesg中发现:“校准延迟环路…1914.96 BogoMIPS(lpj=3188736)”。。。 所以内核可能有点可疑,但我不知道去哪里找

知道了这个问题,在指定延迟时当然可以考虑,但这似乎是一个可怕的黑客行为

实际上我有两个问题

  • 是否可以使用usleep来获得内核模块的精确计时(精确地说,对于大约20个usec的立即重复延迟,usec精度),因此,没有原子上下文
  • 在为该处理器使用正确的BogoMIPS常量时,udelay如何使其在哪个处理器上运行更具“确定性”
如果有帮助,内核模块如下: 和
(sun7i spi补丁)

听起来像是XY问题。为此类实时应用程序使用一个单独的小型MCU,并通过UART或USB等连接。Linux对于此类应用程序来说并不是一个好主意。快速的网络搜索表明AllWinner硬件具有纳秒分辨率的高分辨率计时器,似乎在2013年左右获得了内核支持。这些似乎可以通过
nanosleep()
内核接口访问。如果您的内核足够新,您可能只需将
usleep()
调用替换为相应的
nanosleep()
调用即可。@mfro:这并不保证代码将在计划时间内准确运行。SoC控制应用程序集成Cortex-M来完成这些任务是有原因的。@Olaf:我没说它会。OP抱怨udelay()的不准确,我只是建议在最近的内核中使用
nanosleep()
,以改善这种情况。@mfro:OP显然希望在美国范围内有一个精确的计时。这在标准内核中是无法实现的。对于他使用的硬件,即使是RT内核也不太可能完成此计时。他的第二个要点暗示他使用的术语“精确性”与结果无关,而是保证超时,而纳秒睡眠不会真正改变。