如何在多核机器上实现精确的udelay时序?

时间:2017-06-24 10:27:15

标签: 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
  • LIRC的时序和配置文件似乎总是非常繁琐,而且IR接收器效果不佳。在重新访问之后,我注意到(多年后)udelay似乎以编程方式使用1664.12 BogoMIPS作为基础,但实际上它实际上使用了1914.94 BogoMIPS。时间总是比预期快15%左右。我很确定这是因为处理器的时序不同。
  • 如果我尝试使用usleep或usleep_range,我需要摆脱原子上下文,在这种情况下,时间根本不起作用。我实际上会喜欢这个,例如每当lilc位敲打或使用OOK时,听音乐会遇到一些争吵。

有趣的是,我发现在dmesg中:“校准延迟循环...... 1914.96 BogoMIPS(lpj = 3188736)”...... 因此内核可能有些可疑,但我不知道在哪里寻找......

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

我实际上有两个问题

  • 是否可以使用usleep来获得内核模块的精确计时(精确意味着使用精确度来立即重复延迟大约20个usecs),因此,没有原子上下文
  • udelay如何在为该处理器使用正确的BogoMIPS常量时,应该在哪个处理器上运行时更具“确定性”

如果有帮助,内核模块在这里: https://github.com/matzrh/sunxi-lirchttps://github.com/matzrh/rfm12b-linux(sun7i-spi补丁)

0 个答案:

没有答案