STR各阶段耗时debug指南¶
1.STR介绍¶
STR 是 “Suspend to RAM” 的缩写,中文译为 “挂起到内存”。
工作原理:系统休眠时,CPU、外设等非核心部件断电,仅保留内存供电。
核心目的:在不丢失运行状态(如打开的程序、数据)的前提下,最大限度降低功耗。
1.1 STR流程分析¶
1.2 STR 各阶段简介¶
此处只介绍suspend流程,resume流程为相反流程。
1.切换到suspend console(休眠控制台):
主要是为了确保在休眠过程中,系统的关键信息仍然可以被捕获和查看(设备驱动、系统)。
2.PM_SUSPEND_PREPARE通知
通知所有已注册的设备驱动进行休眠前的准备。设备驱动可以通过实现相应的回调函数来响应此通知,进行必要的状态保存、资源释放等操作,以确保设备能够安全地进入休眠状态。
3.device suspend
遍历系统中所有已注册的设备列表,调用其对应的suspend方法
4.disable secondary cpus
关闭非主CPU。
5.arch suspend disable irqs
关闭全局中断。阻止新的中断被触发,并等待当前正在处理的中断完成。
6.syscore_suspend
调用所有注册到syscore框架中的驱动或模块的挂起回调函数
7.pm_wakeup_pending
监测是否有唤醒事件产生,并根据需要中止休眠流程
8.suspend_ops enter
进入suspend,等待唤醒
STR时间是1S或多S一帧的情况下,SOC有电的时间,此时间可以从侧面反映功耗,为了快速定位STR各阶段耗时,提供以下debug方法。
2.使用方法¶
2.1 步骤¶
第1步:打开pm_stage_profiler功能
第2步:运行STR应用。
第3步:cat kmsg,查看kmsg中的pm_stage_profiler耗时信息。(参考2.3章节中的kmsg信息示例)
# 打开pm_stage_profiler功能
echo 1 > /sys/devices/virtual/sstar/msys/pm_stage_profiler
# 关闭pm_stage_profiler功能
echo 0 > /sys/devices/virtual/sstar/msys/pm_stage_profiler
2.2 各阶段耗时计算方法¶
| 流程 | 计算方法 | 说明 |
|---|---|---|
| IPL耗时 | IPL Total cost | IPL阶段耗时 |
| resume过程耗时 | mi_post_suspend_end+ - resume+ | resume 流程耗时 |
| APP耗时 | mi_suspend_start+ - mi_post_suspend_end+ | APP alive的时间 |
| suspend过程耗时 | suspend mem - mi_suspend_start+ | suspend到硬件实际睡下去的耗时 |
| 曝光时间 | vif framestart - vif resume | 从vif resume到vif framestart为曝光时间 |
| vif做一帧的时间 | vif frameend - vif framestart |
2.3 举例¶
以单sensor realtime为例:
2.3.1 场景¶
2.3.2 kmsg信息¶

2.3.3 各阶段耗时计算¶
硬件IO上电和下电的耗时可以通过LA测量整体alive时间,然后减去"IPL + Resume + APP + Suspend"的时间
IPL:"IPL Total cost" = 6335 us
Resume: "mi_post_suspend_end+ time" - "resume+ time" = 31033 - 15888 = 15145 us
APP: "mi_suspend_start+ time" - "mi_post_suspend_end+ time" = 84260 - 31033 = 53227 us
Suspend: "PM_SUSPEND_MEM time" - "mi_suspend_start+ time" = 98987 - 84260 = 14727 us
曝光时间:"mi_vif_framestart+ time" - "mi_vif_resume+ Dev0 time" = 48082 - 34569 = 13513 us
vif做一帧的时间:"mi_vif_frameend+ time" - "mi_vif_framestart+ time" = 80761 - 48082 = 32679 us