还没吃饭中志愿者 · 2023年11月28日 · 河南

【XR806开发板试用】+3.实战OpenHarmony固件编译

接上两篇:

【XR806开发板试用】+1.嵌入式

【XR806开发板试用】+2.鸿蒙内核
image.png
固件编译是一种将源代码转化为可执行文件的过程,其中涉及了多个环节和工具的使用。在这次的学习过程中,我主要了解了设置编译工具链、对代码工程进行配置、关键步骤说明等方面的内容,下面我将结合自己的学习经历和感受,谈谈自己的心得体会。

在深入了解XR806和OpenHarmony的过程中,我领略到了轻量级系统在嵌入式解决方案中的独特地位和潜力。OpenHarmony作为一种通用的轻量级系统,尤其适用于MCU类处理器,如Arm Cortex-M和RISC-V 32位设备。在硬件资源极其有限的情况下,它提供了丰富的功能和工具,如多种轻量级网络协议、轻量级的图形框架,以及丰富的IOT总线读写部件等。这样的系统非常适合于智能家居领域的连接类模组、传感器设备、穿戴类设备等产品的开发。
image.png
XR806_OpenHarmony代码的构成部分包括device和vendor两部分。其中,device目录主要包含芯片层驱动,负责承接Harmony系统和芯片驱动库。这部分代码结构清晰,包括适配器、编译脚本、指导文档、动态配置编译环境的脚本、编译工具、例程以及rtos接口层等。而vendor目录则主要包含方案设置,其中,Harmony的主要特点之一是组件的插拔,这是通过vendor/config.json对方案进行裁剪实现的。

获取源码的过程也给我留下了深刻的印象。除了安装码云repo工具,还可以使用pip3安装requests库,并设置镜像源以加快下载速度。这些步骤都展示了在开源社区中获取和使用资源的便捷性。

Device目录主要包括芯片层驱动,负责承接Harmony系统和芯片驱动库。其结构如下:

  • adapter: Harmony接口适配
  • BUILD.gn: gn编译脚本
  • build.sh: 编译脚本,用于搭桥Harmony与原生SDK
  • doc: 指导文档
  • libcopy.py: 编译脚本,用于动态配置编译环境
  • liteos_m: 编译工具,编译选项设置
  • ohosdemo: 例程
  • os: rtos接口层,通过接口层方便后续移植其他rtos
  • target_config.h: liteos系统裁剪
  • xr_skylark: 芯片原生驱动

Vendor目录主要为方案设置,Harmony主要特点之一为组件的插拔,通过vendor/config.json对方案进行裁剪。其结构如下:

  • BUILD.gn: 编译脚本
  • config.json: 方案裁剪
  • hals: 系统信息

获取源码:
安装码云repo工具,可以执行如下命令:

curl -s https://gitee.com/oschina/repo/raw/fork_flow/repo-py3 > /usr/local/bin/repo 
#如果没有权限,可下载至其他目录,并将其配置到环境变量中
chmod a+x /usr/local/bin/repo
pip3 install -i https://repo.huaweicloud.com/repository/pypi/simple requests

设置镜像源(可选):

vim ~/.bashrc
#在文件的最后输入以下内容
export PATH=~/bin:$PATH
export REPO_URL=https://mirrors.tuna.tsinghua.edu.cn/git/git-repo/
#设置完成后重启shell
#设置为清华镜像源后,下载源码时如果提示server certificate verification failed,输入export GIT_SSL_NO_VERIFY=1后重新下载即可。

下载源码:

# OpenHarmony通用于各种系统,导致整个系统文件比较多,XR806把部分不必要的代码仓在xml中删除了。
# 如果想要减少或增加需要下载的代码仓,请把manifest仓fork到本地后,自行裁剪。
repo init -u https://gitee.com/awol/open-harmony_-xr806_manifest.git -b master --no-repo-verify -m devboard_xr806.xml 
repo sync -c 
repo forall -c 'git lfs pull' 

首先,设置编译工具链是进行固件编译的前提条件。在XR806_SDK中,推荐使用gcc-arm-none-eabi-10-2020-q4-major进行编译。为了方便后续的操作,我们需要将编译工具链下载并保存到“~/tools”目录下。如果该目录不存在,我们还需要先创建它。这个环节让我明白了在编译之前,一定要先确保编译工具链的正确安装和配置。

使用文本格式来模拟鱼骨图的结构。

XR806支持的OpenHarmony系统

