开关机过程¶
1. 开机流程¶
Solution开机流程是指从上电/复位到主界面出现的完整过程,涵盖多场景启动原因、启动原因识别及分阶段启动逻辑。
1.1 开机原因¶
触发开机的场景包括以下7类:
重新上电;
看门狗复位重启;
软件调用
drv_reboot重启;关机后,长按开机重启;
硬复位重启;
闹钟唤醒开机;
连接充电后开机;
1.2 获取开机原因的方式¶
开机后可通过Log查看开机原因,Log示例如下:
1.2.1 开机模式枚举定义¶
开机模式(pm_power_on_mode_t)的代码定义及含义如下:
/** power on mode */
typedef enum
{
PM_COLD_BOOT = 0, /**< cold boot 冷启动*/
PM_STANDBY_BOOT, /**< boot from standby power mode standby 开机启动*/
PM_HIBERNATE_BOOT, /**< boot from hibernate mode, system can be woken up by RTC and PIN precisely hibernate 开机启动 */
PM_SHUTDOWN_BOOT, /**< boot from shutdown mode, system can be woken by RTC and PIN,
but wakeup time is not accurate shutdown 开机启动*/
PM_REBOOT_BOOT /**< boot from reboot 软件重启*/
} pm_power_on_mode_t;
1.2.2 常见开机模式对应场景¶
开机模式 |
枚举值 |
对应场景 |
适用芯片系列 |
|---|---|---|---|
PM_COLD_BOOT |
0 |
冷启动(重新上电、硬复位重启) |
全系列 |
PM_STANDBY_BOOT |
1 |
Standby关机后启动(长按开机键) |
56X系列 |
PM_HIBERNATE_BOOT |
2 |
Hibernate关机后启动(长按开机键) |
52X/55X/58X系列 |
PM_REBOOT_BOOT |
4 |
软件复位(看门狗复位、 |
全系列 |
1.3 开机流程简述¶
上电或重启后,系统按“一级Boot → 二级Boot → OTA Manager → User_bin”的顺序启动,流程图如下:
各阶段核心作用: 一级 Bootloader / 二级 Bootloader:完成芯片核心电路初始化、PSRAM/Flash 初始化及代码搬移。 OTA Manager:仅用于 NOR Flash 升级管理,非升级场景不涉及额外操作。 User_bin:加载用户应用程序,执行初始化逻辑,最终呈现系统主界面。
1.4 user_bin 启动流程¶
User_bin 从启动(startup)到主界面出现的详细流程如下,涵盖初始化、线程调度及关键动作:
其中component init(组件初始化) 和((app_power_on_action ()(开机动作处理)** 是核心环节,具体说明如下:
1.4.1 component init(组件初始化)¶
功能:按预设优先级顺序,逐个初始化系统注册的组件(如设备、文件系统、网络等),定义在
components.c中。优先级与组件类型对应代码:
// 前置初始化(基础环境准备)
#define INIT_PREV_EXPORT(fn) INIT_EXPORT(fn, "2", "5")
// 设备初始化(硬件设备驱动初始化)
#define INIT_DEVICE_EXPORT(fn) INIT_EXPORT(fn, "3", "5")
// 组件初始化(DFS文件系统、LWIP网络等核心组件)
#define INIT_COMPONENT_EXPORT(fn) INIT_EXPORT(fn, "4", "5")
// 环境初始化(磁盘挂载、配置加载等)
#define INIT_ENV_EXPORT(fn) INIT_EXPORT(fn, "5", "5")
// 应用前置初始化(RTGUI图形库等应用依赖组件)
#define INIT_PRE_APP_EXPORT(fn) INIT_EXPORT(fn, "6", "5")
// 应用初始化(用户业务应用初始化)
#define INIT_APP_EXPORT(fn) INIT_EXPORT(fn, "7", "5")
线程调度特性:执行于main线程,该线程优先级为 6(远高于其他线程),期间创建的所有线程需等待
component init执行完毕后,才会获得调度机会。
1.4.2 app_power_on_action ()(开机动作处理)¶
线程调度逻辑:
component init执行完成后,gui_thread(优先级 10,系统最高)立即启动,并创建阻塞线程;此时低优先级线程无法执行,直至阻塞线程被删除,gui_thread优先级降至 19,其他线程才恢复调度。流程阶段:整体分为 “动画前准备 → 播放开机动画 → 动画后初始化” 三个阶段,流程图如下:
关键注意点:
lcpu_power_on()函数调用的bt_rf_cal()(蓝牙射频校准)执行期间,会阻塞所有其他线程,需避免在此阶段插入耗时操作。芯片差异:52X 与 56X 系列的
lcpu_power_on()执行位置不同,具体差异对比图如下:
2. 关机流程¶
Solution 关机流程是指调用app_power_off_action()接口后,到系统完全关机的全过程,包含关机原因、类型及分阶段处理逻辑。
2.1 关机原因¶
触发关机的场景主要有以下 4 类:
低电关机:电池电量低于阈值,系统自动触发关机。
长按开机键关机:长按开机键触发关机界面,确认后关机。
UI 操作关机:通过系统设置或快捷菜单,触发关机界面并确认关机。
恢复出厂设置:执行恢复出厂设置操作后,系统自动关机重启以应用配置。
2.2 关机类型¶
关机分为Hibernate 关机和Standby 关机两类,核心差异在于功耗和唤醒逻辑,具体说明如下:
支持芯片:仅 56X 系列支持 Standby 关机,52X/55X/58X 等系列默认使用 Hibernate 关机。
配置方式:通过 menuconfig 选择关机类型,配置界面截图如下:
选中配置项:启用 Standby 关机(低功耗,支持快速唤醒)
未选中配置项:启用 Hibernate 关机(功耗更低,唤醒速度相对较慢)
2.3 关机过程¶
关机过程统一分为 “灭屏前处理流程” 和 “灭屏后pm_shutdown 过程”,前者对两种关机类型通用,后者因类型不同存在差异。
2.3.1 灭屏前处理流程(通用)¶
两种关机类型的灭屏前逻辑一致,主要完成业务收尾、资源释放,流程如下:
2.3.2 灭屏后 pm_shutdown 过程(分类型)¶
Hibernate 关机过程 流程较简洁,无需大小核交互,直接进入低功耗关机状态,如下:
Standby 关机过程 涉及大核(HCPU)与小核(LCPU)的交互,需同步核心状态后进入低功耗,流程如下: