移植OpenHarmony 3.0到ARM单片机

2023-11-07

9月30日,OpenHarmony 3.0 LTS版本发布。
本文将介绍如何移植OpenHarmony 3.0到星空派开发板上。

1. 星空派开发板介绍

星空派(GD)开发板是由旗点科技推出的一款GD32开发板,板载GD32F303ZET6芯片,可直接替代STM32F103和GD32F103系列。
支持WiFi、4G、loRa等物联通信接口。板载Flash、eeprom等,支持3.2寸的TFT - LCD屏幕。所有IO口均引出,可完整地进行外设开发,包括:JTAG、RTC、I2C、UART、SPI、SDIO、EXMC、DAC、ADC、USB、TFT-LCD等。
image.png

2. ARM芯片移植轻量系统基础知识

在做芯片移植工作之前,我们需要掌握一点点基础知识。

(1)适配LiteOS-M轻量系统

GD32F303系列器件是基于Arm® Cortex®-M4处理器的32位通用微控制器。所以我们使用的是内核是LiteOS-M,对应的是OpenHarmony轻量系统。
事实上,OpenHarmony已经做好了Cortex®-M4 核相关的通用移植工作,具体代码可以查看文件夹:“kernel\liteos_m\kernel\arch\arm”
image.png
可以看到目前已经支持了cortex-m4核。所以内核移植工作基本不需要,减少了我们很多工作量,但是我们仍然需要移植GD32F303芯片相关的。

(2)哈佛架构

GD32F303采用的是哈佛架构,哈佛架构的特点是代码指令和数据分开存储。对于GD32F303而言,代码是存放在片内flash上,地址是0x8000000。
数据(也就是代码中用到的各种变量、内存等)是存放在芯片内部内存RAM上,地址是0x20000000,总共64K,即0x10000。
image.png

(3)编译结果分析

对于GD32F303而言,编译出来的固件一般是bin格式、或者hex格式。通常编译最后的结果会产生4种不同的内容,有时我们也称为4段:
1)code:即程序代码部分,该内容由所有程序指令组成,也是代码运行的主体,通常是要烧录到GD32F303片内flash上。
2)RO-data:只读数据段,例如我们在程序中所定义的全局常量数据和字符串都位于此处。由于这些数据都是只读,不会改变的,那这些只读的全局就没必要放到内存种,可以直接放到flash中,可以节省内存。
3)RW-data:已初始化的读写数据,程序中定义并且初始化的全局变量和静态变量位于此处。由于内存刚上电后,内存上的数据是未知,所以我们需要事先把这些全局变量、静态变量的初始值先存放到flash中,然后上电后,由CPU将flash中的初始值赋予到内存中的变量中。
4)ZI-data:未初始化的全局变量或者初始化为0的全局变量,这些变量默认都是0,我们只需要CPU上电后,将这些内存都清零即可。

由上我们可以的出来2个结论:
1)我们编译出来的固件要烧录到GD32F303的片内flash,需要由3段数据:code、RO-data、RW-data
image.png
2)芯片上电后,GD32F303需要将RW-data的内容复制到内存对应位置,从而保证初始化的全局变量和静态变量的值正确;还要对内存中的ZI-data段进行清零操作,最后才能执行main函数。

(4)程序如何启动

对于ARM Cortex-M系列的芯片而言,当芯片上电后,ARM核会将地址为0x8000000的数据映射到0地址,然后从0地址开始读取程序指令。
而0x8000000地址是芯片内部flash的起始地址。也就是编译生成的固件最终要烧录到的地址。所以我们的固件前面的代码非常重要,它是我们芯片启动后执行的第一条指令。

(5)中断向量表

对于ARM Cortex-M系列的芯片而言,0x8000000地址第一个字节是栈指针,由于栈是从高往下增长的,所以该栈指向芯片最大内存处即可。
接下来从0x8000000的第2个字节开始是中断向量表,存放着所有中断处理函数指针。前面16个是内核中断,其中第一个中断指针存放的是Reset_Handler复位中断处理函数。芯片一上电、或者复位,都会先从该中断函数开始运行,所以这个函数是我们最重要的,我们需要在该函数中完成RW-data、ZI-data数据的操作,同时初始化好芯片时钟、最后进入main函数。
image.png

