跳转至

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

2.3.4 图表展示