9 月 30 日,openharmony 3.0 lts 版本发布。本文将介绍如何移植 openharmony 3.0 到星空派开发板上。
星空派开发板介绍
星空派(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 等。
arm 芯片移植轻量系统基础知识
在做芯片移植工作之前,我们需要掌握一点点基础知识。
①适配 liteos-m 轻量系统
gd32f303 系列器件是基于 arm cortex-m4 处理器的 32 位通用微控制器。
所以我们使用的是内核是 liteos-m,对应的是 openharmony 轻量系统。
事实上,openharmony 已经做好了 cortex-m4 核相关的通用移植工作,具体代码可以查看文件夹:“kernelliteos_mkernelarcharm”。
可以看到目前已经支持了 cortex-m4 核。所以内核移植工作基本不需要,减少了我们很多工作量,但是我们仍然需要移植 gd32f303 芯片相关的。
②哈佛架构
gd32f303 采用的是哈佛架构,哈佛架构的特点是代码指令和数据分开存储。对于 gd32f303 而言,代码是存放在片内 flash 上,地址是 0x8000000。
数据(也就是代码中用到的各种变量、内存等)是存放在芯片内部内存 ram 上,地址是 0x20000000,总共 64k,即 0x10000。
③编译结果分析
对于 gd32f303 而言,编译出来的固件一般是 bin 格式、或者 hex 格式。
通常编译最后的结果会产生 4 种不同的内容,有时我们也称为 4 段:
code:即程序代码部分,该内容由所有程序指令组成,也是代码运行的主体,通常是要烧录到 gd32f303 片内 flash 上。
ro-data:只读数据段,例如我们在程序中所定义的全局常量数据和字符串都位于此处。由于这些数据都是只读,不会改变的,那这些只读的全局就没必要放到内存种,可以直接放到 flash 中,可以节省内存。
rw-data:已初始化的读写数据,程序中定义并且初始化的全局变量和静态变量位于此处。由于内存刚上电后,内存上的数据是未知,所以我们需要事先把这些全局变量、静态变量的初始值先存放到 flash 中,然后上电后,由 cpu 将 flash 中的初始值赋予到内存中的变量中。
zi-data:未初始化的全局变量或者初始化为0的全局变量,这些变量默认都是 0,我们只需要 cpu 上电后,将这些内存都清零即可。
由上我们可以的出来 2 个结论:
1)我们编译出来的固件要烧录到 gd32f303 的片内 flash,需要由 3 段数据:code、ro-data、rw-data。
2)芯片上电后,gd32f303 需要将 rw-data 的内容复制到内存对应位置,从而保证初始化的全局变量和静态变量的值正确;还要对内存中的 zi-data 段进行清零操作,最后才能执行 main 函数。
④程序如何启动
对于 arm cortex-m 系列的芯片而言,当芯片上电后,arm 核会将地址为 0x8000000 的数据映射到 0 地址,然后从 0 地址开始读取程序指令。
而 0x8000000 地址是芯片内部 flash 的起始地址。也就是编译生成的固件最终要烧录到的地址。所以我们的固件前面的代码非常重要,它是我们芯片启动后执行的第一条指令。
⑤中断向量表
对于 arm cortex-m 系列的芯片而言,0x8000000 地址第一个字节是栈指针,由于栈是从高往下增长的,所以该栈指向芯片最大内存处即可。
接下来从 0x8000000 的第 2 个字节开始是中断向量表,存放着所有中断处理函数指针。
前面 16 个是内核中断,其中第一个中断指针存放的是 reset_handler 复位中断处理函数。
芯片一上电、或者复位,都会先从该中断函数开始运行,所以这个函数是我们最重要的,我们需要在该函数中完成 rw-data、zi-data 数据的操作,同时初始化好芯片时钟、最后进入 main 函数。
移植gd32f303到openharmony 3.0
这里提供移植好的相关代码,下载链接:
https://gitee.com/qidiyun/gd32-f303-for-open-harmony-3.0
①先按官网教程搭建好 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 路径。
②下载上方移植好的代码
将 device 文件夹下的 gd 文件夹复制到 openharmony 3.0 代码的 device 文件夹下。
将 vendor 文件夹下的 gd 文件夹复制到 openharmony 3.0 代码的 vendor 文件夹下。
复制后,openharmony 3.0 的 device 文件夹内容
openharmony 3.0 的 vendor 文件夹内容
③编译
进入 openharmony 3.0 源码根目录,输入 hb set 可以看到由 gd32f303_qidian 的编译选项。选择。
输入 hb build -f 开始全编译:
有看到 [ohos info] gd32f303_qidian build success 表示编译成功。
编译完成后,可以在“outgd32f303_qidiangd32f303_qidian”文件夹下看到编译结果,其中“gd32f303_qidian_ninjia.hex”就是可以直接烧录到开发板的固件。
vendor 文件夹
该文件下最重要的文件是“config.json”:
内如如下,主要是配置相关组件:
device 代码解析:
device 文件夹:该文件夹下是星空派开发板的重要代码部分,其中就有启动文件、main 函数、中断处理等。
由于移植内容较长,本文重点介绍启动文件、链接脚本。
①启动文件
启动文件 startup_gd32f30x.s 。最重要的是将 rw-data 的内容复制到内存对应位置,从而保证初始化的全局变量和静态变量的值正确;还要对内存中的 zi-data 段进行清零操作,最后才能执行 main 函数。
代码都是汇编,参考自 st 和 gd 相关启动文件,重要代码如下:
②链接脚本
链接脚本是“gd32f30x_qidian.ld”,用于指定code、ro-data、rw-data、zi-data 如何分布。
首先指定内存地址为 0x20000000,大小为 64k、片上 flash 地址为:0x8000000,大小为 512k,这里跟芯片相关,需要正确修改,否则可能起不来。
这里跟芯片相关,需要正确修改,否则可能起不来。
③固件生成规则
同时链接脚本也指定了固件的生成规则:
这里只截取了部分,可以看到生成的固件最开始存放的 isr_vector,这个是中断向量表,在启动文件中定义:
接下来就是 text,也就是代码段,还有 rodata,只读数据段。后面还有其它定义,我们下一篇再细节。至此我们的启动文件、链接脚本中比较关键的部分已经说明完。
liteos-m 内核配置
进入“devicegdgd32f303_qidianliteos_m”文件夹,可以看到有这个文件“config.gni”,该文件用于配置 liteos-m 内核。
其中比较重要部分是指定我们的处理器架构和交叉编译工具链,如下:
我们使用的交叉编译工具链是 “arm-none-eabi-”。
下面还配置了相关宏定义和 gd 标准库头文件路径,需要大家修改。
好了,初步移植要点讲完了,下一篇文章讲 openharmony 内核配置文件、main 函数启动后如何进入鸿蒙轻量内核~
支持国产芯片,国家带头发力
UWB科技赋能降本增效,实现智能化转型
2017年传感器、光电器件、分立器件市场皆创新高,增长11%
MIP与COB“博弈”
区块链支付C2C交易平台usdt承兑商系统开发
如何移植OpenHarmony 3.0 到星空派开发板上
讯维综合调度中心案例分享
中国智慧园区高质量发展峰会2023 | 高品质万兆园区网络,跃升企业数字生产力
金属探测器的制作
区块链的主要应用是什么何时会成为主流
2021全球工业互联网大会于10月18日在沈阳开幕
高压电阻的特点及选型
信号是怎么在晶体管中被放大的?
毫米波通信研究现状
海尔美的成数字化新引擎,成为中国制造业转型升级的利器
三角测量传感器可实现很高的测量精度
Fluke 317交直流数字钳形表的功能特点及应用范围
Arasan宣布用于台积公司22nm工艺技术的eMMC PHY IP立即可用
ICCAD 2021,得一微全新“存储控制IP和设计服务”备受关注
如何使用开源硬件及Mind+图形化编程制作灯光画