电子产业一站式赋能平台

PCB联盟网

搜索
查看: 105|回复: 0
收起左侧

一种OpenHarmony L0系统适配方案

[复制链接]

560

主题

560

帖子

6720

积分

高级会员

Rank: 5Rank: 5

积分
6720
发表于 2025-1-22 11:45:00 | 显示全部楼层 |阅读模式
1. 简介本文将介绍在不改变原有系统基础框架的基础上,一种OpenHarmony L0系统适配方案。本文档使用OpenHarmony release 3.2版本。
2. 方案设计
本文使用的硬件模块的主要特性及功能如下:

参数
说明
CPU
Cortex-A5 最高频率500MHz
存储pSRAM 128Mb + SPI NOR Flash 64Mb
OSRTOS
编译系统CMake
功能模块bootloader、at、ota、net、audio、fs、mbedtls、rpc、tts、unity等

按照OpenHarmony的官方适配指导,适配工作需要将内核由RTOS改为Liteos-m,并移植原生所有功能模块和镜像打包功能。如果采用该方案,将面临诸多困难:编译系统需要重写为gn+ninja、原始底层库和功能全面移植,这样一来打乱了原始的编译习惯,编译脚本需要重新编写,需要适配新的OS接口、已经完成的功能需要重新调试测试。过多的改动,意味着无法聚焦项目的主要功能点,这种方案工作量大,难度大,工期无法保障。
OpenHarmony的L0系统编译过程是,首先将各模块编译为静态库,再链接为应用程序,最后打包烧录入硬件。系统运行时,只有单一进程,各个不同的任务以多个线程运行。结合原生代码和OpenHarmony的特点,最终采用的适配方案如下:
使用原生代码的交叉编译工具链编译OpenHarmony为静态库,将静态库集成到原生代码中;
OpenHarmony中不编译liteos-m内核,使用原生代码的RTOS内核;
不改变原生代码的编译系统和打包系统;
原生代码中新增适配代码,以提供OpenHarmony需要的接口。
该方案在最小改动原系统的前提下,完成OpenHarmony的适配。
整体软件框架的设计如下:

1vn02xebrt56404099125.png

1vn02xebrt56404099125.png

