我在嵌入式 Linux 环境中工作,调试与 Zigbee 设备配对/绑定相关的高度时序敏感问题。
我们的架构是通过 SPI 接口从 Zigbee 前端模块读取数据,然后从内核空间传递到用户空间进行处理。处理后的数据和响应随后被传回内核空间并再次通过 SPI 接口输出。
Zigbee 802.15.4 时序要求规定我们需要在 19.5 毫秒内做出响应,并且我们经常会在此窗口之外做出响应,这会导致网络出现故障和丢包。
Linux 内核未在启用抢占的情况下运行,也可能无法启用抢占。
我的怀疑是,由于内核不可抢占,还有另一个任务/进程正在使用 ioctl() 接口,这会使 Zigbee 应用程序延迟足够长的时间,以至于超过 19.5 毫秒的窗口。
我尝试了以下工具
- oprofile - 这里没有太大帮助,因为它分析了整个系统,并且应用程序在这段时间内实际上并不是很忙,因为它移动了如此少量的数据
- strace - 开销太大,虽然我没有太多使用它的经验,所以也许可以改进输出。开销对性能的影响如此之大,以至于应用程序根本无法运行
有没有其他轻量级的方法来分析这样的系统?
当 ioctl 调用挂起在另一个任务/线程上时,无论如何要捕获吗?(假设这是问题的根本原因)