开关机过程
开机流程
Solution开机过程是指从上电/复位到主界面出现的过程。
产生开机的原因包括:
重新上电;
看门狗复位重启;
软件调用drv_reboot重启;
关机后,长按开机重启;
硬复位重启;
闹钟唤醒开机;
连接充电后开机;
获取开机原因的方式
开机后,可以通过Log来获取开机原因:

PowerOnMode 含义如下:
/** 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;
常见的启动类型是:
PM_COLD_BOOT 0
冷启动,包括重新上电、硬复位重启;PM_STANDBY_BOOT 1
standby关机后启动,56x 关机后,长按开机重启;PM_HIBERNATE_BOOT 2
hibernate关机后启动,52x/55x/58x 关机后,长按开机重启;PM_REBOOT_BOOT 4
软件复位,包括:看门狗复位重启、软件调用drv_reboot重启;
开机流程简述
上电,或重启后,依次进入一级boot、二级boot、OTA manager、user_bin,流程图如下:

一级bootloader和二级bootloader作用于在于芯片核心电路初始化和psram,flash,以及代码搬移的工作;
OTA manager 的作用针对norflash升级管理使用;
user_bin 启动流程
Userbin从startup到主界面出现,经历了以下过程:

其中, component init 和 app_power_on_action() 比较关键。 component init ()的功能用于注册为以下类型的初始化组件的逐个初始化过程,位于components.c中;
#define INIT_PREV_EXPORT(fn) INIT_EXPORT(fn, "2", "5")
/* device initialization */
#define INIT_DEVICE_EXPORT(fn) INIT_EXPORT(fn, "3", "5")
/* components initialization (dfs, lwip, ...) */
#define INIT_COMPONENT_EXPORT(fn) INIT_EXPORT(fn, "4", "5")
/* environment initialization (mount disk, ...) */
#define INIT_ENV_EXPORT(fn) INIT_EXPORT(fn, "5", "5")
/* pre appliation initialization (rtgui application etc ...) */
#define INIT_PRE_APP_EXPORT(fn) INIT_EXPORT(fn, "6", "5")
/* appliation initialization (rtgui application etc ...) */
#define INIT_APP_EXPORT(fn) INIT_EXPORT(fn, "7", "5")
component init ()执行在线程main中,线程优先级为6,远高于其他线程,component init ()期间创建的线程都得不到执行的机会,直到component init ()全部执行完毕。
component init ()执行完毕后,由于"gui_thread"为10,为优先级最高线程,且"gui_thread"执行后立刻创建了阻塞线程,避免优先级低于"gui_thread"的线程执行,直到阻塞线程被删除,"gui_thread"降低到19;整个过程体现在app_power_on_action()中。 app_power_on_action()执行时的线程调度如下:

从图形中看出,整个过程大致分为动画前,播放动画,动画后等三个阶段;
但有一个地方要注意: lcpu_power_on()调用的bt_rf_cal()执行期间,其他线程会得不到执行。
52x和56x的lcpu_power_on()的执行位置有所区别:

关机流程
Solution关机过程是指调用app_power_off_action后,到关机完成的过程。
产生关机过程的原因包括:
低电关机;
长按正常触发关机界面关机;
通过UI触发关机界面关机;
恢复出厂设置;
关机类型
关机类型有两种:Hibernate 关机和Standby关机。
目前,除了56x支持Standby关机,一般都是Hibernate 关机。
通过menuconfig配置关机类型,如下图:

选中表示使用Standby关机,不选中则表示Hibernate关机;
关机过程
关机过程大致分为两个过程:灭屏前处理流程和灭屏后pm_shutdown过程。 对于Hibernate 关机和Standby关机而言,灭屏前处理流程基本相同,大致过程如下:

pm_shutdown()的过程根据关机类型有所区分。 Hibernate 关机过程简单些,如下图:

Standby 关机过程则涉及到大小核的交互,如下图:
