我正在测试微控制器(teensy4.1)和我的台式电脑(ubuntu 20.04.3,带有 5.15 内核,并修补了 PREEMPT-RT)之间的通信延迟
微控制器通过USB线直接与电脑连接,电脑上的串口通信是通过对/dev/ttyACM0的读写来实现的。
代码是用 c++ 编写的,并设置为在核心 #8 上专门运行。所述核心也通过isolcpu
修改进行了隔离/etc/default/grub
。我通过检查进程确认了核心隔离,htop
显示只有我的测试程序在核心 #8 上运行。程序的优先级设置为 99,并SCHED_FIFO
采用调度策略。内核节拍频率设置为 1000Hz。CPU 频率调节器设置为performance
。我确认没有 CPU 节流,因为核心频率始终在最高可能频率左右(4.1Ghz)。
编辑:CPU 是第 8 代英特尔 i5,具有 4 个物理核心和 8 个线程。
测试非常简单:
电脑端:
- 计算机
read()
以阻塞模式调用并等待其返回。 - 测量每次连续返回之间的时间间隔
read()
。为简单起见,我们将引用该值Te
。 - 在while循环中重复1-2。
微控制器端:
- 微控制器通过写入串行向计算机发送 1 个字节。
- 以 1000 Hz 的频率重复 1。
预期成绩:
理想情况下,Te
应该正好是 1000 微秒。
检测结果:
Te
几乎总是在 1000 微秒左右(950~1050)。这对于我的应用程序来说已经足够了。
然而,我发现了两个问题:
- 有时,
Te
即使计算机处于空闲状态,也可能会飙升至 50000 微秒左右。 Te
当计算机的工作量增加时,峰值会变得更加规律。当非独立核心的 CPU 使用率达到约 90% 的峰值时,这种情况尤其普遍。
我已经用示波器确认我的微控制器以精确的时间发送字节。因此,这不太可能与微控制器有关。Te
峰值和计算机工作量之间的相关性也表明了这一点。
我知道 USB 与硬时序要求不太兼容,但我得到的测试结果表明,该系统可以满足我的要求并且大多数时间都能响应。
我真的很想知道是什么导致了时间的激增以及有哪些可能的方法可以解决这些问题。任何帮助和建议都非常感谢!