您现在的位置是:首页 > Javascript
当前栏目
手把手教你分析 Trace,你学会了吗?
2023-02-19 12:23:56 时间
博主示例用的 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 慢:
- 发起 i2c 传输的 user 线程优先级低,i2c 中断来了以后叫起 user 线程,但是被高优先级线程抢占,user 线程一直得不到 CPU 调度。
- 很多时候为了功耗,会设置 i2c 中断无法打醒 CPU。比如在 CPU0 发起一次 i2c 通信,CPU0 并没有等其返回,没事做就进入了 idle 状态,i2c 中断来了以后唤醒不了 CPU0,导致慢。【该原因和调度策略也有关系,当其他 CPU 空闲时候,user 线程应该调度到其他 CPU 处理才对】
总结来讲:
- 如果是 user 线程优先级低,则你观察到的 i2c 传输耗时是整体慢。
- 如果是 CPU 进入 idle 导致你的 i2c 传输耗时,则是概率性出现,并且耗时偶尔会出现 15-25ms 这种级别,无法忍受。
相关文章
- [你必须知道的JavaScript]解构赋值
- JavaScript基础
- 手写一个格式化json工具
- threejs旋转入门
- 我用nodejs实现了热加载接口文件,感觉又离“serverless”进了一步
- nodejs 解决sql注入方案
- nvm-windows管理nodejs版本神器——代理和镜像配置
- 关于node代码如何丝滑执行多条命令行这件事
- JavaMoney规范(JSR 354)与对应实现解读
- Node.js 应用全链路追踪技术——[全链路信息获取]
- api接口返回动态的json格式?我太难了,尝试一下 linq to json
- 对 JsonConvert 的认识太肤浅了,终于还是遇到了问题
- Node.js 模块化你所需要知道的事
- 初识 D3.js :打造专属可视化
- knockoutjs如何动态加载外部的file作为component中的template数据源
- NodeJs和NPM的基本操作
- 使用 System.Text.Json 时,如何处理 Dictionary 中 Key 为自定义类型的问题
- 如何使用 System.Text.Json 序列化 DateTimeOffset 为 Unix 时间戳
- javascript使用正则表达式替换或者捕获子字符串
- FastAPI从入门到实战(14)——JSON编码兼容与更新请求