【入门到实战】OpenHarmony南向设备轻量系统芯片移植指南:移植内核

往期鸿蒙5.0全套实战文章必看:(文中附带全栈鸿蒙5.0学习资料)


移植内核

移植芯片架构

芯片架构的移植是内核移植的基础,在OpenHarmony中芯片架构移植是可选过程,如果当前OpenHarmony已经支持对应芯片架构则不需要移植操作,在“liteos_m/arch”目录下可看到当前已经支持的架构,如表1:

表1 OpenHarmony已支持的架构

系列型号
armarm9
cortex-m3
cortex-m4
cortex-m7
cortex-m33
cskyv2
risc-vnuclei
riscv32
xtensalx6

如果当前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 目标的依赖执行顺序

    zh-cn_image_0000001378481233

  2. 自定义芯片厂“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”

    icon-note.gif

     说明:

    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
  3. 修改内核中断。

    内核提供了两种中断修改方式:

    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)。

      icon-note.gif

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

添加内核子系统

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

  1. 在“config.json”中添加内核子系统。

    路径:“vendor/MyVendorCompany/MyProduct/config.json”

    修改如下:

    {
      "subsystem": "kernel",          # 添加内核子系统
      "components": [
        { 
          "component": "liteos_m", "features":[""] 
        }
      ]
    },
    
  2. 开启/关闭内核特性。

    轻量级系统的内核提供了一些特性,此步骤将指导如何查看、开启/关闭这些特性。

    内核特性: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" ] 
      }
    }
    
    

    icon-note.gif

     说明: 内核特性开关可以在具体产品模组中配置。例如关闭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"] 
      }
    ]
    }

<think>好的,我现在要处理用户关于鸿蒙南向开发的资料和教程的查询。首先,我需要回顾用户提供的引用内容,看看有哪些相关的信息可以整合。用户引用了五篇资料,其中提到了鸿蒙南向开发的知识点汇总、应用开发系统开发的前景对比、嵌入式开发的适合性、岗位需求以及具体的移植指南和上传下载教程。此外,用户还提到了器件驱动移植设备开发手册、WLAN开发指南等内容。 接下来,我需要确定用户的主要需求是什么。用户明确表示想寻找南向开发的相关资料或教程,特别是“保姆级攻略”。因此,我需要整理出系统性的学习路径,涵盖基础知识、环境搭建、驱动开发、子系统适配、实战案例和进阶资源等方面。 根据引用内容,设备开发手册(引用2)和移植指南(引用4)是核心资源,可以作为主要推荐。另外,WLAN开发(引用3)和上传下载教程(引用5)可以作为具体案例。知识点汇总(引用1)和面试经历(引用1中的一条)也能帮助用户了解整体框架和实际应用。 接下来,我需要将这些资源按照逻辑顺序组织,确保用户能够循序渐进地学习。首先应该推荐系统性的手册和指南,然后涉及环境搭建和驱动开发,接着是子系统的适配和实战案例,最后提供社区和持续学习的资源。同时,要注意引用正确的来源,比如引用2对应设备开发手册,引用4对应移植指南等。 还需要考虑用户可能的疑问,比如南向开发的学习路径、需要哪些基础知识、如何实际操作等。因此,在回答中应该分点列出学习路线,每个部分都提供相应的教程链接或文档指引,并标注引用来源。此外,相关问题部分需要涵盖用户可能进一步想知道的内容,比如前景、适合性、岗位需求等,这些在引用中都有涉及,可以引导用户深入阅读。 最后,要确保回答结构清晰,符合用户要求的格式,使用中文,正确应用LaTeX格式(虽然本问题中可能涉及较少数学公式,但需注意行内和独立公式的格式),并在引用处正确添加标识。同时,生成的相关问题要覆盖用户可能感兴趣的其他方面,帮助用户全面了解南向开发的各个方面。</think>### 鸿蒙南向开发学习路线与资料整理 #### 一、系统学习路径 1. **基础入门** - 推荐阅读《OpenHarmony设备开发学习手册》[^2],涵盖环境搭建、内核移植驱动开发等核心内容。 - 学习设备开发框架,例如器件驱动移植方法[^1]和子系统裁剪适配指南[^4]。 2. **环境搭建** - 使用鸿蒙南向开发专用环境(如Hi3861/Hi3516开发板),参考官方文档配置编译工具链。 - 示例代码库:https://gitcode.com/HarmonyOS_MN/733GH 3. **驱动开发** - WLAN驱动开发:通过`DRIVERS_WLAN_XXX`开关控制内核功能,结合`//device/MySoCVendor/peripheral/build/standard/`中的Makefile实现[^3]。 - 其他外设驱动(GPIO、I2C等)适配方法可参考移植指南。 4. **子系统适配** - 鸿蒙系统按“系统 > 子系统 > 部件”层级设计,需根据需求裁剪非必要部件。例如文件系统、网络协议栈的适配方法。 5. **实战案例** - 上传下载功能实现:使用`@ohos.request`接口开发任务管理,结合HFS服务器完成文件传输[^5]。 - 轻量系统芯片移植完整流程示例。 --- #### 二、保姆级教程推荐 | 类型 | 资源链接/文档 | 重点内容 | |-----------|--------------------------------------------------------------------------|-------------------------------| | **系统性手册** | [OpenHarmony设备开发学习手册](https://gitcode.com/HarmonyOS_MN/733GH/overview) | 环境配置、驱动开发内核移植 | | **移植指南** | [轻量系统芯片移植指南](引用4) | 子系统裁剪、部件适配、编译调试 | | **API实战** | [上传下载功能开发教程](引用5) | 网络任务管理、接口调用实践 | | **驱动开发** | [WLAN开发手册](引用3) | 内核配置、Makefile解析、外设驱动调试 | --- #### 三、学习建议 1. **先掌握嵌入式基础**:C语言、RTOS原理、硬件通信协议(如UART/SPI)。 2. **结合开发板实操**:通过Hi3861/Hi3516等官方开发板验证驱动和子系统功能。 3. **关注社区更新**:鸿蒙南向开发技术迭代快,需定期查阅[持续更新文档](引用1)。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值