openharmony标准系统移植之添加产品编译

本文详细介绍了在OpenHarmony中添加新产品编译的完整过程,包括源码解压、环境配置、修改配置文件、解决编译错误等步骤,通过实例展示了如何针对特定硬件平台Hi3516DV300进行移植工作。

首先我这里下载的是源码文件包的形式,如下图,我们使用 命令 tar xvf code-v3.1-Release.tar.gz进行解压文件。解压完成后如下图,多了code-v3.1-Release文件夹,
在这里插入图片描述
然后需要构建我们自己的git配置,首先删除.repo/文件夹,然后修改drivers/adapter/.gitignore,这里把linux全屏蔽了,不然后期修改了文件,无法找到对应的改动。
首先安装下ruby工具,执行如下命令即可 sudo apt-get install ruby,不装可能会报错

FAILED: gen/isa/isa.yaml
[OHOS ERROR] /usr/bin/env ../../ark/runtime_core/isa/combine.rb -d ../../ark/runtime_core/isa/isa.yaml,../../ark/js_runtime/ecmascript/ecma_isa.yaml -o gen/isa/isa.yaml
[OHOS ERROR] /usr/bin/env: ‘ruby’: No such file or directory

具体报错信息如下。

[OHOS INFO] [277/33818] ACTION //ark/runtime_core/isa:isa_combine(//build/toolchain/ohos:ohos_clang_arm)
[OHOS INFO] [278/33818] STAMP obj/base/miscservices/screenlock/etc/init/screenlockservice.cfg__notice.stamp
[OHOS INFO] [279/33818] STAMP obj/applications/standard/hap/calc_demo_hap.stamp
[OHOS INFO] [280/33818] ACTION //base/account/os_account/interfaces/kits/napi/osaccount:osaccount__notice(//build/toolchain/ohos:ohos_clang_arm)
[OHOS INFO] [281/33818] ACTION //applications/standard/hap:ecg_demo_hap__notice(//build/toolchain/ohos:ohos_clang_arm)
[OHOS INFO] [282/33818] ACTION //applications/standard/hap:filepicker_hap__notice(//build/toolchain/ohos:ohos_clang_arm)
[OHOS INFO] [283/33818] ACTION //applications/standard/hap:flashlight_demo_hap__notice(//build/toolchain/ohos:ohos_clang_arm)
[OHOS INFO] [284/33818] ACTION //applications/standard/hap:airquality_demo_hap__notice(//build/toolchain/ohos:ohos_clang_arm)
[OHOS INFO] [285/33818] ACTION //base/telephony/state_registry/sa_profile:state_registry_sa_profile(//build/toolchain/ohos:ohos_clang_arm)
[OHOS INFO] [286/33818] ACTION //applications/standard/hap:dynamic.wav__notice(//build/toolchain/ohos:ohos_clang_arm)
[OHOS INFO] [287/33818] ACTION //ark/js_runtime:libark_jsruntime__notice(//build/toolchain/ohos:ohos_clang_arm)
[OHOS INFO] [288/33818] ACTION //base/miscservices/screenlock/services:screenlock_server__notice(//build/toolchain/ohos:ohos_clang_arm)
[OHOS INFO] [289/33818] ACTION //ark/js_runtime/ecmascript/js_vm:ark_js_vm__notice(//build/toolchain/ohos:ohos_clang_arm)
[OHOS INFO] [290/33818] ACTION //base/miscservices/screenlock/interfaces/kits/napi:screenlock__notice(//build/toolchain/ohos:ohos_clang_arm)
[OHOS INFO] [291/33818] ACTION //developtools/profiler/device/plugins/sample_plugin:sampleplugin__notice(//build/toolchain/ohos:ohos_clang_arm)
[OHOS INFO] [292/33818] ACTION //ark/runtime_core/dprof:libdprof__notice(//build/toolchain/ohos:ohos_clang_arm)
[OHOS INFO] [293/33818] ACTION //base/powermgr/thermal_manager/application/init:thermal_protector.cfg__notice(//build/toolchain/ohos:ohos_clang_arm)
[OHOS INFO] [294/33818] ACTION //ark/js_runtime/ecmascript/tooling:libark_ecma_debugger__notice(//build/toolchain/ohos:ohos_clang_arm)
[OHOS ERROR] [277/33818] ACTION //ark/runtime_core/isa:isa_combine(//build/toolchain/ohos:ohos_clang_arm)
[OHOS ERROR] FAILED: gen/isa/isa.yaml
[OHOS ERROR] /usr/bin/env ../../ark/runtime_core/isa/combine.rb -d ../../ark/runtime_core/isa/isa.yaml,../../ark/js_runtime/ecmascript/ecma_isa.yaml -o gen/isa/isa.yaml
[OHOS ERROR] /usr/bin/env: ‘ruby’: No such file or directory
[OHOS ERROR] Please check build log in /home/d1/openHarmony/source/code-v3.1-Release/OpenHarmony/out/hi3516dv300/build.log
=====build  error=====

