前段时间将openharmony一直到STM32F407ZGT6上,使用的是轻量型系统,内核为liteos-M,这里对启动过程做个简单记录,首先看一下openharmony的简要架构图
- 上电从汇编文件开始执行
当我们按下 STM32 的单片机后,第一时间,单片机执行的不是我们写的 C 语言代码,而是一段汇编代码,我们一般叫他启动文件,我们上一节工程的代码启动文件是 startup_stm32f407xx.s文件。单片机上电首先执行的就是这个汇编文件,可能你会有疑问为什么单片机上电先执行这段汇编,其他汇编文件不行嘛?这个是因为单片机上电后,执行的程序地址是固定的,由单片机的 PC 指针决定,而PC指针刚上的是由硬件复位,指向了固定地址,而工程文件中有一个链接文件,将汇编文件中的 Reset_Handler 函数放在了 PC 第一个执行地址,所以单片机上电后硬件初始化完 PC 和 SP 后,就会执行 Reset_Handler 了,Reset_Handler 再启动文件的位置如下:
他设置的 SP 堆栈指针的值,然后将数据段的起始地址传给 R0-2 寄存器,用于传参数给下一个调用函数,也就是 LoopCopyDataInit 函数,用来拷贝具有非 0 初始化值的变量到 SRAM,因为代码中的变量一开始全在 Flash 中,我们需要拷贝到 SRAM 运行,之后再清除未初始化数据段(.bss),初始化完成后,调用 SystemInit 来初始化单片机的 FPU 和时钟:
初始化完成后调用 __libc_init_array 来初始化 lib 库,初始化完成后就会跳转到 main 函数了。 - 内核启动
进入main函数之后会首先调用LOS_KernelInit()来启动内核,如下图所示:
当内核启动成功后,会调用OHOS_SystemInit启动OpenHarmony的各个子系统,OHOS_SystemInit函数如图所示:
拉起所有需要的子系统之后,启动系统调度LOS_Start(); - 启动应用
之后就可以新建任务并运行上层应用了,至此OpenHarmony在STM32F407ZGT6上就启动起来了。
过程比较简单,可以找一份源码,参照源码梳理启动流程。