0

我需要在用于家庭自动化应用的多核机器(Allwinner A20 处理器)上进行精确计时

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

问题:

  • 可用内核只有legacy(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,在这种情况下,我需要脱离原子上下文并且计时根本不起作用。我实际上会喜欢这样,例如,每当使用 lirc bit banging 或 OOK 时,听音乐都会经历一些混乱。

有趣的是,我在 dmesg 中找到:“Calibrating delay loop ... 1914.96 BogoMIPS (lpj=3188736)”... 所以内核可能有问题,但我不知道在哪里寻找...

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

我实际上有两个问题

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

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

4

0 回答 0