然后先编译下官方已经有的产品,确保环境没有问题。 可以使用sudo apt-get install ccache命令安装 ccache,这样编译会快一点。执行如下命令即可 ./build.sh --product-name Hi3516DV300,等待编译完成,我这边等待了有几十来分钟才编译好吧,编译结果如下,说明我们的环境已经没有问题了,可以开始进行我们的移植 工作了。

在这里插入图片描述
首先在源码目录productdefine/common/products下,增加我们产品定义的json文件,我这里直接复制使用Hi3516DV300.json作为我们的模板修改下使用。使用命令cp Hi3516DV300.json zxyNandst.json即可得到我们的产品定义,打开文件,修改如下

{
   
   
  "product_name": "Hi3516DV300", //这里修改为我们对应的文件名, zxyNandst
  "product_company": "hisilicon", //修改为对应的产品,xingyunnand
  "product_device": "hi3516dv300", // 使用 xingyunelec
  "version": "2.0",
  "type": "standard",
  "product_build_path": "device/board/hisilicon/hispark_taurus/linux", //这里使用device/xingyunelec/xingyunnand/sdk_linux

所以修改后我们的这部分内容如下

{
   
   
  "product_name": "zxyNandst",
  "product_company": "xingyunelec",
  "product_device": "xingyunnand",
  "version": "2.0",
  "type": "standard",
  "product_build_path": "device/xingyunelec/xingyunnand/sdk_linux",
  "parts":{
   
   

然后把图片中这行删除,这个是与海思相关的文件,我们不需要,所以删除即可。
在这里插入图片描述
然后我们使用如下命令尝试编译下 ./build.sh --product-name zxyNandst –ccache,很明显报错

++++++++++++++++++++++++++++++++++++++++
2022-04-24 10:01:06
--product-name zxyNandst –ccache
[OHOS ERROR] /home/d1/openHarmony/source/code-v3.1-Release/OpenHarmony/productdefine/common/device/xingyunnand.json not found
=====build  error=====

我们还没有定义我们soc的相关信息,所以我们需要添加上去,同样的使用cp hi3516dv300.json xingyunnand.json得到我们的soc相关配置信息文件

{
   
   
    "device_name": "hi3516dv300", //同文件名,xingyunnand.json
    "device_company": "hisilicon", //device目录下的xingyunelec
    "target_os": "ohos",
    "target_cpu": "arm",
    "kernel_version": "",
    "device_build_path": "device/board/hisilicon/hispark_taurus/linux", //修改成自己对应即可
    "enable_ramdisk": true
}

修改成我们对应的相关配置信息,

{
   
   
    "device_name": "xingyunnand",
    "device_company": "xingyunelec",
    "target_os": "ohos",
    "target_cpu": "arm",
    "kernel_version": "",
    "device_build_path": "device/xingyunelec/xingyunnand/sdk_linux",
    "enable_ramdisk": true
}

然后使用 ./build.sh --product-name zxyNandst –ccache 再次编译试试,还是报错了,报错信息如下。

ERROR at //drivers/peripheral/audio/audio.gni:11:5: Unable to load "/home/d1/openHarmony/source/code-v3.1-Release/OpenHarmony/vendor/xingyunelec/zxyNandst/hals/audio/product.gni".
[OHOS INFO]     import("//vendor/${product_company}/${product_name}/hals/audio/product.gni")
[OHOS INFO]     ^--------------------------------------------------------------------------
[OHOS INFO] See //drivers/peripheral/bluetooth/audio/BUILD.gn:16:1: whence it was imported.
<think>我们正在讨论的是OpenHarmony的kernel_liteos_a(适用于资源较丰富的设备,如手机、智慧屏等)的编译移植。根据之前的组织架构,我们需要关注硬件抽象层(arch)、内核基础层(Kernel)等。同时,用户提供的引用中提到了LiteOS-M的移植(引用[3][4]),但LiteOS-A的移植会有所不同,因为LiteOS-A支持MMU和进程,而LiteOS-M通常用于资源受限的设备。 编译移植OpenHarmony的kernel_liteos_a主要分为两个部分: 1. 编译:构建内核镜像。 2. 移植:将内核适配到新的硬件平台。 下面我们分别介绍。 ### 一、编译kernel_liteos_a OpenHarmony使用gn和ninja作为构建工具。编译内核通常需要以下步骤: 1. **设置环境变量**:指定目标平台和工具链。 2. **配置内核选项**:通过menuconfig或直接修改配置文件。 3. **编译**:使用ninja进行构建。 具体步骤: 1. 进入OpenHarmony源码根目录,执行环境初始化脚本: ```bash source build/envsetup.sh ``` 2. 选择目标产品(以hi3516dv300为例): ```bash lunch hi3516dv300 ``` 3. 进入内核目录,配置内核(可选): ```bash cd kernel/liteos_a make menuconfig # 如果支持,否则需要手动修改配置文件 ``` 注意:LiteOS-A的配置通常通过`kernel/liteos_a/config`目录下的配置文件进行。例如,`hi3516dv300_liteos_a/`目录下的`config`文件。 4. 编译整个系统(包括内核): ```bash hb build -f # 全量编译 ``` 或者单独编译内核(需要先配置好产品): ```bash cd kernel/liteos_a ./build.sh PRODUCT=hi3516dv300 ``` 编译完成后,内核镜像位于`out/产品名称/kernel`目录下。 ### 二、移植kernel_liteos_a到新硬件平台 移植工作主要围绕硬件抽象层(arch)展开。以下是关键步骤: #### 1. **创建新硬件平台的目录结构** 在`kernel/liteos_a/arch`目录下,复制一个参考架构(如arm)作为模板,命名为新架构名称(例如`cortex-a53`)。然后修改目录内的文件以适应新平台。 目录结构示例: ``` arch/ └── new_arch_name/ # 新架构名称 ├── include/ # 头文件 │ ├── los_arch_atomic.h │ ├── los_arch_context.h │ └── ... ├── src/ # 源文件 │ ├── los_context.S # 上下文切换(汇编) │ ├── los_interrupt.c # 中断处理 │ ├── los_timer.c # 定时器 │ └── ... └── Makefile # 构建文件 ``` #### 2. **实现硬件相关函数** 根据新平台的硬件特性,实现以下核心功能: - **中断管理**:在`los_interrupt.c`中实现中断初始化、中断使能/禁止、中断处理函数注册等。 - **上下文切换**:在`los_context.S`中实现任务上下文保存和恢复的汇编代码。 - **系统时钟**:在`los_timer.c`中实现系统时钟初始化,提供系统节拍(tick)。 - **原子操作**:在`los_arch_atomic.h`中定义原子操作(如自旋锁、原子加减等)。 - **内存管理**:实现MMU初始化(如果使用虚拟内存)和物理内存管理。 注意:这些函数需要符合内核抽象层(KAL)定义的接口。 #### 3. **配置内核选项** 在`kernel/liteos_a/config`目录下,为新平台创建配置文件(例如`new_platform.config`),并设置内核选项,如: ``` LOSCFG_ARCH_CPU_ARM64=y # 使用ARM64架构 LOSCFG_PLATFORM="new_platform" # 平台名称 ``` #### 4. **修改构建脚本** 在`kernel/liteos_a/build.sh`中,添加对新平台的支持,例如: ```bash if [ "$PRODUCT" = "new_platform" ]; then ARCH="new_arch_name" KERNEL_CFG="config/new_platform.config" fi ``` #### 5. **编写驱动** 使用HDF(硬件驱动框架)编写设备驱动。在`drivers`目录下添加新平台的驱动,并在`hdf.hcs`配置文件中配置设备信息。 #### 6. **验证移植** 通过编写简单的测试任务和系统启动日志,验证内核是否成功启动。 ### 三、常见问题与参考 - **问题1**:中断处理不正确导致系统崩溃。需要检查中断向量表设置和中断处理函数。 - **问题2**:上下文切换错误。检查任务栈的初始化和上下文保存恢复的汇编代码。 - **参考**:OpenHarmony官方提供了多种平台的移植代码(如hi3516dv300、rk3568等),可作为参考。 ### 四、示例:添加新中断处理 在`los_interrupt.c`中,实现中断处理框架: ```c /* 中断处理函数数组 */ STATIC HWI_PROC_FUNC g_hwiForm[OS_HWI_MAX_NUM] = {0}; /* 中断处理入口函数 */ VOID HalIrqHandler(UINT32 irq) { if (g_hwiForm[irq] != NULL) { g_hwiForm[irq](); // 调用注册的中断处理函数 } } /* 注册中断处理函数 */ UINT32 HalHwiCreate(UINT32 irq, UINT32 priority, HWI_PROC_FUNC handler) { if (irq >= OS_HWI_MAX_NUM) { return LOS_NOK; } g_hwiForm[irq] = handler; // 硬件相关的中断使能配置 ... return LOS_OK; } ``` ### 五、移植完成后的测试 1. 编译内核并烧写到目标板。 2. 通过串口查看启动日志,确认内核初始化流程。 3. 创建测试任务,验证任务调度、中断和定时器等功能。 --- §§相关问题§§ 1. 如何为OpenHarmony LiteOS-A添加新的设备驱动? 2. 在LiteOS-A中如何配置内核选项? 3. 如何调试LiteOS-A内核启动过程中的问题? 4. LiteOS-A的中断处理流程是怎样的? 5. 如何为LiteOS-A添加系统调用?</think>### 编译移植 OpenHarmony kernel_liteos_a 指南 #### 一、编译流程(以 Linux 环境为例) ```bash # 1. 获取源码 repo init -u https://gitee.com/openharmony/manifest.git -b master --no-repo-verify repo sync -c # 2. 配置目标平台(以 Hi3516DV300 为例) cd kernel/liteos_a ./build.sh PRODUCT=hi3516dv300 # 3. 编译内核 make -j8 ``` 编译产出: - `out/hi3516dv300/kernel` 目录下的 `liteos.bin`(内核镜像)[^1] #### 二、移植到新硬件平台关键步骤 ##### 1. **硬件抽象层(arch)移植** ```mermaid graph LR A[新硬件平台] --> B[创建 arch/新平台目录] B --> C1(实现 los_context.S) B --> C2(实现 los_interrupt.c) B --> C3(实现 los_timer.c) B --> C4(实现 mmu初始化) C1 --> D[上下文切换] C2 --> E[中断控制器配置] C3 --> F[系统时钟源配置] ``` - **核心文件**(参考 `arch/arm/cortex-a7`): - `los_context.S`:实现任务切换的汇编代码 - `los_interrupt.c`:注册中断处理函数 - `los_timer.c`:配置系统时钟(需实现 `HalClockInit()`)[^3] ##### 2. **驱动适配(HDF框架)** ```c // 示例:GPIO驱动适配 #include "hdf_device_desc.h" static int32_t GpioDriverBind(struct HdfDeviceObject *device) { static struct IDeviceIoService service = { .Dispatch = GpioServiceDispatch, // 实现硬件操作函数 }; device->service = &service; return HDF_SUCCESS; } struct HdfDriverEntry g_gpioDriverEntry = { .moduleVersion = 1, .Bind = GpioDriverBind, .Init = GpioDriverInit, }; HDF_INIT(g_gpioDriverEntry); // 注册驱动[^2] ``` ##### 3. **内核配置调整** 修改 `config/新平台.config`: ```makefile LOSCFG_PLATFORM="new_platform" # 平台标识 LOSCFG_KERNEL_SMP=y # 是否支持多核 LOSCFG_DRIVERS_HDF=y # 启用HDF驱动框架 LOSCFG_NET_LWIP_SACK=y # 网络协议栈选项 ``` #### 三、常见问题解决 1. **未定义符号错误**(如 `OsSignalTaskContextRestore`) ```c // 在 arch/新平台/los_signal_stub.c 中添加空实现 void OsSignalTaskContextRestore(void) {} // 临时解决方案[^4] ``` 2. **头文件缺失** 检查 `kernel/liteos_a/include` 目录结构: ``` include/ ├── los_arch.h # 平台相关头文件 ├── hdf # 驱动框架头文件 └── posix # POSIX兼容层 ``` 3. **中断无法触发** 验证步骤: ```c UINT32 HalIrqCreate(UINT32 irq, UINT32 priority, HWI_PROC_FUNC handler) { /* 必须实现的硬件操作 */ PLATFORM_REG_WRITE(irq, ENABLE_REG); // 启用中断 return LOS_OK; } ``` #### 四、验证移植结果 ```c #include "los_task.h" VOID ExampleTask(VOID) { printf("Kernel running on new platform!\n"); } VOID Main(VOID) { UINT32 ret; TSK_INIT_PARAM_S task = { .pfnTaskEntry = (TSK_ENTRY_FUNC)ExampleTask, .usTaskPrio = 10, .uwStackSize = 4096, }; ret = LOS_TaskCreate(&g_testTaskID, &task); // 创建测试任务 if (ret != LOS_OK) { printf("Task create failed: %d\n", ret); } } ``` 预期输出:`Kernel running on new platform!` > **调试建议**: > 使用 `LOS_UartInit()` 初始化串口,通过 `printf` 输出调试信息[^1] ---
评论 9
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值