OpenHarmony轻量设备Hi3861芯片开发板启动流程分析

server/2024/10/18 8:34:33/

引言

OpenHarmony作为一款万物互联的操作系统,覆盖了从嵌入式实时物联网操作系统到移动操作系统的全覆盖,其中内核包括LiteOS-M,LiteOS-A和Linux。LiteOS-M内核是面向IoT领域构建的轻量级物联网操作系统内核,主要面向没有MMU的处理器,架构如图1-1所示。

图1-1 LiteOS-M架构图

Hi3861是一款高度集成的2.4GHz SoC WiFi芯片,采用高性能 32bit 微处理器,最大工作频率 160MHz,内嵌 SRAM 352KB、ROM 288KB、Flash 2MB。目前市面上的采用LiteOS-M的OpenHarmony开发板厂商有深开鸿、润和软件、小熊派,因为海思的SDK是以库文件的形式提供的,所以不同的Hi3861芯片开发板启动流程是一样的。

Hi3861 Boot介绍

Boot是操作系统启动之前的软件,通用叫法是bootloader,Hi3861的boot分为4部分:RomBoot、FlashBoot、LoaderBoot、 CommonBoot,如图2-1所示。

图2-1 Hi3861 Boot启动流程

● RomBoot功能包括:加载LoaderBoot到RAM,进一步利用LoaderBoot下载镜像到Flash、烧写 EFUSE, 校验并引导FlashBoot。FlashBoot分为AB面,A面校验成功直接启动,校验失败会去校验B面,B面校验成功会修复A面再引导启动,否则复位重启。

● FlashBoot功能包括:升级固件,校验并引导固件。

● LoaderBoot功能包括:下载镜像到Flash, 烧写EFUSE(例如:安全启动/Flash加密相关密钥等)。

● CommonBoot为Flashboot与LoaderBoot共用的功能模块。

相关文件介绍

Hi3861的LiteOS-M代码是SDK中以库文件的形式提供的,虽然我们无法看到源代码,但这不代表我们分析不了启动流程,我们可以从分析map文件和asm这两个文件入手。这两个文件都是编译链接工具生成的,其中asm文件是汇编程序源文件,可以查看函数之间的调用关系,map文件里包括全局符号、函数地址及占用的空间和位置。map和asm文件主要作用是当开发板崩溃时用于分析其崩溃的原因,我们分析函数跳转关系时并不需要知道太多汇编,只需要知道基本的跳转语句和赋值语句即可,这两个文件位于out目录下和操作系统固件平级的目录,如图3-1。

图3-1 Hi3861 asm和map文件位置图

一个编译完成的固件通常有以下几部分:

  1. RO段包括只读代码段(code段/.text段)和常量段(RO Data段/.constdata段)。

  2. RW段(.data段)指已被初始化成非0值的变量段。

  3. ZI段(.bss段)指未被初始化或初始化为0的变量段。

我们源代码的函数和字符串常量都位于text段。

LiteOS-M启动流程介绍

  1. 嵌入式处理器和操作系统都具有类似的结构启动流程也大体相似,从芯片上电开始Boot把控制权交给操作系统,Hi3861从Boot跳转到操作系统代码如下:

这部分是将该地址当函数作为跳转,因为FlashBoot和kernel,是两套代码程序,他们之间没有依赖引用关系,但是他们在一个地址空间,所以直接地址跳转,这也是从Boot到kernel通用的跳转方式。

  1. 芯片启动是从中断向量表的复位中断处理程序开始,接着把数据从Flash复制到RAM、清空bss数据段、初始化时钟、跳转到main函数。我们通过查看asm文件的main函数,可以看出其中调用的函数如图4-1所示,从图4-1 我们可得知调用的函数包括设置串口、校验版本号、配置板子、Kernel初始化、应用初始化和操作系统的调度运转,其中main函数位于liblitekernel_flash.a(main.o)文件中。

图4-1 main函数调用关系

