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等。

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

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

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

GD32F303系列器件是基于Arm® Cortex®-M4处理器的32位通用微控制器。所以我们使用的是内核是LiteOS-M,对应的是OpenHarmony轻量系统。
事实上,OpenHarmony已经做好了Cortex®-M4 核相关的通用移植工作,具体代码可以查看文件夹:“kernel\liteos_m\kernel\arch\arm”

可以看到目前已经支持了cortex-m4核。所以内核移植工作基本不需要,减少了我们很多工作量,但是我们仍然需要移植GD32F303芯片相关的。

(2)哈佛架构

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

(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

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函数。

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)下载上方移植好的代码,文件夹如下:


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

OpenHarmony3.0的vendor文件夹内容如下:

(3)编译

进入OpenHarmony3.0源码根目录,输入 hb set 可以看到由gd32f303_qidian的编译选项。选择。

输入 hb build -f开始全编译:

有看到 [OHOS INFO] gd32f303_qidian build success 表示编译成功。
编译完成后,可以在“out\gd32f303_qidian\gd32f303_qidian”文件夹下看到编译结果,其中“gd32f303_qidian_ninjia.hex”就是可以直接烧录到开发板的固件。

4. vendor文件夹

该文件下最重要的文件是“config.json”

内如如下,主要是配置相关组件:

4. device代码
(1)device文件夹:
该文件夹下是星空派开发板的重要代码部分,其中就有启动文件、main函数、中断处理等。

由于移植内容较长,本文重点介绍启动文件、链接脚本。

(1)启动文件

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

(2)链接脚本

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

这里跟芯片相关,需要正确修改,否则可能起不来。

(3)固件生成规则。

同时链接脚本也指定了固件的生成规则:

这里只截取了部分,可以看到生成的固件最开始存放的isr_vector,这个是中断向量表,在启动文件中定义:

接下来就是text,也就是代码段
还有rodata,只读数据段。
后面还有其它定义,我们下一篇再细节。
至此我们的启动文件、链接脚本中比较关键的部分已经说明完。

5. liteos-m内核配置

进入“device\gd\gd32f303_qidian\liteos_m”文件夹,可以看到有这个文件“config.gni”
该文件用于配置 liteos-m内核。
其中比较重要部分是指定我们的处理器架构和交叉编译工具链,如下:

我们使用的交叉编译工具链是 “arm-none-eabi-”
下面还配置了相关宏定义和gd标准库头文件路径,需要大家修改。

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

移植OpenHarmony 3.0到ARM单片机相关推荐

  1. 移植OpenHarmony到星空派ARM芯片【1】

    9月30日,OpenHarmony 3.0 LTS版本发布 本文将介绍如何移植OpenHarmony 3.0到星空派开发板上. 1. 星空派开发板介绍 星空派(GD)开发板是由旗点科技推出的一款GD3 ...

  2. ARM单片机FATFS文件系统的移植

    ARM单片机FATFS文件系统的移植 测试效果 前提条件 下载所需源码 FATFS 文件系统 SFUD万能驱动 加入工程 接口驱动 测试代码 FreeRTOS10.0.1 FATFS FF14A SF ...

  3. 首发 成功移植OpenHarmony到龙芯开发板,代码开源

    通过一周的时间,我们成功地将OpenHarmony 3.0移植到智龙开发板上,板载芯片1C300B. 1C300是龙芯基于 GS232 处理器核的高性价比单芯片系统,内置浮点处理单元,支持多种类型内存 ...

  4. 【KEIL·单片机·扫盲贴】关于ARM单片机程序内存使用情况的细致讨论。

    接触了两年多时间的单片机编程本人对关于单片机程序内存如何耗费的问题一直懵懵懂懂,直到在近日看到某篇有关于MDK MAP文件介绍的帖子后才有种醍醐灌顶的感觉,这里我将分享在此之上的观点与见解以供大家讨论 ...

  5. 嵌入式编程(二):ARM单片机如何将函数 定义到指定程序地址

    在单片机编程使用中,会涉及到将某些函数定义到指定的code区.此时需要对工程文件进行配置修改才可完成.本期针对ARM平台单片机做出说明介绍 1.测试目标 将函数Communication_Test定义 ...

  6. 移植中文TTS(ekho)到ARM linux开发板

    移植ekho到arm linux,实现将中文转换为.wav格式的语音文件. 移植开源库libsndfile到arm linux开发板 1. 下载压缩源码包libsndfile-1.0.28.tar.g ...

  7. zynq7020的ARM单片机编译与运行程序MTCNN

    背景:FPGA的运行需要片上ARM的控制,所以需要针对片上ARM编写的源码并且需要片上ARM执行源码. 目的:运用ARM编译MTCNN的代码,然后在ARM上运行. 目录 一.创建虚拟机 二.虚拟机上编 ...

  8. 【鸿蒙OS开发入门】16 - 重头搭建Ubuntu新环境编译OpenHarmony 3.0 LTS

    [鸿蒙OS开发入门]16 - 重头搭建Ubuntu新环境编译OpenHarmony 3.0 LTSv 一.配置Telnet 和 samba 二.下载code-v3.0-LTS.tar.gz源码 三.配 ...

  9. 51单片机按键控制数码管0~9_51单片机外部中断

    前面为大家介绍的点亮LED灯.数码管.按键只用到了51单片机的IO资源,我们要是仅仅用单片机点灯.操作数码管,那可真是大才小用了.这些都只是51单片机资源的冰山一角,51单片机还有好多的功能,我后面将 ...

最新文章

  1. 将二进制流转换为图片
  2. Sam Hartman 当选 Debian 社区领导人
  3. Matplotlib的画图的补充(Matplotlib的疑难杂症)
  4. 来自未来,2022 年的前端人都在做什么?
  5. java8 lamada表达式
  6. javascript 经常会用到的东西
  7. 五种常用web服务器jvm参数设置
  8. 【电子商务法】北邮国际学院大三上期末复习
  9. hdu--6045 Is Derek Lying
  10. C#面向对象编程的学习笔记
  11. 实现数字电视机顶盒画面的纯键盘和遥控操作网页
  12. [codeforces 1324D] Pair of Topics 分而治之+排列组合
  13. 【Minecraft】10分钟教你搭建我的世界Java版开服教程【Linux服务器+MCSManager管理面板】
  14. 基于matlab数字滤波器设计,毕业设计 基于MATLAB的数字滤波器设计
  15. 新媒体管理师详解,新媒体矩阵搭建不完全指南
  16. Python实现办公自动化
  17. Connection Timeout 问题排查
  18. SAP-MM知识精解-采购标准业务(02-01)-消耗性物料的采购之基于成本中心的采购
  19. 牛B的人到处都是(打击的一沓糊涂)
  20. 文章阅读总结:OpenAI-Codex

热门文章

  1. matlab日期统计,Matlab 日期频次统计
  2. centos6系统语言英文改为中文
  3. VUE 数组性能优化以及踩雷
  4. python常用函数库
  5. 计算机科学与技术英语面试,2018北大计算机科学与技术智能科学与技术考研复试通知复试经验英语及面试技巧...
  6. 论文阅读——《动态规划》 作者 方奇
  7. 布伦特原油期货为什么比纽约原油贵那么多
  8. The backlash against big data
  9. java date time_java8-date和timeAPI
  10. C++ 如何让程序暂停一会儿