3. 移植GD32F303芯片到OpenHarmony3.0

这里提供移植好的相关代码,下载链接:
https://gitee.com/qidiyun/gd32-f303-for-open-harmony-3.0

(1)先按官网教程搭建好Ubuntu下的开发环境。

下载arm交叉编译器:
git clone https://gitee.com/harylee/gcc-arm-none-eabi-10-2020-q4-major.git ,将交叉编译器环境变量bin目录配置到.bashrc文件中或者配置device/st/stm32l4r9i_disco/liteos_m/config.gni文件中board_toolchain_path宏为交叉编译器bin路径。

(2)下载上方移植好的代码,文件夹如下:

image.png
将device文件夹下的gd文件夹复制到OpenHarmony3.0代码的device文件夹下
将vendor文件夹下的gd文件夹复制到OpenHarmony3.0代码的vendor文件夹下
复制后,OpenHarmony3.0的device文件夹内容如下:
image.png
OpenHarmony3.0的vendor文件夹内容如下:
image.png

(3)编译

进入OpenHarmony3.0源码根目录,输入 hb set 可以看到由gd32f303_qidian的编译选项。选择。
image.png
输入 hb build -f开始全编译:
image.png
有看到 [OHOS INFO] gd32f303_qidian build success 表示编译成功。
编译完成后,可以在“out\gd32f303_qidian\gd32f303_qidian”文件夹下看到编译结果,其中“gd32f303_qidian_ninjia.hex”就是可以直接烧录到开发板的固件。
image.png

4. vendor文件夹

该文件下最重要的文件是“config.json”
image.png
内如如下,主要是配置相关组件:
image.png
4. device代码
(1)device文件夹:
该文件夹下是星空派开发板的重要代码部分,其中就有启动文件、main函数、中断处理等。
image.png
由于移植内容较长,本文重点介绍启动文件、链接脚本。

(1)启动文件

启动文件startup_gd32f30x.s 。最重要的是将RW-data的内容复制到内存对应位置,从而保证初始化的全局变量和静态变量的值正确;还要对内存中的ZI-data段进行清零操作,最后才能执行main函数。
代码都是汇编,参考自st和gd相关启动文件,重要代码如下:
image.png

(2)链接脚本

链接脚本是“gd32f30x_qidian.ld”,用于指定code、RO-data、RW-data、ZI-data如何分布。
首先指定内存地址为0x20000000,大小为64K、
片上flash地址为:0x8000000,大小为512K
这里跟芯片相关,需要正确修改,否则可能起不来。
image.png
这里跟芯片相关,需要正确修改,否则可能起不来。

(3)固件生成规则。

同时链接脚本也指定了固件的生成规则:
image.png
这里只截取了部分,可以看到生成的固件最开始存放的isr_vector,这个是中断向量表,在启动文件中定义:
image.png
接下来就是text,也就是代码段
还有rodata,只读数据段。
后面还有其它定义,我们下一篇再细节。
至此我们的启动文件、链接脚本中比较关键的部分已经说明完。

5. liteos-m内核配置

进入“device\gd\gd32f303_qidian\liteos_m”文件夹,可以看到有这个文件“config.gni”
该文件用于配置 liteos-m内核。
其中比较重要部分是指定我们的处理器架构和交叉编译工具链,如下:
image.png
我们使用的交叉编译工具链是 “arm-none-eabi-”
下面还配置了相关宏定义和gd标准库头文件路径,需要大家修改。
image.png

好了~~~,初步移植要点讲完了,下一篇文章讲openharmony内核配置文件、main函数启动后如何进入鸿蒙轻量内核~~。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

