更多信息请访问:https://harmonyos.51cto.com与华为官方共同建立的鸿蒙技术社区9月30日,OpenHarmony3.0LTS版本发布。本文将介绍如何将OpenHarmony3.0移植到StarPie开发板上。一、GD32开发板介绍GD32开发板是旗点科技推出的一款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)代码:程序代码部分,由所有程序指令组成,也是代码运行的主体,通常为烧入GD32F303片上闪存。2)RO-data:只读数据段,比如我们在程序中定义的全局常量数据和字符串都位于这里。由于这些数据是只读的,不会改变,所以没有必要把这些只读的globals放到内存中,直接放到flash中就可以了,可以节省内存。3)RW-data:初始化的读写数据,程序中定义和初始化的全局变量和静态变量都位于这里。由于内存上电后内存上的数据是未知的,所以我们需要先将这些全局变量和静态变量的初始值存储在flash中,然后上电后由CPU赋初值在闪存到内存中的变量。4)ZI-data:未初始化的全局变量或初始化为0的全局变量,这些变量默认为0,我们只需要在CPU上电后清除这些内存即可。综上所述,我们可以得出两个结论:1)将编译好的固件烧录到GD32F303的片上flash中,需要3个数据:code,RO-data,RW-data。2)芯片上电后,GD32F303需要将RW-data的内容复制到内存的相应位置,以保证初始化的全局变量和静态变量的值正确;还需要清除内存中的ZI-data段,最后执行main函数。(4)如何启动程序对于ARMCortex-M系列芯片,芯片上电后,ARM内核会将地址为0x8000000的数据映射到地址0,然后从地址0开始读取程序指令。0x8000000地址是芯片内部flash的起始地址。也就是编译好的固件最终要烧录的地址。所以我们固件前面的代码非常重要,它是我们芯片启动后执行的第一条指令。(5)中断向量表对于ARMCortex-M系列芯片,地址0x8000000的第一个字节是堆栈指针。由于栈是从高位向低位增长的,所以栈可以指向芯片的最大内存。接下来,从0x8000000开始的第二个字节是中断向量表,里面存放了所有的中断处理函数指针。前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交叉编译器:gitclonehttps://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设置看gd32f303_qidian的编译选项。选择。输入hbbuild-f开始全量编译:如果看到[OHOSINFO]gd32f303_qidianbuildsuccess,则说明编译成功。编译完成后,在“out\gd32f303_qidian\gd32f303_qidian”文件夹下可以看到编译结果,其中“gd32f303_qidian_ninjia.hex”是可以直接烧写到开发板的固件。4.vendor文件夹下最重要的文件是“config.json”。内容如下,主要是配置相关组件:5.devicecode(1)device文件夹:该文件夹下是星空派开发板的重要代码部分,包括启动文件、main函数、中断处理等。由于对于较长的移植内容,本文重点介绍启动文件和链接脚本。(2)启动文件启动文件startup_gd32f30x.s。最重要的是将RW-data的内容复制到内存中相应的位置,这样才能保证初始化的全局变量和静态变量的值是正确的;在执行主函数之前,内存中的ZI数据段也必须被清除。代码全部汇编,参考st和gd的相关启动文件,重要代码如下:(3)链接脚本链接脚本为“gd32f30x_qidian.ld”,用于指定如何分配代码,RO-数据、RW数据和ZI数据。首先指定内存地址为0x20000000,大小为64K。片内flash地址为:0x8000000,大小为512K。这个和芯片有关,需要修改正确,否则可能无法启动。这个和芯片有关,需要修改正确,否则可能无法启动。(4)固件生成规则。同时,链接脚本还指定了固件生成规则:这里只截取了一部分,可以看到生成固件开头存储的isr_vector。这是中断向量表,在启动文件中定义:接下来是text,也就是代码段。而rodata,只读数据段。后面还有其他的定义,我们会在下一篇文章中详细介绍。至此,我们的启动文件和链接脚本中较为关键的部分已经解释完毕。6、liteos-m内核配置进入“device\gd\gd32f303_qidian\liteos_m”文件夹,可以看到“config.gni”文件。该文件用于配置liteos-m内核。比较重要的部分是指定我们的处理器架构和交叉编译工具链,如下:我们使用的交叉编译工具链是“arm-none-eabi-”。下面也配置了相关的宏定义和gd标准库头文件路径,需要大家自行修改。ok~~~,初步移植的要点说完了,下一篇会讲openharmony内核配置文件和main函数启动后如何进入鸿蒙轻量级内核。更多信息请访问:Harmonyos.51cto.com,与华为官方合作打造的鸿蒙技术社区
