OpenHarmony开发——移植内核

移植芯片架构

芯片架构的移植是内核移植的基础,在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编译框架中:

  1. 将芯片厂商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("image") {    # 调用shell命令,生成可烧写镜像文件                             
     exec_path = rebase_path(root_out_dir)   #指定shell命令执行目录
     objcopy = "arm-none-eabi-objcopy"
     objdump = "arm-none-eabi-objdump"
     command = "$objcopy -O binary OHOS_Image.elf OHOS_Image.bin" 
     command += " && sh -c '$objdump -t OHOS_Image.elf | sort > OHOS_Image.sym.sorted'" 
     command += " && sh -c '$objdump -d OHOS_Image.elf > OHOS_Image.asm'"                  
     deps = [
       ":prebuilt",                  # 无需准备镜像生成工具等可以删除此依赖
       ":OHOS_Image.elf",            # 依赖elf文件的生成
     ]
   }
   group("MyBoard") {                # MyBoard与当前路径名称一致
   }

图1 目标的依赖执行顺序

  1. 自定义芯片厂“target_config.h”文件。
    厂商应在“device/MyDeviceCompany/MyBoard”下合适位置创建内核配置文件“target_config.h”,并根据芯片的硬件资源修改参数(具体参数介绍详见表2target_config.h文件主要配置项)。

参考文件路径:“device/hisilicon/hispark_pegasus/sdk_liteos/platform/os/Huawei_LiteOS/targets/hi3861v100/include/target_config.h”

说明:

  1. 若已有的配置项不能满足需求,可查看“kernel/liteos_m/kernel/include/los_config.h”,其为liteos_m内核的全量配置文件。

  2. “target_config.h”文件中出现的配置将会覆盖“los_config.h”中的配置。

表2 target_config.h文件主要配置项

配置项 说明 参考值
OS_SYS_CLOCK 系统时钟。 40000000UL
LOSCFG_BASE_CORE_TICK_PER_SECOND 操作系统节拍的时钟周期。 100UL
LOSCFG_BASE_CORE_TICK_HW_TIME 定时器裁剪的外部配置项。 YES
LOSCFG_PLATFORM_HWI 是否采用接管中断的方式。 YES
LOSCFG_BASE_CORE_TSK_LIMIT 支持的最大任务个数(除去空闲任务)。 32
LOSCFG_BASE_CORE_TSK_IDLE_STACK_SIZE 空闲任务的堆栈大小。 0x180UL
LOSCFG_BASE_CORE_TSK_DEFAULT_STACK_SIZE 指定默认的任务栈大小,任务栈的大小按 8 字节大小对齐。 0x1000UL
LOSCFG_BASE_CORE_TSK_MIN_STACK_SIZE 表示任务最小需要的堆栈大小。 ALIGN(0x180, 4)
LOSCFG_BASE_CORE_TIMESLICE_TIMEOUT 具有相同优先级任务的最长执行时间。 2
LOSCFG_BASE_IPC_SEM_LIMIT 最大支持信号量的个数。 100
LOSCFG_BASE_IPC_MUX_LIMIT 最大支持互斥量的个数。 64
LOSCFG_BASE_IPC_QUEUE_LIMIT 最大支持消息队列量的个数。 64
LOSCFG_BASE_CORE_SWTMR_LIMIT 支持的最大软件定时器数量,而不是可用的软件定时器数量。 80
LOSCFG_BASE_MEM_NODE_SIZE_CHECK 配置内存节点大小检查。 NO
LOSCFG_PLATFORM_EXC 异常模块配置项。 YES
LOSCFG_USE_SYSTEM_DEFINED_INTERRUPT 是否使用OS默认的中断。 NO
  1. 修改内核中断。
    内核提供了两种中断修改方式:

    1. 使用厂商默认中断。

    将“target_config.h”中的宏"LOSCFG_USE_SYSTEM_DEFINED_INTERRUPT"置为NO (0),但需要在xxx.s启动文件中作以下修改:

    • PendSV_Handler:厂商sdk自带中断入口函数,需要替换为OpenHarmony的接口HalPendSV;
    • SysTick_Handler:厂商sdk自带时钟中断入口函数,需要替换为OpenHarmony的接口OsTickHandler。
  2. 系统初始化时重定向中断。

    将“target_config.h”中的宏"LOSCFG_USE_SYSTEM_DEFINED_INTERRUPT"和"LOSCFG_PLATFORM_HWI"置为YES (1)。

    说明:
    重定向后的中断向量表g_hwiForm需要根据arch手册要求进行字节对齐,通常0x200字节对齐。