方案保持了原始框架的大部分功能不改变,新增OpenHarmony的模块功能和其他项目需求功能,修改或升级部分原生功能(FreeRTOS、mbedtls等)。
3. OpenHarmony编译
3.1 创建虚拟设备编译
新建配置vendor/ohemu/L0_xts_demo和device/qemu/L0_xts_demo。
vendor/ohemu/L0_xts_demo/目录结构如下:
  • vendor/ohemu/L0_xts_demo/├── BUILD.gn├── config.json├── hals│   └── utils├── kernel_configs│   ├── debug.config│   ├── debug.rar│   ├── no_kernel_test.config│   └── release.config├── LICENSE├── ohos.build└── qemu_run.shdevice/qemu/L0_xts_demo/目录结构如下:
  • device/qemu/L0_xts_demo/├── BUILD.gn├── driver│   └── hals├── liteos_m│   ├── board│   ├── BUILD.gn│   └── config.gni├── ohos.build├── README.md└── README_zh.md3.2 子系统配置
    vendor/ohemu/L0_xts_demo/config.json文件包含了所有必需的子系统配置,由于篇幅问题,内容略。
    3.4 编译命令
  • python3 ./build.py -p L0_xts_demo -f -b debug --gn-args build_xts=true编译出的静态库位于out/L0_xts_demo/L0_xts_demo/libs
    3.5 优化剪裁
    由于是L0系统,没有必要下载完整OpenHarmony源码包,所以对manifest和prebuild进行剪裁,只下载必需的软件和源码。
    修改build/prebuilts_download_config.json,只保留gn、ninja和python。
    修改.repo/manifests/ohos/ohos.xml,删除不需要的包,剪裁后仅剩50个包。
    3.6 集成
    将编译后的静态库拷贝到原生编译系统中,并编写demo程序,进行编译。
    3.6.1 编写demo
    OpenHarmony的demo分为两个单元,main.c和demo.c。
  • main.c负责启动OpenHarmony,
  • demo.c为应用程序,循环打印hilog日志。
    详细代码略。
    3.6.2 编译demo
    创建CMakeFile.txt文件。
    定义OpenHarmony的头文件包含目录及库文件:
  • set(OpenHarmony_INCLUDE_PATHS     base/hiviewdfx/hilog_lite/interfaces/native/kits/hilog_lite     commonlibrary/utils_lite/include     base/hiviewdfx/hilog_lite/command     base/hiviewdfx/hilog_lite/frameworks/mini     kernel/liteos_m/kernel/include     kernel/liteos_m/utils     base/startup/bootstrap_lite/services/source     foundation/systemabilitymgr/samgr_lite/interfaces/kits/samgr     foundation/bundlemanager/bundle_framework_lite/interfaces/kits/bundle_lite     foundation/bundlemanager/bundle_framework_lite/utils/bundle_lite     third_party/bounds_checking_function/include     foundation/ability/ability_lite/interfaces/kits/want_lite    commonlibrary/utils_lite/include)
    set(OpenHarmony_LIBS "${OpenHarmony_lib_path}/libbegetutil.a \${OpenHarmony_lib_path}/libbootstrap.a \${OpenHarmony_lib_path}/libhal_file_static.a \${OpenHarmony_lib_path}/libhal_sysparam.a \${OpenHarmony_lib_path}/libhievent_lite_static.a \${OpenHarmony_lib_path}/libhilog_lite_static.a \${OpenHarmony_lib_path}/libhilog_static.a \${OpenHarmony_lib_path}/libhiview_lite_static.a \${OpenHarmony_lib_path}/libinit_log.a \${OpenHarmony_lib_path}/libinit_utils.a \${OpenHarmony_lib_path}/libnative_file.a \${OpenHarmony_lib_path}/libparam_client_lite.a \${OpenHarmony_lib_path}/libsamgr.a \${OpenHarmony_lib_path}/libsamgr_adapter.a \${OpenHarmony_lib_path}/libsamgr_source.a \${OpenHarmony_lib_path}/libsec_static.a \")set(OpenHarmony_FLAGS "-Wl,--whole-archive ${OpenHarmony_LIBS} -Wl,--no-whole-archive")编译demo程序:
  • set(target OpenHarmony_demo)add_appimg_flash_example(${target} OpenHarmony-main.c OpenHarmony-demo.c)include_directories(${INC_DIR})include_directories(${INC_DIR}/system)target_compile_definitions(${target} PRIVATE OSI_LOG_TAG=LOG_TAG_OpenHarmony)foreach(inc ${OpenHarmony_INCLUDE_PATHS})include_directories(${OpenHarmony_inc_path}/${inc})endforeach()set_target_properties(${target} PROPERTIES LINK_FLAGS "${OpenHarmony_FLAGS}")编译后生成镜像文件OpenHarmony_demo.img
    3.6.3 编译xts
    生成多个xts镜像:
  • ######################################XTS start###########################set(OpenHarmony_LIBS_XTS "")macro(add_target_OpenHarmony_xts)    foreach(arg ${ARGN})        set(OpenHarmony_XTS_LIBS "${OpenHarmony_lib_path}/libhctest.a \            ${OpenHarmony_lib_path}/libmodule_${arg}.a \            ")        set(target OpenHarmony_xts_${arg})        add_appimg_flash_example(${target} OpenHarmony-main.c)        include_directories(${INC_DIR})        target_compile_definitions(${target} PRIVATE OSI_LOG_TAG=LOG_TAG_OpenHarmony)        set(OpenHarmony_FLAGS "-Wl,--whole-archive ${OpenHarmony_LIBS} ${OpenHarmony_LIBS_XTS} ${OpenHarmony_XTS_LIBS} -Wl,--no-whole-archive")        set_target_properties(${target} PROPERTIES LINK_FLAGS "${OpenHarmony_FLAGS}")    endforeach()endmacro()
    ############################################################################ActsBootstrapTest ActsDfxFuncTest ActsHieventLiteTest ActsUtilsFileTest###########################################################################add_target_OpenHarmony_xts(ActsBootstrapTest ActsDfxFuncTest ActsHieventLiteTest ActsUtilsFileTest)这里列举了前面几个,其他由于篇幅问题略。
    3.6.4 链接
    修改ld文件,主要是修改text段,新增OpenHarmony的自定义段设置:(略)
    4. 原生系统修改
    在原生代码中升级模块或新增OpenHarmony调用的接口。
    4.1 升级RTOS
    由于不支持OpenHarmony适配接口,FreeRTOS内核从版本10.0.1升级到版本v10.3.1,适配其hal层和osi层接口。
    FreeRTOS源码来自于官网地址:https://github.com/FreeRTOS/FreeRTOS
    4.2 升级mbedtls
    因为原生代码的版本较低,所以拷贝OpenHarmony中的mbedtls源码覆盖到原生系统中,版本为3.1.0。在OpenHarmony中不编译三方库mbedtls。
    修改CMakeFile.txt和config.h,打开OpenHarmony和原生系统需要的功能开关。
    4.3 新增cmsis接口
    原生系统kernel中新增cmsis目录,编译cmsis相关源码。
    cmsis源码来自于开源项目CMSIS-FreeRTOS,地址:https://github.com/ARM-software/CMSIS-FreeRTOS
    修改部分源码,并修改kernel的CMakeFile.txt,将freertos/cmsis/Source/cmsis_os2.c加入编译。
    4.4 新增打印接口
    适配打印接口,这里可以有多种灵活功能,比如打印到串口、保存文件、数据库等。
    4.5 新增文件系统接口
    适配文件系统接口。
    需要注意的是,OpenHarmony要求打开文件最多为32个,这里需要控制通过_open()接口打开的文件总数不能超过32个。
    4.6 新增posix接口
    适配缺失的posix接口。
    4.7 新增liteos接口
    liteos-m中调用的接口
    4.8 其他接口
    适配缺失的其他接口
    5. OpenHarmony修改
    5.1 三方库
    修改third_party/bounds_checking_function/BUILD.gn
    5.2 修改hiview_lite
    修改文件base/hiviewdfx/hiview_lite/BUILD.gn
    5.3 修改huks
    修改文件base/security/huks/utils/mutex/hks_mutex.c
    因为原生系统不支持posix的mutex接口,这里修改mutex接口为los接口。
    如果原生系统支持posix接口,则这里不需要进行修改。
    5.4 修改bootstrap_lite
    修改文件base/startup/bootstrap_lite/services/source/core_main.h,取消重复调用
    5.5 删除-fPIC
    由于是静态库,不需要fPIC,否则会导致程序运行异常。
  • 修改foundation/ability/ability_lite/frameworks/want_lite/BUILD.gn,删除fPIC。
  • 修改
    foundation/bundlemanager/bundle_framework_lite/frameworks/bundle_lite/BUILD.gn,删除fPIC。
    5.6 修改xts
    修改日志打印,将日志输出到串口
    6. 总结
    该方案与官方方案相比,降低了适配复杂度,减少了工作量和工期,是一种快速的适配方案。
    请各位读者根据项目的实际情况在两种方案中进行选择。
    该方案涉及的相关源码已经开源,请移步网址:
    https://gitee.com/pjie131/OpenHarmony_L0_adapter
  • 回复

    使用道具 举报

    发表回复

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则


    联系客服 关注微信 下载APP 返回顶部 返回列表