我需要在用于家庭自动化应用的多核机器(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-lirc和
https://github.com/matzrh/rfm12b-linux(sun7i-spi补丁)