LOS_KernelInit是负责初始化内核数据结构的,如图4-2所示,主要函数有OsMemSystemInit(内存初始化)、OsHwiInit(中断初始化)、OsTaskInit(任务初始化) ,这些过程主要目的是把内核相关的变量初始化,准备好全局信息,方便API函数去调用,API函数调用必须在这些初始化完成后才可以。

  1. 从AppInit开始脱离了sdk,可以看到源代码了,AppInit函数位于libwifiiot_app.a(app_main.o)中,部分截图如图4-3,源代码为app_main.c,其中调用的函数包括获取sdk版本号,外设初始化,ipc初始化,flash分区,WiFi初始化,tcp/ip初始化,然后跳转到了OpenHarmony特有的函数OHOS_Main。

OHOS_Main位于libwifiiot_app.a(ohos_main.o)中,源代码为ohos_main.c,主要完成OpenHarmony系统相关和用户应用相关的调用,里边主要函数是OHOS_SystemInit,如图4-4,在其中调用了用户自己写的应用任务相关代码,如图4-5,从而实现了在LOS_start之前把任务列表填好,这样才能保证用户任务或定时等功能参与了系统调度。

图4-2 LOS_KernelInit函数调用关系

图4-3 app_main函数调用关系

图4-4 OHOS_Main函数调用关系

图4-5 OHOS_SystemInit函数调用关系

用户应用的启动原理

  1. 在图4-5中出现的函数MODULE_INIT(run),就是调用最终调用用户程序的代码。

这是个宏定义,展开的调用关系 :\base\startup\bootstrap_lite\services\source\core_main.h定义,从MODULE_CALL、MODULE_BEGIN 、MODULE_END,最终调用的地址是__zinitcall_##name##_start,MODULE_INIT(run)调用的函数地址是__zinitcall_run_start。

通过查看链接文件得出__zinitcall_run_start包含.zinitcall.run0.init),如图5-1所示。

图5-1 __zinitcall_run_start链接关系

查看map文件发现我们自己的应用程序文件就在.zinitcall.run2.init中,如图5-2所示。

图5-2 led_exapmle文件在map中的位置

  1. 从运行角度看启动中调用到了应用程序led_exapmle,所谓位置为.zinitcall.run2.init,但我们在应用程序中的关联函数是SYS_RUN(LedExampleEntry),SYS_RUN的展开关系如图5-3所示,最终即是 zinitcall.run2.init,和程序运行时候的调用匹配在一起了。应用程序的调用关系就是编译链接阶段生成指定的段,初始化时调用指定段,这样实现了LiteOS-M的操作系统代码与应用程序代码的解耦。

总结

本文向大家讲述了在没有部分源代码的情况下,如何通过对map文件和asm文件的分析从而得出Hi3861芯片开发板LiteOS-M的启动流程。总体过程就是最小硬件系统的配置完成后,LOS_KernelInit负责初始化系统到一个合适的状态,AppInit调用OpenHarmony和应用相关代码,最后LOS_Start负责把操作系统运转起来。

经常有很多小伙伴抱怨说:不知道学习鸿蒙开发哪些技术?不知道需要重点掌握哪些鸿蒙应用开发知识点?

为了能够帮助到大家能够有规划的学习,这里特别整理了一套纯血版鸿蒙(HarmonyOS Next)全栈开发技术的学习路线,包含了鸿蒙开发必掌握的核心知识要点,内容有(ArkTS、ArkUI开发组件、Stage模型、多端部署、分布式应用开发、WebGL、元服务、OpenHarmony多媒体技术、Napi组件、OpenHarmony内核、OpenHarmony驱动开发、系统定制移植等等)鸿蒙(HarmonyOS NEXT)技术知识点。

在这里插入图片描述

《鸿蒙 (Harmony OS)开发学习手册》(共计892页):https://gitcode.com/HarmonyOS_MN

如何快速入门?

1.基本概念
2.构建第一个ArkTS应用
3.……

开发基础知识:

1.应用基础知识
2.配置文件
3.应用数据管理
4.应用安全管理
5.应用隐私保护
6.三方应用调用管控机制
7.资源分类与访问
8.学习ArkTS语言
9.……

在这里插入图片描述

基于ArkTS 开发

