应用程序启动流程
本文将会介绍 w800 从上电到运行 main
函数中间所经历的步骤(即启动流程)。
在宏观上,该启动流程可以分为如下 3 个步骤:
一级引导程序被固化在在了内部的 ROM 中,当 CPU 上电后从地址
0x0
开始执行 ROM 中的固化程序,加载 Bootloader 引导程序。Bootloader 引导程序就是在操作系统运行之前运行的一小段程序。通过这一小段程序,可以初始化硬件设备,从而 将系统的软硬件环境带到一个合适的状态,为最终调用操作系统做好并从 QFlash 中加载分区表,并且决定启动的应用程序位置。
应用程序(app)运行阶段,会从文件中获取应用程序运行所需要的相关配置,如内存起始地址,内存布局等。
下面会对上述过程进行更为详细的阐述。
一级引导程序
上电后,CPU 会启动执行 ROM 中的固化程序,包括 QFLASH 自检,QFLASH 模式切换,应用程序校验,向量表重定向和 OTA 。
详细 ROM 请参考 ROM 功能 。
Bootloader 引导程序
它主要完成:QFlash 工作模式切换,应用程序完整性校验,OTA,代码解密设置,跳转到用户的应用程序去运行。
详细 Bootloader 请参考 Bootloader 功能 。
应用程序(app)运行
以 W800 为例在应用程序运行阶段,它会从 components/wm_soc/w800/ld 里的
chip_layout.ld.h
获取应用程序的入口函数。
从 components/wm_soc/w800/src 里的 memory_layout.c
获取
应用程序的内存布局。
然后经过一系统初始化后运行 main
函数,交由用户按实际需要自己编写。
组件(components)自动初始化
除了在 mian
函数之前手动初始化组件,我们还提供组件自动初始化的方法。
每个需要执行初始化的组件,需要使用 WM_COMPONEN_INIT_*(component_init_function) 修饰其组件初始化函数,系统在 启动后自动调用组件初始化函数进行组件初始化。
其中 * 取值为: 1 、 2 、 3 、 4 ,即:
WM_COMPONEN_INIT_1(component_init_function)
WM_COMPONEN_INIT_2(component_init_function)
WM_COMPONEN_INIT_3(component_init_function)
WM_COMPONEN_INIT_4(component_init_function)
这4种修饰的组件初始化函数执行的顺序是不同的,其执行顺序为:
一般而言, 基础系统组件使用 WM_COMPONEN_INIT_1 ,普通系统组件使 用WM_COMPONEN_INIT_2, 应用组件使用 WM_COMPONEN_INIT_3 ,用户组件使用 WM_COMPONEN_INIT_4 。
举例:cli应用组件初始化函数为 wm_component_cli_init ,则添加
修饰 WM_COMPONEN_INIT_3(wm_component_cli_init) 。