1# 移植内核 2 3 4## 移植芯片架构 5 6芯片架构的移植是内核移植的基础,在OpenHarmony中芯片架构移植是可选过程,如果当前OpenHarmony已经支持对应芯片架构则不需要移植操作,在“liteos_m/arch”目录下可看到当前已经支持的架构,如表1: 7 8 **表1** OpenHarmony已支持的架构 9 10| **系列** | **型号** | 11| -------- | -------- | 12| arm | arm9<br/>cortex-m3<br/>cortex-m4<br/>cortex-m7<br/>cortex-m33 | 13| csky | v2 | 14| risc-v | nuclei<br/>riscv32 | 15| xtensa | lx6 | 16 17 18如果当前OpenHarmony尚未支持对应芯片架构,则需要芯片厂商自行适配,arch/include目录包含了通用的芯片架构适配所需要实现的函数。部分芯片架构代码由汇编实现,而汇编代码会因编译器的不同而不同,因此在具体的芯片架构下,还包含使用不同编译器(iar、keil、gcc等)编译的架构代码。 19 20 21 22``` 23kernel/liteos_m/arch # 不同版本路径有差异 24├── arm # arm系列 25│ ├── arm9 26│ ├── cortex-m3 27│ ├── cortex-m33 28│ │ ├── gcc # 使用gcc编译器编译的架构代码 29│ │ └── iar # 使用iar编译器编译的架构代码 30│ ├── cortex-m4 31│ ├── cortex-m7 32├── csky # csky系列 33├── include # 包含通用的芯片架构所需要实现的函数 34│ ├── los_arch.h # 定义芯片架构初始化所需要的函数 35│ ├── los_atomic.h # 定义芯片架构所需要实现的原子操作函数 36│ ├── los_context.h # 定义芯片架构所需要实现的任务上下文相关函数 37│ ├── los_interrupt.h # 定义芯片架构所需要实现的中断和异常相关的函数 38│ └── los_timer.h # 定义芯片架构所需要实现的系统时钟相关的函数 39├── risc-v # risc-v系列 40│ ├── nuclei 41│ └── riscv32 42└── xtensa # xtensa系列 43 └── lx6 44``` 45 46 47## 移植芯片厂商SDK 48 49编译框架搭建完成后,需要将芯片厂商的SDK加入OpenHarmony编译框架,从而可以编译出带SDK的烧录文件(此时编译出的是不带系统的裸机工程),以便OpenHarmony可以调用SDK中的接口。通过以下步骤将厂商SDK加入OpenHarmony编译框架中: 50 511. 将芯片厂商sdk置于device目录下合适的位置,SDK的编译脚本/镜像打包脚本整合进编译框架中。 52 参考编译脚本:“device/MyDeviceCompany/MyBoard/BUILD.gn” 53 54 55 ``` 56 import("//build/lite/config/component/lite_component.gni") 57 58 executable("OHOS_Image.elf") { # 生成可执行程序 59 libs = [ 60 "xxx/xxx/libxxx.a", # 链接厂商闭源静态库方法一 61 ] 62 asmflags = [ # 汇编编译参数 63 "", 64 ] 65 ldflags = [ 66 "-T./xxx/xxx/xxx.ld", # 链接脚本文件 67 "-Lxxx/xxx/", # 指定厂商静态库路径 68 "-lxxx", # 链接厂商闭源静态库方法二 69 "-Wl,--whole-archive", 70 "-lmodule_xxx", 71 "-Wl,--no-whole-archive", 72 ] 73 deps = [ 74 "//build/lite:ohos", # 依赖OpenHarmony静态库编译完成,链接OpenHarmony编译出来的静态库 75 ":sdk", # 依赖厂商源码静态库编译完成,链接厂商源码生成的静态库 76 ] 77 } 78 79 copy("prebuilt") { # 准备镜像生成工具等,一般把镜像生成工具拷贝到out目录 80 sources = [ ] # 复制的源文件 81 outputs = [ ] # 复制的目标文件 82 } 83 static_library("sdk") { 84 sources = [ ] # 添加厂商源码编译成静态库 85 include_dirs = [ ] # 厂商源码包含头文件路径 86 } 87 build_ext_component("image") { # 调用shell命令,生成可烧写镜像文件 88 exec_path = rebase_path(root_out_dir) #指定shell命令执行目录 89 objcopy = "arm-none-eabi-objcopy" 90 objdump = "arm-none-eabi-objdump" 91 command = "$objcopy -O binary OHOS_Image.elf OHOS_Image.bin" 92 command += " && sh -c '$objdump -t OHOS_Image.elf | sort > OHOS_Image.sym.sorted'" 93 command += " && sh -c '$objdump -d OHOS_Image.elf > OHOS_Image.asm'" 94 deps = [ 95 ":prebuilt", # 无需准备镜像生成工具等可以删除此依赖 96 ":OHOS_Image.elf", # 依赖elf文件的生成 97 ] 98 } 99 group("MyBoard") { # MyBoard与当前路径名称一致 100 } 101 ``` 102 103 **图1** 目标的依赖执行顺序 104 ![zh-cn_image_0000001378481233](figures/zh-cn_image_0000001378481233.png) 105 1061. 自定义芯片厂“target_config.h”文件。 107 厂商应在“device/MyDeviceCompany/MyBoard”下合适位置创建内核配置文件“target_config.h”,并根据芯片的硬件资源修改参数(具体参数介绍详见表2target_config.h文件主要配置项)。 108 109 参考文件路径:“device/hisilicon/hispark_pegasus/sdk_liteos/platform/os/Huawei_LiteOS/targets/hi3861v100/include/target_config.h” 110 111 > ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** 112 > 1. 若已有的配置项不能满足需求,可查看“kernel/liteos_m/kernel/include/los_config.h”,其为liteos_m内核的全量配置文件。 113 > 114 > 2. “target_config.h”文件中出现的配置将会覆盖“los_config.h”中的配置。 115 116 **表2** target_config.h文件主要配置项 117 118 | 配置项 | 说明 | 参考值 | 119 | -------- | -------- | -------- | 120 | OS_SYS_CLOCK | 系统时钟。 | 40000000UL | 121 | LOSCFG_BASE_CORE_TICK_PER_SECOND | 操作系统节拍的时钟周期。 | 100UL | 122 | LOSCFG_BASE_CORE_TICK_HW_TIME | 定时器裁剪的外部配置项。 | YES | 123 | LOSCFG_PLATFORM_HWI | 是否采用接管中断的方式。 | YES | 124 | LOSCFG_BASE_CORE_TSK_LIMIT | 支持的最大任务个数(除去空闲任务)。 | 32 | 125 | LOSCFG_BASE_CORE_TSK_IDLE_STACK_SIZE | 空闲任务的堆栈大小。 | 0x180UL | 126 | LOSCFG_BASE_CORE_TSK_DEFAULT_STACK_SIZE | 指定默认的任务栈大小,任务栈的大小按 8 字节大小对齐。 | 0x1000UL | 127 | LOSCFG_BASE_CORE_TSK_MIN_STACK_SIZE | 表示任务最小需要的堆栈大小。 | ALIGN(0x180, 4) | 128 | LOSCFG_BASE_CORE_TIMESLICE_TIMEOUT | 具有相同优先级任务的最长执行时间。 | 2 | 129 | LOSCFG_BASE_IPC_SEM_LIMIT | 最大支持信号量的个数。 | 100 | 130 | LOSCFG_BASE_IPC_MUX_LIMIT | 最大支持互斥量的个数。 | 64 | 131 | LOSCFG_BASE_IPC_QUEUE_LIMIT | 最大支持消息队列量的个数。 | 64 | 132 | LOSCFG_BASE_CORE_SWTMR_LIMIT | 支持的最大软件定时器数量,而不是可用的软件定时器数量。 | 80 | 133 | LOSCFG_BASE_MEM_NODE_SIZE_CHECK | 配置内存节点大小检查。 | NO | 134 | LOSCFG_PLATFORM_EXC | 异常模块配置项。 | YES | 135 | LOSCFG_USE_SYSTEM_DEFINED_INTERRUPT | 是否使用OS默认的中断。 | NO | 136 1371. 修改内核中断。 138 内核提供了两种中断修改方式: 139 140 1. 使用厂商默认中断。 141 142 将“target_config.h”中的宏"LOSCFG_USE_SYSTEM_DEFINED_INTERRUPT"置为NO (0),但需要在xxx.s启动文件中作以下修改: 143 144 - PendSV_Handler:厂商sdk自带中断入口函数,需要替换为OpenHarmony的接口HalPendSV; 145 - SysTick_Handler:厂商sdk自带时钟中断入口函数,需要替换为OpenHarmony的接口OsTickHandler。 146 147 1. 系统初始化时重定向中断。 148 149 将“target_config.h”中的宏"LOSCFG_USE_SYSTEM_DEFINED_INTERRUPT"和"LOSCFG_PLATFORM_HWI"置为YES (1)。 150 151 > ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** 152 > 重定向后的中断向量表g_hwiForm需要根据arch手册要求进行字节对齐,通常0x200字节对齐。 153 154 155## 添加内核子系统 156 157添加完内核子系统后,可以编译出带有系统的工程。通过以下步骤添加内核子系统: 158 1591. 在“config.json”中添加内核子系统。 160 路径:“vendor/MyVendorCompany/MyProduct/config.json” 161 162 修改如下: 163 164 ``` 165 { 166 "subsystem": "kernel", # 添加内核子系统 167 "components": [ 168 { 169 "component": "liteos_m", "features":[""] 170 } 171 ] 172 }, 173 ``` 174 1752. 开启/关闭内核特性。 176 轻量级系统的内核提供了一些特性,此步骤将指导如何查看、开启/关闭这些特性。 177 178 内核特性:liteos_m提供了包括文件系统、backtrace在内的一系列内核特性开关。 179 180 路径:“kernel/liteos_m/BUILD.gn” 181 182 183 ``` 184 declare_args() { 185 enable_ohos_kernel_liteos_m_cppsupport = true # cpp支持 186 enable_ohos_kernel_liteos_m_cpup = true # CPU占用率支持 187 enable_ohos_kernel_liteos_m_exchook = true # 异常处理支持 188 enable_ohos_kernel_liteos_m_kal = true # kal接口支持 189 enable_ohos_kernel_liteos_m_fs = true # 文件系统支持 190 enable_ohos_kernel_liteos_m_backtrace = true # backtrace支持 191 } 192 group("kernel") { 193 deps = [ 194 "components/bounds_checking_function:sec", 195 "kernel:kernel", 196 "utils:utils", 197 ] 198 if (enable_ohos_kernel_liteos_m_cppsupport == true) { 199 deps += [ "components/cppsupport:cppsupport" ] # 如果内核特性true,则会加入相应的代码进行编译 200 } 201 …… 202 if (enable_ohos_kernel_liteos_m_kal == true) { 203 deps += [ "kal:kal" ] 204 } 205 } 206 ``` 207 208 特性:可以选择cmsis接口或者posix接口支持。 209 210 路径:“kernel/liteos_m/kal/BUILD.gn” 211 212 213 ``` 214 declare_args() { 215 enable_ohos_kernel_liteos_m_cmsis = true # cmsis支持 216 enable_ohos_kernel_liteos_m_posix = true # posix支持 217 } 218 static_library("kal") { 219 sources = [ "kal.c" ] 220 if (enable_ohos_kernel_liteos_m_cmsis == true) { 221 deps += [ "cmsis/" ] # 如果cmsis enable,加入cmsis目录编译 222 } 223 if (enable_ohos_kernel_liteos_m_posix == true) { 224 deps += [ "posix/" ] # 如果posix enable,加入posix目录编译 225 } 226 } 227 ``` 228 229 特性:可以选择fatfs支持。 230 231 路径:“kernel/liteos_m/components/fs/BUILD.gn” 232 233 234 ``` 235 declare_args() { 236 enable_ohos_kernel_liteos_m_fatfs = true # fatfs支持 237 } 238 group("fs") { 239 deps = [] 240 if (enable_ohos_kernel_liteos_m_fatfs == true) { 241 deps += [ "fatfs:fatfs" ] 242 } 243 } 244 ``` 245 246 > ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** 247 > 内核特性开关可以在具体产品模组中配置。例如关闭fs和cppsupport特性 248 > 249 > “vendor/MyVendorCompany/MyProduct/config.json” 250 > 251 > 252 > ``` 253 > "subsystem": "kernel", 254 > "components": [ 255 > { 256 > "component": "liteos_m", 257 > "features":["enable_ohos_kernel_liteos_m_fs = false", 258 > "enable_ohos_kernel_liteos_m_cppsupport = false"] 259 > } 260 > ] 261 > } 262 > ``` 263