添加内核子系统

添加完内核子系统后,可以编译出带有系统的工程。通过以下步骤添加内核子系统:

  1. 在“config.json”中添加内核子系统。
    路径:“vendor/MyVendorCompany/MyProduct/config.json”

    修改如下:

   {
     "subsystem": "kernel",          # 添加内核子系统
     "components": [
       { 
         "component": "liteos_m", "features":[""] 
       }
     ]
   },
  1. 开启/关闭内核特性。
    轻量级系统的内核提供了一些特性,此步骤将指导如何查看、开启/关闭这些特性。

内核特性:liteos_m提供了包括文件系统、backtrace在内的一系列内核特性开关。

路径:“kernel/liteos_m/BUILD.gn”

   declare_args() {
     enable_ohos_kernel_liteos_m_cppsupport = true        # cpp支持
     enable_ohos_kernel_liteos_m_cpup = true              # CPU占用率支持
     enable_ohos_kernel_liteos_m_exchook = true           # 异常处理支持
     enable_ohos_kernel_liteos_m_kal = true               # kal接口支持
     enable_ohos_kernel_liteos_m_fs = true                # 文件系统支持
     enable_ohos_kernel_liteos_m_backtrace = true         # backtrace支持
   }
   group("kernel") {
   deps = [
       "components/bounds_checking_function:sec",
       "kernel:kernel",
       "utils:utils",
     ]
     if (enable_ohos_kernel_liteos_m_cppsupport == true) {
       deps += [ "components/cppsupport:cppsupport" ]     # 如果内核特性true,则会加入相应的代码进行编译
     }
     ……
     if (enable_ohos_kernel_liteos_m_kal == true) {
       deps += [ "kal:kal" ]
     }
   }

特性:可以选择cmsis接口或者posix接口支持。

路径:“kernel/liteos_m/kal/BUILD.gn”

   declare_args() {
     enable_ohos_kernel_liteos_m_cmsis = true  # cmsis支持
     enable_ohos_kernel_liteos_m_posix = true  # posix支持
   }
   static_library("kal") {
     sources = [ "kal.c" ]
     if (enable_ohos_kernel_liteos_m_cmsis == true) {
       deps += [ "cmsis/" ]                    # 如果cmsis enable,加入cmsis目录编译
     }
     if (enable_ohos_kernel_liteos_m_posix == true) {
       deps += [ "posix/" ]                    # 如果posix enable,加入posix目录编译
     }
   }

特性:可以选择fatfs支持。

路径:“kernel/liteos_m/components/fs/BUILD.gn”

   declare_args() {
     enable_ohos_kernel_liteos_m_fatfs = true   # fatfs支持
   }
   group("fs") {
     deps = []
     if (enable_ohos_kernel_liteos_m_fatfs == true) {
       deps += [ "fatfs:fatfs" ] 
     }
   }

说明:
内核特性开关可以在具体产品模组中配置。例如关闭fs和cppsupport特性

“vendor/MyVendorCompany/MyProduct/config.json”

   > "subsystem": "kernel",
   > "components": [
   >  { 
   >     "component": "liteos_m", 
   >     "features":["enable_ohos_kernel_liteos_m_fs = false",
   >     "enable_ohos_kernel_liteos_m_cppsupport = false"] 
   >   }
   > ]
   > }

写在最后

如果你觉得这篇内容对你还蛮有帮助,我想邀请你帮我三个小忙

  • 点赞,转发,有你们的 『点赞和评论』,才是我创造的动力。
  • 关注小编,同时可以期待后续文章ing🚀,不定期分享原创知识。
  • 想要获取更多完整鸿蒙最新学习知识点,请移步前往小编:https://gitee.com/MNxiaona/733GH/blob/master/jianshu
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,188评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,464评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,562评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,893评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,917评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,708评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,430评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,342评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,801评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,976评论 3 337
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,115评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,804评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,458评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,008评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,135评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,365评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,055评论 2 355

推荐阅读更多精彩内容