OpenHarmony之系统启动流程

本文详细介绍了OpenHarmony在STM32F407ZGT6上的启动过程,从单片机上电执行汇编文件开始,到初始化各个模块,最终启动内核并运行上层应用。

前段时间将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上就启动起来了。

过程比较简单,可以找一份源码,参照源码梳理启动流程。

OpenHarmony 系统中实现应用或服务的开机自启动功能,通常可以通过以下几种方式来完成: ### 1. 使用系统服务配置文件 OpenHarmony 基于 Linux 内核,支持通过系统服务管理工具(如 `init` 或 `systemd`)来实现开机自启动。对于基于 `init` 的系统,可以在 `/system/etc/init/` 目录下创建一个 `.rc` 文件,用于定义服务的启动行为。例如,创建一个名为 `my_service.rc` 的文件,并添加如下内容: ```rc service my_service /system/bin/my_application class main user root group root oneshot ``` 此配置会在系统启动时以 root 权限运行 `/system/bin/my_application` 应用程序。需要注意的是,路径和权限应根据实际需求进行调整 [^1]。 ### 2. 在系统启动脚本中添加命令 如果不想通过服务管理工具,也可以直接在系统启动脚本中添加启动命令。例如,在 `/system/etc/init/boot.rc` 文件中添加如下内容: ```rc exec /system/bin/my_application ``` 这样,在系统启动过程中会自动执行指定的应用程序 [^1]。 ### 3. 使用系统应用配置 对于基于应用层的自启动需求,可以通过在应用的 `config.json` 文件中配置 `background` 模块,指定应用在后台运行。虽然这种方式主要用于应用的后台运行,但在某些场景下也可以实现开机自启动的效果。例如: ```json { "module": { "background": { "mode": "foreground" } } } ``` 此外,还可以通过系统设置中的“自启动管理”功能,手动启用特定应用的开机自启动权限。不过,这种方法可能因设备厂商的不同而有所差异。 ### 4. 修改系统启动参数 在某些情况下,可以通过修改系统启动参数来实现开机自启动功能。例如,在设备的 U-Boot 配置中添加启动命令,或者在内核启动参数中指定特定的服务启动选项。这种方法较为复杂,适用于对系统底层有深入了解的开发者。 ### 5. 使用定时任务工具 虽然 OpenHarmony 主要用于嵌入式设备,但在某些版本中仍然支持 `cron` 工具。可以通过配置 `cron` 任务,在系统启动后自动运行指定的应用或服务。例如,编辑 `/system/etc/crontab` 文件,添加如下内容: ```cron @reboot root /system/bin/my_application ``` 这样,每次系统重启时都会以 root 权限运行 `/system/bin/my_application` 应用程序 [^1]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

叶与花语

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值