1.Ability开发
2.UI开发
3.公共事件与通知
4.窗口管理
5.媒体
6.安全
7.网络与链接
8.电话服务
9.数据管理
10.后台任务(Background Task)管理
11.设备管理
12.设备使用信息统计
13.DFX
14.国际化开发
15.折叠屏系列
16.……

在这里插入图片描述

鸿蒙开发面试真题(含参考答案):https://gitcode.com/HarmonyOS_MN

在这里插入图片描述

OpenHarmony 开发环境搭建

图片

《OpenHarmony源码解析》:https://gitcode.com/HarmonyOS_MN

  • 搭建开发环境
  • Windows 开发环境的搭建
  • Ubuntu 开发环境搭建
  • Linux 与 Windows 之间的文件共享
  • ……
  • 系统架构分析
  • 构建子系统
  • 启动流程
  • 子系统
  • 分布式任务调度子系统
  • 分布式通信子系统
  • 驱动子系统
  • ……

图片

OpenHarmony 设备开发学习手册:https://gitcode.com/HarmonyOS_MN

图片
在这里插入图片描述


http://www.ppmy.cn/server/109689.html

相关文章

大麦演唱会门票

切勿再令您所爱的人耗费高昂的价格去购置黄牛票 ⚠️核心内容参考: 据悉,于购票环节,大麦凭借恶意流量清洗技术,于网络层实时甄别并阻拦凭借自动化手段发起下单请求的流量,强化对刷票脚本、刷票软件以及虚拟设备的识别能力&#…

使用 nuxi build-module 命令构建 Nuxt 模块

title: 使用 nuxi build-module 命令构建 Nuxt 模块 date: 2024/8/31 updated: 2024/8/31 author: cmdragon excerpt: nuxi build-module 命令是构建 Nuxt 模块的核心工具,它将你的模块打包成适合生产环境的格式。通过使用 --stub 选项,你可以在开发过程中加快模块构建速度…

在element-plus的Dialog组件中使用el-loading效果

最近遇到一个需求&#xff0c;在页面中有个组件&#xff0c;子组件由el-dialog包裹&#xff0c;希望展示隐藏el-dialog时有加载动画&#xff0c;加载动画用的是v-loading。 //父组件 <template><tabs v-model"tabsVisible"/> </template> <scr…

获取服务器时间

由于客户端时间和服务器端时间不一致&#xff0c;需要将一个项目产品统一改成获取服务器时间&#xff0c;于是写了个全局方法来替换new Date() 1.创建一个getSystemTime文件注册为全局事件&#xff0c; let nowTime let flag true let IntervalAdd null function getSys…

这个项目所需的配置文件和依赖

这是用于记录这个项目的依赖,中间出现了很多版本问题,这是最后解决出来的版本 配置文件 spring:datasource:url: jdbc:mysql://localhost:3306/vueadmin?useUnicodetrue&characterEncodingutf-8&serverTimezoneUTCusername: rootpassword: Qq702196driver-c…

Nginx轮询负载均衡配置指南:实现高效请求分发

在现代的Web应用架构中&#xff0c;负载均衡是确保应用高可用性和扩展性的关键技术之一。Nginx是一款高性能的HTTP服务器和反向代理&#xff0c;它提供了多种负载均衡策略来满足不同的业务需求。其中&#xff0c;轮询&#xff08;round-robin&#xff09;是最简单也是最常用的负…

【软件测试专栏】认识软件测试、测试与开发的区别

博客主页&#xff1a;Duck Bro 博客主页系列专栏&#xff1a;软件测试专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ 认识软件测试、测试与开发的区别 关键词&#xff1a;软件测试、测…

断链保护器在矿山机械中的安全守护与效能提升应用探析

在严峻复杂的矿山作业环境下&#xff0c;断链保护器作为一项不可或缺的安全技术装备&#xff0c;扮演着守护生命财产安全、维护生产秩序的关键角色&#xff0c;特别是在确保矿山机械稳定高效运行方面&#xff0c;其价值和意义显得尤为重要。 一、强化安全基石&#xff0c;守护矿…