├── 轻量系统(Mini System)
│ ├── 硬件资源有限
│ ├── 支持最小内存:128KiB
│ ├── 提供轻量级网络协议
│ ├── 提供轻量级图形框架
│ ├── 提供丰富的IOT总线读写部件
│ └── 可用于智能家居领域的连接类模组、传感器设备、穿戴类设备等
├── XR806_OpenHarmony代码
│ ├── device目录:芯片层驱动,承接Harmony系统和芯片驱动库
│ │ ├── adapter:Harmony接口适配
│ │ ├── BUILD.gn:gn编译脚本
│ │ ├── build.sh:编译脚本,用于搭桥Harmony与原生SDK
│ │ ├── doc:指导文档
│ │ ├── libcopy.py:编译脚本,用于动态配置编译环境
│ │ ├── liteos_m:编译工具,编译选项设置
│ │ ├── ohosdemo:例程
│ │ ├── os:rtos接口层,方便后续移植其他rtos
│ │ ├── target_config.h:liteos系统裁剪
│ │ └── xr_skylark:芯片原生驱动
│ └── vendor目录:方案设置,通过vendor/config.json对方案进行裁剪
└── 其他操作:获取源码、固件编译等步骤

其次,OpenHarmony的编译分为两部分,一部分是编译OpenHarmony的系统库,另一部分是芯片驱动的编译,也叫原生库。这两部分分别使用gn脚本和makefile脚本进行编译。在配置代码工程时,我们需要进入原生SDK目录,并复制配置文件。然后通过图形化界面配置生成静态库和全局头文件。这个过程需要仔细认真,避免出现错误导致编译失败。
image.png
最后,关键步骤说明中涉及了一些命令和操作,这些步骤需要按照一定的顺序进行,否则可能会遇到问题。比如在执行make menuconfig命令后,我们需要获取目录下的.config文件并生成图形化配置界面;在hb set命令后,我们需要选择指定的工程并确认;在hb build -f命令后,如果出现了异常提示,可能是因为旧的flash分配方案不再使用,我们需要自动生成文件image_auto_cal.cfg并覆盖image_wlan_ble.cfg或者image.cfg。这些步骤需要我们认真按照说明进行操作,才能确保固件编译的顺利进行。

对固件编译的过程进行详细的讲解,主要包括以下步骤:

  1. 设置编译工具链:首先需要下载适合编译的gcc编译器,并且推荐使用gcc-arm-none-eabi-10-2020-q4-major版本。下载完成后保存在“~/tools”目录下。
  2. 编译OpenHarmony的系统库:OpenHarmony的编译分为两部分,一部分是编译OpenHarmony的系统库,这个过程使用gn脚本进行。在OpenHarmony的编译工具配置文件(device/xradio/xr806/liteos_m/config.gni)中设置编译器前缀(board_toolchain_prefix)和编译器类型(board_toolchain_type)。
  3. 编译芯片驱动的原生库:另一部分是芯片驱动的编译,也叫原生库,这个过程使用makefile脚本进行。原生库的编译工具在device/xradio/xr806/xr_skylark/gcc.mk设置。
  4. 对代码工程进行配置:首次编译工程,需要对原生库进行配置,否则无法编译通过。配置步骤包括进入原生SDK目录,复制配置文件,通过图形化界面配置,清除旧配置,根据配置生成静态库和全局头文件。
  5. 选择工程并编译:选择指定的工程进行编译。常见的编译命令包括hb set用于选择工程,hb build -f用于编译。

在编译过程中可能会遇到一些异常情况,例如旧的flash分配方案不再使用。此时需要在自动生成的image_auto_cal.cfg文件中覆盖image_wlan_ble.cfg或者image.cfg的内容。

通过这次学习,我深刻认识到了固件编译的复杂性和细节性。在编译过程中,不仅需要选择合适的编译器和编译选项,还需要根据项目需求进行正确的配置和调试。此外,对于出现的问题需要及时进行处理和解决,否则可能会影响整个编译过程的顺利进行。因此,在进行固件编译时,我们需要有充分的准备和耐心,并不断学习和积累经验。

总之,这次学习让我对固件编译有了更深入的了解和认识。通过设置编译工具链、对代码工程进行配置、关键步骤说明等方面的学习,我不仅掌握了固件编译的基本流程和方法,还学会了如何处理和解决编译过程中可能出现的问题。这些知识将对我今后的学习和工作产生积极的影响。

希望这些经验能对您有所帮助!

本人在本论坛内的试读[经验] :

《嵌入式Linux系统原理与应用》读后感第八章-设备驱动程序设计

本人在本论坛内的帖子:

GD32F427开发板试用+唱歌跳舞主控5加非接触式换歌功能

谢谢!

推荐阅读
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息