当前位置: 首页 > 科技观察

OpenHarmony轻量级系统解耦设计思想

时间:2023-03-17 00:26:41 科技观察

更多内容请访问:与华为官方共建的鸿蒙技术社区https://ost.51cto.com1、hb编译原理当我们进入hbset命令,会提示我们选择要编译构建的项目。那么,hb怎么知道哪些项目可以编译呢?其实这些项目都在vendor文件夹下。为了验证,我们可以在vendor:gd中新建一个空文件夹,然后在gd文件夹下创建gd32f303_lianzhian文件夹。但这还不够。一个标准简单的vendor文件夹结构如下:debug.config的内容可以为空,因为它的内容是自动生成的,我们后面配置内核的时候需要用到。我们可以直接从3861中复制这些文件,然后删除我们不需要的子系统。我们只需要保留以下内容:config.json文件:{"product_name":"gd32f303_lianzhian","type":"mini","version":"3.0","device_company":"lianzhian","board":"gd32f303_lianzhian","kernel_type":"liteos_m","kernel_version":"","subsystems":[{"subsystem":"kernel","components":[{"component":"liteos_m","features":[]}]}],"third_party_dir":"","product_adapter_dir":""}BUILD.gnfile:group("gd32f303_lianzhian"){}此时我们再次执行hbset,可以看到我们创建的项目:gd32f303_lianzhian。2.设计思路最新master分支的代码设计采用了Board与SoC解耦的设计思路。具体可以参考这篇文章:https://gitee.com/openharmony-sig/sig-content/blob/master/devboard/docs/board-soc-arch-design.md分为芯片架构层,系统-片上层和单板层按硬件级别划分。包括自下而上的关系,例如:(1)ArchitectureARMv7E-M架构有ARMCortex-M4、ARMCortex-M7等CPU实现(2)芯片系列ARMCortex-M4CPU对应SoCFamily包括STMicroSTM32、NXPi.MX等,依次如图,SoCFamily2横跨CPU1和CPU2,也就是说一个SoCFamily可以包含多个CPU实现。例如意法半导体的STM32可以包含Cortex-M0、Cortex-M4等CPU,复杂的STM32MP157SoC包含2个Cortex-A7CPU内核和1个Cortex-M4CPU内核。对于异构多核SoC,需要通过OpenAMP将其分解为多个同构多核部分。(3)芯片与开发板的对应关系STM32SoCFamily有STM32F4、STM32G4等SoC系列。STM32F4SoC系列有STM32F401、STM32F429等SoC。STM32F429SoC有野火STM32F429挑战者开发板、正点原子stm32f429阿波罗开发板等。如图所示,Board5上有一个盾牌,表示一块Board可以通过增加扩展板提供更强的功能。例如,单板可以通过串口通信外接Hi3861模块,提供WLAN功能。基于硬件结构层次图,OpenHarmony的顶层目录结构设计如下。3.电路板配置(1)创建电路板文件夹。我们输入hbset命令后,选择gd32f303_lianzhian,会提示错误信息:weneedtocreatethisfolder:为什么是device/board/lianzhianlianzhian????因为我们在vendor中的config.json中指定了device_company,而设备厂商是联智,可以回头看看标准板文件夹目录结构如下:(2)Kconfig配置文件我们可以在kernel/liteos_m内核中执行makemenuconfig图形配置目录。Makefile会遍历板下所有的Kconfig文件,所以我们需要添加对应的Kconfig文件。这里内核是分层设计的,即厂商配置与具体的开发板分离,一个厂商下可以有多个开发板。比如我们现在移植的设备厂商是lianzhian,那么lianzhian就是manufacturer文件夹,在lianzhian下面有Kconfig,主要是厂商级别的配置。那么联智安下可以有多个开发板,我们这里只写gd32f303_联智安开发板。同样,在gd32f303_lianzhian文件夹下也有一个Kconfig配置文件。(3)厂商Kconfig配置文件我们先来看一下联智厂商的Kconfig文件Kconfig.liteos_m.boards。文件内容:orsource"*/Kconfig.liteos_m.board"可以看出非常简单。导入所有文件夹下的Kconfig.liteos_m.board文件。Kconfig.liteos_m.defconfig.boards文件或源“*/Kconfig.liteos_m.defconfig.board”也导入当前目录下所有文件夹中的Kconfig.liteos_m.defconfig.board文件。(3)这里暂时不需要Kconfig.liteos_m.shields文件,内容可以为空。(4)具体开发板的Kconfig配置文件,我们先看gd32f303_lianzhian厂家的Kconfig文件Kconfig.liteos_m.board文件:配置需要选择Boardoptions,SoCconfig取决于BOARD_GD32F303_LIANZHIANbool”selectboardgd32f303lianzhian"dependsonSOC_GD32F303#只有当我们的芯片型号选择为GD32F303时,可以看到这里是增加了一个配置选项,也就是后面在makemenuconfig中可以看到"selectboardgd32f303lianzhian"配置项.Kconfig.liteos_m.defconfig.board文件:需要配置。选择板子后,默认定义了板子的名称。Wecanleavethisfileblank,orconfigureitasfollows:ifBOARD_GD32F303_LIANZHIANconfigBOARDstringdefault"gd32f303_lianzhian"endif#BOARD_GD32F303_LIANZHIANgd32f303_lianzhian:thecontentistheconfigfile:LOSCFG_BOARD_GD32F303_LIANZHIAN=yLOSCFG_SOC_SERIES_GD32F303=yLOSCFG_SOC_GD32F303ZET6=yThisindicatestheboard,SOC,andSOCspecificsub-我们选择的模型系列。(5)config.gni配置文件liteos_m文件夹下的config.gni文件用于内核配置。文件内容如下:#Copyright(C)2020Hisilicon(Shanghai)TechnologiesCo.,Ltd.Allrightsreserved.#选择内核类型,例如"linux","liteos_a","liteos_m".kernel_type="liteos_m"#内核版本,留空。kernel_version=""#芯片架构,例如“皮质-a7”、“riscv32”。board_cpu="cortex-m4"#这里通常欢迎您,例如"armv7-a","rv32imac".board_arch=""#用于系统编译的工具链名称。#例如gcc-arm-none-eabi,arm-linux-harmonyeabi-gcc,ohos-clang,riscv32-unknown-elf.#注意:默认工具链是“ohos-clang”。如果你使用默认工具链,则不强制。#交叉编译器名称board_toolchain="arm-none-eabi-gcc"#安装的工具链路径,如果你已将工具链路径添加到你的~/.bashrc中,则不强制。#它是一般不用写board_toolchain_path=""#Cross-compilerCompilerprefix.board_toolchain_prefix="arm-none-eabi-"#Compilertype,"gcc"or"clang"。board_toolchain_type="gcc"#CompilationoptionsBoard相关的通用编译标志。board_cflags=[“-mcpu=cortex-m4”、“-mfpu=fpv4-sp-d16”、“-mfloat-abi=hard”、“-mthumb”、“-Og”、#“-g”、#“-Wall”,"-fdata-sections","-ffunction-sections",#注意,这里需要定义GD32F30X_HD宏"-DGD32F30X_HD",#需要浮点计算"-D__FPU_PRESENT",]board_cxx_flags=board_cflagsboard_ld_flags=[]#headerfilePath,一般需要soc相关的Boardrelatedheadfilessearchpath.board_include_dirs=["${ohos_root_path}device/soc/gd32/gd32f303/liteos_m","${ohos_root_path}device/soc/gd32/CMSIS","${ohos_root_path}设备/soc/gd32/CMSIS/GD/GD32F30x/Include","${ohos_root_path}device/soc/gd32/gd32f303/GD32F3XX_Driver/Inc","${ohos_root_path}device/soc/gd32/gd32f303","${ohos_root_path}utils/native/lite/include","${ohos_root_path}kernel/liteos_m/components/cpup","${ohos_root_path}kernel/liteos_m/components/exchook",]#哪个soc板适配器目录是开发板用于OHOS组件。board_adapter_dir="${ohos_root_path}device/soc/gd32"#Sysroot路径。board_configed_sysroot=""#Board存储类型,它使用forfilesystemgeneration.storage_type=""4.SOC配置(1)创建SOC文件夹。我们进入device/soc文件夹,创建gd32文件夹。gd32文件夹内容如下:GD32官方标准库文件和CMSIS都是从GD官网下载的,我们不需要修改和编写,所以本节不讲内容,重点介绍Kconfig配置文件。同样,soc也分为芯片厂商的Kconfig和具体芯片信号的Kconfig。gd32是芯片厂商,gd32f303只是其中一种型号。(2)gd32芯片厂商的Kconfig配置文件首先看Kconfig.liteos_m.soc文件:configSOC_COMPANY_GD32boolifSOC_COMPANY_GD32configSOC_COMPANYdefault"gd32"rsource"*/Kconfig.liteos_m.soc"endif#SOC_COMPANY_GD32这里很简单,是配置我们芯片厂家默认是导入gd32后所有文件夹的Kconfig.liteos_m.soc配置文件Kconfig.liteos_m.series文件:这个文件比较简单,导入所有文件夹的Kconfig.liteos_m.series配置文件series"Kconfig.liteos_m.defconfig:同理导入所有文件夹的Kconfig.liteos_m.defconfigrsource"*/Kconfig.liteos_m.defconfig.series"(3)gd32F303芯片的Kconfig配置文件我们来看看具体的芯片型号gd32f303Configurationfile)Kconfig.liteos_m.series文件:需要配置芯片系列,及其芯片架构等信息内容:configSOC_SERIES_GD32F303bool"GD32F303chip"selectARMselectSOC_COMPANY_GD32selectCPU_CORTEX_M4helpEnablesupportforGD32F303Copy这个是芯片系列的选择,我们的芯片系列是GD32F303,架构是ARM,CORTEX_M4芯片厂商是SOC_COMPANY_GD32,定义在上层gd32的Kconfig配置文件中.Kconfig.liteos_m.soc文件:需要配置芯片系列有多少种芯片。内容:选择提示“GD32F303系列SoC”取决于SOC_SERIES_GD32F303#选择芯片系列SOC_SERIES_GD32F303后才会出现以下选项。bool"SoCGD32F303ZET6"endchoiceKconfig.liteos_m.defconfig.series文件:选择芯片系列后的默认配置内容:ifSOC_SERIES_GD32F303rsource"Kconfig.liteos_m.defconfig.gd32f303"configSOC_SERIESstringdefault"gd32f303"configNUM_IRQS#中断次数,与specificchip相关intdefault90configSYS_CLOCK_HW_CYCLES_PER_SEC#时钟周期,GD32F303是120MHzintdefault120000000endifKconfig.liteos_m.defconfig.gd32f303文件:Gd32f303的配置,内容比较简单:configSOCstringdefault"gd32f303zet6"dependsonSOC_GD32F303ZET6默认是gd32f303zet6。Atthispoint,我们soc的kconfig配置就基本完成了。(4)内核配置头文件还有一个比较重要的内核配置头文件,target_config.h。直接copy我的就可以了,主要是内核功能配置相关的。比较重要的配置项之一:/***@ingrouplos_config*Memorysize*/#defineLOSCFG_SYS_HEAP_SIZE(60*1024)这个是配置内核的stacksize,可以根据自己的内存大小来定芯片,GD32F303内存是64KB,我这里可以用60k。(5)makemenuconfig配置完成上面移植的内容之后,接下来,我们就可以配置menuconfig了。注意这里需要先执行hbset选择我们的开发板gd32f303_lianzhian。我们进入kernel/liteos_m文件夹。执行makemenuconfig。进入Platform,我们选择gd32f303芯片,gd32f303_lianzhian开发板,如下:退出并保存。结果会自动保存在$(PRODUCT_PATH)/kernel_configs/debug.config(6)gn编译上一步Kconfig图形化配置后,其生成的配置结果可以作为gn编译的输入,进行控制是否编译了不同的模块。另外,为了解决之前写gn时随机include的问题,内核编译有模块化的编译设计,让整个编译逻辑更加清晰。我们需要在device/board/lianzhian和device/soc/gd32这两个文件夹下编写BUILD.gn。这些BUILD.gn文件比较简单,都是模块化编译。你可以直接参考我的。(七)编译器安装我们使用的编译器是arm-none-eabi-gcc,下载地址:gitclonehttps://gitee.com/harylee/gcc-arm-none-eabi-10-2020-q4-major.git.配置交叉编译环境变量bin目录到.bashrc文件中。(8)开始编译配置BUILD.gn,我们可以开始执行hbbuild-f编译。可以看到编译已经完成了一大半:我们今天的目标是让编译系统开始编译我们的开发板。一步步继续移植,然后配置libc库、系统启动、main函数、链接脚本,直到编译通过,在开发板上运行成功~了解更多请访问:与华为官方共建的鸿蒙科技社区https://ost.51cto.com