移植OpenHarmony 3.0到ARM单片机 的相关文章

  • 亲测有效,如何用ChatGPT 生成高质量原创视频

    尽管ChatGPT目前缺乏视频生成的能力 但我们可以借助插件实现视频生成 特别是对于那些从事Tiktok海外运营的用户而言 Visla和HeyGen是我目前测试的两款可生成视频的插件 首先登陆您的ChatGPT帐号 并单击邮箱 勾选设置 S
  • CUDA的作用

    显卡中CUDA是什么及作用介绍 CUDA Compute Unified Device Architecture 显卡厂商NVidia推出的运算平台 CUDA是一种由NVIDIA推出的通用并行计算架构 该架构使GPU能够解决复杂的计算问题
  • 联合memcache,repcached,magent,monit四个组件搭建高可用集群方案

    一 基本介绍 1 组件承担的角色 1 memcache负责缓存对象 2 repcached负责单主单从的同步备份 3 magent代理实现N主N备 4 monit监听以上组件的各个实例端口 保证故障自动重启 2 集群思路 1 利用repca
  • Unlock PeopleSoft Objects All at Once

    Change control is used in Application Designer to lock definitions and track history changes for each object Change cont
  • 图解NCHW与NHWC数据格式

    图解NCHW与NHWC数据格式 田海立 CSDN CSDN博客 nchw 流行的深度学习框架中有不同的数据格式 典型的有NCHW和NHWC格式 本文从逻辑表达和物理存储角度用图的方式来理解这两种数据格式 最后以RGB图像为例来加深NHWC和
  • Adam优化算法详细解析

    本文转载于以下博客地址 http www atyun com 2257 html 如有冒犯 还望谅解 Adam优化算法是一种对随机梯度下降法的扩展 最近在计算机视觉和自然语言处理中广泛应用于深度学习应用 在引入该算法时 OpenAI的Die
  • 使用nginx实现负载均衡

    一 什么是负载均衡 随着互联网的发展 业务流量越来越大并且业务逻辑也越来越复杂 使用单台机器可能会造成性能问题和单点故障 因此需要多台机器来进行性能的水平扩展以及避免单点故障 为了将不同的用户的流量分发到不同的服务器上面 保持每台机器处理请
  • J-Link RTT调试的初始介绍

    1 RTT简介 RTT全称是Real Time Transmit 实时传输 是Segger公司推出的调试手段之一 它是一种用于嵌入式中与用户进行交互的技术 使用RTT可以从MCU快速输出调试信息和数据 且不影响MCU的实时性 只要支持J L
  • 渲染页到详情页到加入购物车

    1 渲染 拿到数据放在自己的data渲染 data headerList class tabid index active tabid点击时的下标 index是数组下标 active是选中时状态 分类功能 click handfenl it

