引言

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通用的跳转方式。

2) 芯片启动是从中断向量表的复位中断处理程序开始,接着把数据从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函数调用必须在这些初始化完成后才可以。

3) 从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中的位置

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

图5-3 SYS_RUN的展开关系

总结

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

OpenHarmony轻量设备Hi3861芯片开发板启动流程分析的更多相关文章

  1. LS1021ATWR开发板启动日志分析

    一.背景 LS1021ATWR开发板运行官方的openwrt系统 二.日志分析 2.1 linux相关日志 root@OpenWrt:/# reboot  重启 root@OpenWrt:/# [ 2 ...

  2. u-boot启动流程分析(2)_板级(board)部分

    转自:http://www.wowotech.net/u-boot/boot_flow_2.html 目录: 1. 前言 2. Generic Board 3. _main 4. global dat ...

  3. DevEco Device Tool 2.1 Beta1在Hi3861开发板上可视化分析的体验

    DevEco Device Tool迎来了2.1 Beta1,新版本有很多亮点.在上次"DevEco Device Tool 2.1 Beta1 的Hi3861在Windows平台的编译体验 ...

  4. 织女星开发板启动模式修改——从ARM M4核启动

    前言 刚开始玩织女星开发板的时候,想先从熟悉的ARM核入手,连上Jlink,打开MDK版本的Demo程序,编译OK,却检测不到芯片,仔细看了一下文档,原来RV32M1芯片默认从RISC-V核启动,如果 ...

  5. qemu 模拟-arm-mini2440开发板-启动u-boot,kernel和nfs文件系统

    qemu 本文介绍了如何编译u-boot.linux kernel,然后用qemu启动u-boot和linux kernel,达到与开发板上一样的学习效果! 虽然已经买了2440开发板,但是在实际学习 ...

  6. qemu 模拟-arm-mini2440开发板-启动u-boot,kernel和nfs文件系统【转】

    转自:http://www.cnblogs.com/riskyer/p/3366001.html qemu 本文介绍了如何编译u-boot.linux kernel,然后用qemu启动u-boot和l ...

  7. 开发板启动时,内核打印出"can't access tty,job control turned off"

    启动后的最后一行提示can't access tty,job control turned off, 这说明没有进入到控制台,原因就在于文件系统的/etc/inittab 这个文件里有问题 vi /e ...

  8. 迅为iMX6Q/PLUS开发板烧写设备树内核 Qt 系统

    迅为iMX6Q 和 iMX6PLUS 两个硬件版本,设备树镜像的烧写方法以及镜像所在目录,镜像名称全部一致. 如果用的是 iMX6Q 版本,想要烧写设备树版本镜像,请使用 iMX6Q 设备树版本的光盘 ...

  9. 迅为4412开发板Linux设备树的镜像烧写和源码简单优化教程

    1 烧写:   烧写和4412默认镜像的烧写类似,使用fastboot. 先更新uboot,用4412默认uboot更新支持设备树的uboot 用支持设备树的uboot烧写. 进入支持设备树的uboo ...

  10. iMX6Q/PLUS开发板烧写设备树内核的Ubuntu系统

    基于迅为-iMX6D.iMX6Q 和 iMX6PLUS 三个硬件版本,设备树镜像的烧写方法以及镜像所在目录,镜像名称全部一致,所以作者将烧写章节合并到一起. 请注意,如果购买的是 iMX6D 版本,想 ...

随机推荐

  1. linux7/8版本的docker-ce安装(2022/5/27亲测可行)

    centos7 # 先配阿里源 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup curl - ...

  2. 项目打包setup.py(setuptools)

    参考 https://www.cnblogs.com/dan-baishucaizi/p/13564333.html https://www.cnblogs.com/dan-baishucaizi/p ...

  3. 【LeetCode贪心#06】加油站(股票买卖变种)

    加油站 力扣题目链接(opens new window) 在一条环路上有 N 个加油站,其中第 i 个加油站有汽油 gas[i] 升. 你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i+1 ...

  4. jquery实现轮播图切换

    这个是我模仿网易云的音乐界面写的轮播图,主要实现的功能有 1.每隔4秒图片和对应的背景颜色一起切换 2.点击翻页会跳转到相对应的图片以及背景上 3.点击左右翻页,实现顺序切换 <1>HTM ...

  5. DataGear 使用静态HTML模板制作数据可视化看板

    DataGear 看板提供了导入静态 HTML 模板的功能,使您可以利用已有的任意 HTML 网页资源快速制作数据可视化看板. 首先,您需要准备一套已设置好布局的静态 HTML 模板,其中包含的 HT ...

  6. 使用 RKE 方式搭建 K8s 集群并部署 NebulaGraph

    本文由社区用户 Albert 贡献,首发于 NebulaGraph 论坛,旨在提供多一种的部署方式使用 NebulaGraph. 在本文,我将会详细地记录下我用 K8s 部署分布式图数据库 Nebul ...

  7. redis 安装的参考文章

    redis 安装  :  https://www.runoob.com/redis/redis-install.html

  8. Java 包装类的使用(自动装箱+自动拆箱)+Vector

    1 package com.bytezreo.ut; 2 3 import java.util.Scanner; 4 import java.util.Vector; 5 6 /** 7 * 8 * ...

  9. TR069-STUN

    原理 1.NAT穿越技术,为了解决NAT设备对P2P网络的通信限制   2.作用:检测网络中是否存在NAT设备,并获取两个通信端点经NAT设备分配的IP地址和端口号,然后建立一条可穿越NAT的P2P链 ...

  10. vscode 花括号 突出连接线 bracket 两个设置点 (括号标识符)

    vscode 花括号 突出连接线 bracket 两个设置点 外观 设置 设置里面搜索 bracket Editor - Guides: Highlight Active Bracket Pair E ...