开关机过程

开机流程

Solution开机过程是指从上电/复位到主界面出现的过程。

产生开机的原因包括:

  • 重新上电;

  • 看门狗复位重启;

  • 软件调用drv_reboot重启;

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

  • 硬复位重启;

  • 闹钟唤醒开机;

  • 连接充电后开机;

获取开机原因的方式

开机后,可以通过Log来获取开机原因:

fishy

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,流程图如下:

fishy

一级bootloader和二级bootloader作用于在于芯片核心电路初始化和psram,flash,以及代码搬移的工作;

OTA manager 的作用针对norflash升级管理使用;

user_bin 启动流程

Userbin从startup到主界面出现,经历了以下过程:

fishy

其中, 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()执行时的线程调度如下:

fishy

从图形中看出,整个过程大致分为动画前,播放动画,动画后等三个阶段;

但有一个地方要注意: lcpu_power_on()调用的bt_rf_cal()执行期间,其他线程会得不到执行。

52x和56x的lcpu_power_on()的执行位置有所区别:

fishy

关机流程

Solution关机过程是指调用app_power_off_action后,到关机完成的过程。

产生关机过程的原因包括:

  • 低电关机;

  • 长按正常触发关机界面关机;

  • 通过UI触发关机界面关机;

  • 恢复出厂设置;

关机类型

关机类型有两种:Hibernate 关机和Standby关机。

目前,除了56x支持Standby关机,一般都是Hibernate 关机。

通过menuconfig配置关机类型,如下图:

fishy

选中表示使用Standby关机,不选中则表示Hibernate关机;

关机过程

关机过程大致分为两个过程:灭屏前处理流程和灭屏后pm_shutdown过程。 对于Hibernate 关机和Standby关机而言,灭屏前处理流程基本相同,大致过程如下:

fishy

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

fishy

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

fishy