随机推荐

  • 数据挖掘主要解决的四类问题

    数据挖掘主要解决的四类问题 数据挖掘非常清晰的界定了它所能解决的几类问题 这是一个高度的归纳 数据挖掘的应用就是把这几类问题演绎的一个过程 下面让我们来看看它所解决的四类问题是如何界定的 1 分类问题 分类问题属于预测性的问题 但是它跟普通
  • yolo目标检测图片时,png出问题(花掉),bmp、jpg等其他格式没问题

    yolo做目标检测的时候 当输入图片是png的时候 整个图片会花掉 如图所示 研究了好久 是因为png是8位 bmp jpg是24位 所以要将8位转换成24位 这里参考了 https blog csdn net qq 17130909 ar
  • ORA-01578(数据块损坏) 转

    当Oracle数据库出现坏块时 Oracle会在警告日志文件 alert SID log 中记录坏块的信息 ORA 01578 ORACLE data block corrupted file 7 block
  • wxWidgets简单的多线程

    include
  • vue el-tree:默认展开第几级节点

    需求描述 Tree 树形结构 默认展开第二级菜单 查 element 文档 解决方法 设置 default expanded keys 的值为 idArr 数组
  • JVM——查看full gc频率(jstat -gc)

    问题 如何查看系统的full gc频率 思路 使用JVM工具jstat查看 步骤 1 运行jps获取进程号 jps 2 目标进程9 监控JVM 每5秒打印一次 jstat gc 9 5000 说明 S0C 幸存区1的大小 S1C 幸存区2的
  • 多线程(四)线程的状态及生命周期

    目录 一 线程的状态 新建 初始 就绪 可运行 运行 阻塞 死亡 二 线程的状态转移 NEW RUNNABLE TERMINATED 状态的转移 yield 方法 让出 CPU执行权 三 线程的生命周期 一 线程的状态 NEW 安排了工作
  • Redis数据类型-hash

    一 概述 Redis中hash类型可以具有String key和String value的map容器 所以该类型非常适合存储值对象的信息 如username password和age等 如果hash中包含很少的字段 那么该类型的数据也将仅占
  • 华为无盘服务器,无盘服务器操作系统

    无盘服务器操作系统 内容精选 换一换 本节操作介绍购买云耀云服务器的操作步骤 购买时 为减少您配置参数的时间 部分参数由系统自动分配 以下参数配置供你了解系统的默认配置 购买云耀云服务器仅支持 包年 包月 的计费方式 请您在购买前确保已完成
  • Web实现前后端分离,前后端解耦

    点击上方 Java之间 选择 置顶或者星标 你关注的就是我关心的 作者 山河远阔 来源 https blog csdn net weixin 37539378 article details 79956760 上一篇 面试官 数据量很大 分
  • 蜗牛君漫聊动态布局框架(二):核心功能的思路与实现

    Hello 大家好 我是蜗牛君 我们又见面了 本篇文章是蜗牛君漫聊动态布局框架的第二篇 上一篇中我们讲解了框架的大致思路 以及复习了一下RecyclerView的基础使用方式 那么本篇文章我们就正式开始框架的搭建了 首先我们要做一件事情 就
  • Python出现Could not find a version that satisfies the requirement openpyxl (from versions: )

    一 环境使用python3 7时 用pip安装openpyxl出现如下错误 系统环境 windows10家庭版Python版本 python3 7 1IDE sublime text 3二 解决方案按照提示所示是其中一个原因是pip版本过低
  • GPU对应的cuda以及cuDNN驱动安装

    cudnn 临时个性化版本切换 https blog csdn net sslfk article details 123053540 1 查看自己的cuda 最高支持的版本 查看方法 sudo cat usr local cuda ver
  • Spring到底是一个什么东西呢?

    转自 Spring到底是一个什么东西呢 Spring 自面世以来 一直深受大家的喜爱 它延申出很多优秀的框架 如 Spring framework SpringMVC SpringBoot Spring Cloud Spring Data
  • 那些会阻碍程序员成长的细节[5]

    全文共 1304字 预计阅读时间 4分钟 断断续续的写成一个系列 也出乎我的意料 越展开内容越多 有点收不住 Let s 继续吧 进入主题 不依规范行事 这个很常见 嘴上一套 行动时另一套 也就是知行不一 实际是知易行难 不自我监督 不自我
  • (四)RTL级低功耗设计

    前面介绍了系统级的低功耗设计 换句话说就是在系统级降低功耗可以考虑的方面 系统级的低功耗设计 主要是由系统级设计 具有丰富经验的人员实现 虽然还轮不到我们设计 我们了解一下还是比较好的 我们前端设计人员的重点不在系统级设计上面 而是在RTL
  • webapi添加html页面,webApi添加视图出现/Index.cshtml”处的视图必须派生自 WebViewPage 或 WebViewPage。...

    是因为webApi Views文件夹下缺乏web config文件 从mvc项目相同目录拷贝一个web Config文件放入 删除多余的namespaces 即可 web config配置如下 Index period cshtml 处的视
  • 零基础玩转树莓派(四)—GPIO端口控制(LED灯)

    一 GPIO介绍 树莓派3B 和普通电脑不一样的地方在于它还带了40个可编程的GPIO General Purpose Input Output 可以用来驱动各种外设 如传感器 步进电机等 GPIO General Purpose I O
  • Markdown学习

    标题 Hello world hello world 引用 选择java走向人生巅峰 格式 gt 回车 分割线 回车 图片 图片名字 超链接 格式 链接名字 点击跳转4399游戏 列表 有序列表 格式 数字 空格 无序列表 格式 空格 表格
  • 移植OpenHarmony 3.0到ARM单片机

    9月30日 OpenHarmony 3 0 LTS版本发布 本文将介绍如何移植OpenHarmony 3 0到星空派开发板上 1 星空派开发板介绍 星空派 GD 开发板是由旗点科技推出的一款GD32开发板 板载GD32F303ZET6芯片