博主示例用的 RK3399,跑的 Android 8.1。,为了方便大家抓 trace,博主写了一个 bat 脚本,大家在 windows 环境下,直接双击运行,按照提示三次回车即可,抓到的 trace 会输出在当前文件,名字是 SYS_TRACE。,my_trace.bat,这个脚本重要的地方都有注释,rem 开头的都是注释,请注意看第一个注释。,大概框架就是先把每个 CPU 的 buffer 设置为 65536,然后把想要抓取的 events 通过 for 循环设置进去,然后开启抓取,这时候你可以在设备上操作,复现问题,复现出来后,再停止抓取,并且把抓到的 trace 拉出来。,运行完毕后目录如下:,
,SYS_TRACE 如下:,
,本次我们只分析 i2c 问题,因此通过 grep 工具把 i2c 相关的提取出来。博主在 i2c4 上挂载了三个设备,通过 cat /proc/interrputs 确认 i2c4 的软件中断号是 41,则提取命令如下:,则提取出来的内容只包含 i2c4 部分,截取一部分分析:,
,i2c_read 到 irq_handler_entry 慢:,该路 I2C4 挂载设备过多,同时发起通信会抢占。,发起 i2c 传输的 user 线程优先级低,当多个设备同时发起 i2c 传输,或者前面已经有几个设备在等待,你的设备就拿不到锁,就一直排在后面。,硬件传输耗时久:比如从机有问题,或者 i2c 速率设置不对,用示波器可以抓到。,irq_handler_exit 到 i2c_reply 慢:,总结来讲:
© 版权声明
文章版权归作者所有,未经允许请勿转载。