芯片架构的移植是内核移植的基础,在OpenHarmony中芯片架构移植是可选过程,如果当前OpenHarmony已经支持对应芯片架构则不需要移植操作,在“liteos_m/arch”目录下可看到当前已经支持的架构,如表1:
表1 OpenHarmony已支持的架构
系列 | 型号 |
---|---|
arm | arm9 cortex-m3 cortex-m4 cortex-m7 cortex-m33 |
csky | v2 |
risc-v | nuclei riscv32 |
xtensa | lx6 |
如果当前OpenHarmony尚未支持对应芯片架构,则需要芯片厂商自行适配,arch/include目录包含了通用的芯片架构适配所需要实现的函数。部分芯片架构代码由汇编实现,而汇编代码会因编译器的不同而不同,因此在具体的芯片架构下,还包含使用不同编译器(iar、keil、gcc等)编译的架构代码。
kernel/liteos_m/arch # 不同版本路径有差异
├── arm # arm系列
│ ├── arm9
│ ├── cortex-m3
│ ├── cortex-m33
│ │ ├── gcc # 使用gcc编译器编译的架构代码
│ │ └── iar # 使用iar编译器编译的架构代码
│ ├── cortex-m4
│ ├── cortex-m7
├── csky # csky系列
├── include # 包含通用的芯片架构所需要实现的函数
│ ├── los_arch.h # 定义芯片架构初始化所需要的函数
│ ├── los_atomic.h # 定义芯片架构所需要实现的原子操作函数
│ ├── los_context.h # 定义芯片架构所需要实现的任务上下文相关函数
│ ├── los_interrupt.h # 定义芯片架构所需要实现的中断和异常相关的函数
│ └── los_timer.h # 定义芯片架构所需要实现的系统时钟相关的函数
├── risc-v # risc-v系列
│ ├── nuclei
│ └── riscv32
└── xtensa # xtensa系列
└── lx6
移植芯片厂商SDK
编译框架搭建完成后,需要将芯片厂商的SDK加入OpenHarmony编译框架,从而可以编译出带SDK的烧录文件(此时编译出的是不带系统的裸机工程),以便OpenHarmony可以调用SDK中的接口。通过以下步骤将厂商SDK加入OpenHarmony编译框架中:
-
将芯片厂商sdk置于device目录下合适的位置,SDK的编译脚本/镜像打包脚本整合进编译框架中。 参考编译脚本:“device/MyDeviceCompany/MyBoard/BUILD.gn”
import("//build/lite/config/component/lite_component.gni") executable("OHOS_Image.elf") { # 生成可执行程序 libs = [ "xxx/xxx/libxxx.a", # 链接厂商闭源静态库方法一 ] asmflags = [ # 汇编编译参数 "", ] ldflags = [ "-T./xxx/xxx/xxx.ld", # 链接脚本文件 "-Lxxx/xxx/", # 指定厂商静态库路径 "-lxxx", # 链接厂商闭源静态库方法二 "-Wl,--whole-archive", "-lmodule_xxx", "-Wl,--no-whole-archive", ] deps = [ "//build/lite:ohos", # 依赖OpenHarmony静态库编译完成,链接OpenHarmony编译出来的静态库 ":sdk", # 依赖厂商源码静态库编译完成,链接厂商源码生成的静态库 ] } copy("prebuilt") { # 准备镜像生成工具等,一般把镜像生成工具拷贝到out目录 sources = [ ] # 复制的源文件 outputs = [ ] # 复制的目标文件 } static_library("sdk") { sources = [ ] # 添加厂商源码编译成静态库 include_dirs = [ ] # 厂商源码包含头文件路径 } build_ext_component("ima