开关机过程

1. 开机流程

Solution开机流程是指从上电/复位到主界面出现的完整过程,涵盖多场景启动原因、启动原因识别及分阶段启动逻辑。

1.1 开机原因

触发开机的场景包括以下7类:

  • 重新上电;

  • 看门狗复位重启;

  • 软件调用drv_reboot重启;

  • 关机后,长按开机重启;

  • 硬复位重启;

  • 闹钟唤醒开机;

  • 连接充电后开机;

1.2 获取开机原因的方式

开机后可通过Log查看开机原因,Log示例如下:

fishy

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

软件复位(看门狗复位、drv_reboot调用)

全系列

1.3 开机流程简述

上电或重启后,系统按“一级Boot → 二级Boot → OTA Manager → User_bin”的顺序启动,流程图如下:

fishy

各阶段核心作用: 一级 Bootloader / 二级 Bootloader:完成芯片核心电路初始化、PSRAM/Flash 初始化及代码搬移。 OTA Manager:仅用于 NOR Flash 升级管理,非升级场景不涉及额外操作。 User_bin:加载用户应用程序,执行初始化逻辑,最终呈现系统主界面。

1.4 user_bin 启动流程

User_bin 从启动(startup)到主界面出现的详细流程如下,涵盖初始化、线程调度及关键动作:

fishy

其中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,其他线程才恢复调度。

  • 流程阶段:整体分为 “动画前准备 → 播放开机动画 → 动画后初始化” 三个阶段,流程图如下:

fishy
  • 关键注意点:lcpu_power_on()函数调用的bt_rf_cal()(蓝牙射频校准)执行期间,会阻塞所有其他线程,需避免在此阶段插入耗时操作。

  • 芯片差异:52X 与 56X 系列的lcpu_power_on()执行位置不同,具体差异对比图如下:

fishy

2. 关机流程

Solution 关机流程是指调用app_power_off_action()接口后,到系统完全关机的全过程,包含关机原因、类型及分阶段处理逻辑。

2.1 关机原因

触发关机的场景主要有以下 4 类:

  • 低电关机:电池电量低于阈值,系统自动触发关机。

  • 长按开机键关机:长按开机键触发关机界面,确认后关机。

  • UI 操作关机:通过系统设置或快捷菜单,触发关机界面并确认关机。

  • 恢复出厂设置:执行恢复出厂设置操作后,系统自动关机重启以应用配置。

2.2 关机类型

关机分为Hibernate 关机和Standby 关机两类,核心差异在于功耗和唤醒逻辑,具体说明如下:

  • 支持芯片:仅 56X 系列支持 Standby 关机,52X/55X/58X 等系列默认使用 Hibernate 关机。

  • 配置方式:通过 menuconfig 选择关机类型,配置界面截图如下:

fishy
  • 选中配置项:启用 Standby 关机(低功耗,支持快速唤醒)

  • 未选中配置项:启用 Hibernate 关机(功耗更低,唤醒速度相对较慢)

2.3 关机过程

关机过程统一分为 “灭屏前处理流程” 和 “灭屏后pm_shutdown 过程”,前者对两种关机类型通用,后者因类型不同存在差异。

2.3.1 灭屏前处理流程(通用)

两种关机类型的灭屏前逻辑一致,主要完成业务收尾、资源释放,流程如下:

fishy

2.3.2 灭屏后 pm_shutdown 过程(分类型)

  1. Hibernate 关机过程 流程较简洁,无需大小核交互,直接进入低功耗关机状态,如下:

fishy
  1. Standby 关机过程 涉及大核(HCPU)与小核(LCPU)的交互,需同步核心状态后进入低功耗,流程如下:

fishy