【入门到实战】OpenHarmony轻量和小型系统设备开发:集成三方SDK

鸿蒙OpenHarmony【集成三方SDK】 (基于Hi3861开发板) 而网上有关鸿蒙的开发资料非常的少,假如你想学好鸿蒙的应用开发与系统底层开发。你可以参考这份资料,少走很多弯路,节省没必要的麻烦。由两位前阿里高级研发工程师联合打造的《鸿蒙NEXT星河版OpenHarmony开发文档》里面内容包含了(ArkTS、ArkUI开发组件、Stage模型、多端部署、分布式应用开发、音频、视频、WebGL、OpenHarmony多媒体技术、Napi组件、OpenHarmony内核、Harmony南向开发、鸿蒙项目实战等等)鸿蒙(Harmony NEXT)技术知识点如果。 阅读详情

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


集成三方SDK

OpenHarmony致力于打造一套更加开放完善的IoT生态系统,为此OpenHarmony规划了一组目录,用于将各厂商的SDK集成到OpenHarmony中。本文档基于Hi3861开发板,向平台开发者介绍将SDK集成到OpenHarmony的方法。

规划目录结构

三方SDK通常由静态库和适配代码构成。SDK的业务逻辑通过硬件模组工具链编译得到静态库libs,每款模组都有其对应的libs。SDK的南向API与OpenHarmony 的API存在使用差异,该差异可通过adapter适配代码屏蔽,不同模组可共用一套adapter。

基于以上特征,在OpenHarmony目录结构中,可以对三方SDK目录做如下划分。

  • 适配代码adapter,放置到domains/iot/link/ 目录下,与模组解耦。
  • 业务库libs,放置到device/hisilicon/hispark_pegasus/sdk_liteos/3rd_sdk/ 目录下,与模组绑定。

平台开发者在适配前,务必先依次完成以下步骤,下面以demolink SDK举例,进行介绍。

  1. 创建厂商目录,domains/iot/link/demolink/、device/hisilicon/hispark_pegasus/sdk_liteos/3rd_sdk/demolink/ ,用于厂商隔离。
  2. 创建domains/iot/link/demolink/BUILD.gn ,用于构建适配代码。
  3. 创建device/hisilicon/hispark_pegasus/sdk_liteos/3rd_sdk/demolink/libs/ 目录,用于存放业务库libs。
.
├── domains
│   └── iot
│       └── link
│           ├── demolink
│           │   └── BUILD.gn
│           ├── libbuild
│           │   └── BUILD.gn
│           └── BUILD.gn
└── device
     └── hisilicon
         └── hispark_pegasus
             └── sdk_liteos
                 └── 3rd_sdk
                     └── demolink
                         └── libs

构建业务libs

平台SDK业务一般以静态库的形式提供,平台厂商在获取到OpenHarmony代码后,需要根据对应的硬件模组vendor,编译业务libs,并将编译结果放置在device/hisilicon/hispark_pegasus/sdk_liteos/3rd_sdk/demolink/libs/ 目录下。下面介绍业务libs的构建方法。

OpenHarmony已规划用于编译业务libs的目录domains/iot/link/libbuild/ ,该目录中包含domains/iot/link/libbuild/BUILD.gn和domains/iot/link/BUILD.gn文件,目录结构如下。

.
└── domains
    └── iot
        └── link
            ├── demolink
            │   └── BUILD.gn
            ├── libbuild
            │   └── BUILD.gn
            └── BUILD.gn

平台开发者在构建libs前,务必先完成如下步骤。

  1. 在domains/iot/link/libbuild/ 目录下放置业务源码文件,包括.c和.h文件。

    .
    └── domains
        └── iot
            └── link
                ├── demolink
                │   ├── demosdk_adapter.c
                │   ├── demosdk_adapter.h
                │   └── BUILD.gn
                ├── libbuild
                │   ├── demosdk.c
                │   ├── demosdk.h
                │   └── BUILD.gn
                └── BUILD.gn
    
  2. 适配domains/iot/link/libbuild/BUILD.gn,在编译完成后还原该文件。

    在BUILD.gn中,sources为需要参与构建的源文件,include_dirs为依赖的头文件路径,构建的目标结果是生成静态库libdemosdk.a。

    static_library("demosdk") {
        sources = [
            "demosdk.c"
        ]
        include_dirs = [
            "//domains/iot/link/libbuild",
            "//domains/iot/link/demolink"
        ]
    }
    
  3. 适配domains/iot/link/BUILD.gn,在编译完成后还原该文件。

    此BUILD.gn文件用于指定构建条目,需要在features中填入所有需参与编译的静态库条目,使domains/iot/link/libbuild/BUILD.gn参与到构建中来。

    import("//build/lite/config/subsystem/lite_subsystem.gni")
    import("//build/lite/config/component/lite_component.gni")
    lite_subsystem("iot") {
        subsystem_components = [
            ":link"
        ]
    }
    lite_component("link") {
        features = [
            "libbuild:demosdk"
        ]
    }
    

完成以上3点后,需在代码根目录下执行命令“hb build -T //domains/iot/link:iot”,等待执行完成,检查out/hispark_pegasus/wifiiot_hispark_pegasus/libs/目录下是否生成了目标库文件。

将库文件拷贝到device/hisilicon/hispark_pegasus/sdk_liteos/3rd_sdk/demolink/libs/ 目录下,并将domains/iot/link/libbuild/ 目录中的.c和.h文件清除。

编写适配代码

代码编写

平台SDK中使用的API通常与OpenHarmony API存在差异,无法直接使用,需要一层适配代码adapter进行中间转换。本节以domains/iot/link/demolink/demosdk_adapter.c中的任务创建接口DemoSdkCreateTask举例,向开发者演示如何在OpenHarmony上编写适配代码。

  1. 查看待适配接口DemoSdkCreateTask的描述、参数、返回值。

    struct TaskPara {
        char *name;
        void *(*func)(char* arg);
        void *arg;
        unsigned char prio;
        unsigned int size;
    };
    
    /*
     * IoT OS 创建线程接口
     * 返回值: 返回0 成功, 其他 失败
     */
    int DemoSdkCreateTask(unsigned int *handle, const struct TaskPara *para);
    
  2. 查看OpenHarmony API接口文档,选取一个功能类似的接口,并比对参数及用法上的差异。例如本文选取osThreadNew ,通过和DemoSdkCreateTask接口比对,可以发现两接口依赖的参数基本一致,只是参数所归属的结构体不同。

    typedef struct {
        const char                   *name;   ///< name of the thread
        uint32_t                 attr_bits;   ///< attribute bits
        void                      *cb_mem;    ///< memory for control block
        uint32_t                   cb_size;   ///< size of provided memory for control block
        void                   *stack_mem;    ///< memory for stack
        uint32_t                stack_size;   ///< size of stack
        osPriority_t              priority;   ///< initial thread priority (default: osPriorityNormal)
        TZ_ModuleId_t            tz_module;   ///< TrustZone module identifier
        uint32_t                  reserved;   ///< reserved (must be 0)
    } osThreadAttr_t;
    
    /// Create a thread and add it to Active Threads.
    /// \param[in]     func          thread function.
    /// \param[in]     argument      pointer that is passed to the thread function as start argument.
    /// \param[in]     attr          thread attributes; NULL: default values.
    /// \return thread ID for reference by other functions or NULL in case of error.
    osThreadId_t osThreadNew (osThreadFunc_t func, void *argument, const osThreadAttr_t *attr);
    
  3. 完成代码差异转换。

    int DemoSdkCreateTask(unsigned int *handle, const struct TaskPara *para)
    {
        osThreadAttr_t attr = {0};
        osThreadId_t threadId;
        if (handle == 0 || para == 0) {
            return DEMOSDK_ERR;
        }
        if (para->func == 0) {
            return DEMOSDK_ERR;
        }
        if (para->name == 0) {
            return DEMOSDK_ERR;
        }
        attr.name = para->name;
        attr.priority = para->prio;
        attr.stack_size = para->size;
        threadId = osThreadNew((osThreadFunc_t)para->func, para->arg, &attr);
        if (threadId == 0) {
            printf("osThreadNew fail\n");
            return DEMOSDK_ERR;
        }
        *(unsigned int *)handle = (unsigned int)threadId;
        return DEMOSDK_OK;
    }
    

脚本编写

开发者在完成代码适配后,还需要在adapter同级目录下新建BUILD.gn文件。该文件可在整包构建时,将适配代码编译成静态库,并链接到bin包中去。在domains/iot/link/demolink/BUILD.gn中,sources中为需要参与构建的源文件,include_dirs中为依赖的头文件路径,构建目标结果是生产静态库libdemolinkadapter.a。

import("//build/lite/config/component/lite_component.gni")
static_library("demolinkadapter") {
    sources = [
        "demosdk_adapter.c"
    ]
    include_dirs = [
        "//kernel/liteos-m/kal/cmsis",
        "//domains/iot/link/demolink"
    ]
}

修改domains/iot/link/BUILD.gn文件,使domain/iot/hilink/BUILD.gn参与到构建系统中。

import("//build/lite/config/subsystem/lite_subsystem.gni")
import("//build/lite/config/component/lite_component.gni")
lite_subsystem("iot") {
    subsystem_components = [
        ":link"
    ]
}
lite_component("link") {
    features = [
        "demolink:demolinkadapter"
    ]
}

编写业务代码

业务libs库和适配代码准备就绪后,还需要编写业务入口函数,调起三方SDK的业务入口。

下面以demolink举例,介绍如何在applications/sample/wifi-iot/app/路径下编写代码,调起demosdk的入口函数。

  1. 目录创建

    开发者编写业务时,务必先在applications/sample/wifi-iot/app/ 路径下新建一个目录(或一套目录结构),用于存放业务源码文件。

    例如:在app下新增业务目录demolink,并在其中创建业务入口代码helloworld.c和编译构建文件BUILD.gn,如下。

    .
    └── applications
        └── sample
            └── wifi-iot
                └── app
                    │── demolink
                    │    │── helloworld.c
                    │    └── BUILD.gn
                    └── BUILD.gn
    
  2. 编写业务代码。

    在helloworld.c文件中编写业务入口函数DemoSdkMain,并调起demolink的业务DemoSdkEntry,最后通过SYS_RUN()调用入口函数完成业务启动。

    #include "hos_init.h"
    #include "demosdk.h"
    
    void DemoSdkMain(void)
    {
        DemoSdkEntry();
    }
    
    SYS_RUN(DemoSdkMain);
    
  3. 编写构建脚本

    新增applications/sample/wifi-iot/app/demolink/BUILD.gn文件,指定源码和头文件路径,编译输出静态库文件libexample_demolink.a。

    static_library("example_demolink") {
        sources = [
            "helloworld.c"
        ]
        include_dirs = [
            "//utils/native/lite/include",
            "//domains/iot/link/libbuild"
        ]
    }
    

    修改applications/sample/wifi-iot/app/BUILD.gn,使demolink参与编译。

    import("//build/lite/config/component/lite_component.gni")
    lite_component("app") {
        features = [
            "demolink:example_demolink"
        ]
    }
    

运行

在代码根目录下,执行命令“hb build”编译输出版本包。最后启动运行,运行结果如图所示,与demolink预期相符。

ready to OS start
sdk ver:Hi3861V100R001C00SPC024 2020-08-05 16:30:00
formatting spiffs...
FileSystem mount ok.
wifi init success!
it is demosdk entry.
it is demo biz: hello world.
it is demo biz: hello world.

结束

至此,三方SDK集成已介绍完毕。

OpenHarmony开发实战探索: Linux 环境中的SDK 使用 Ubuntu 20.04(推荐) 环境下 使用 OpenHarmony SDK 编译,OpenHarmony standard 系统北向应用 c/c++ 库 阅读详情

相关推荐

【OpenHarmony】使用手工编译的ohos-sdk

问题:修改了badge组件position属性,使其支持(x,y)坐标输入,但是previewer预览无效。

cocoduco的博客 2712

OpenHarmony 入门——搭建OpenHarmony本地应用开发环境

OpenHarmony是由开放原子开源基金会(OpenAtom Foundation)孵化及运营的开源项目,目标是面向全场景、全连接、全智能时代,搭建一个智能终端设备操作系统的框架和平台,促进万物互联产业的繁荣发展。

最美不过,心中有梦,身旁有你! 7332

鸿蒙OpenHarmony【集成三方SDK】 轻量和小型系统设备

OpenHarmony致力于打造一套更加开放完善的IoT生态系统,为此OpenHarmony规划了一组目录,用于将各厂商的SDK集成到OpenHarmony中。本文档基于Hi3861开发板,向平台开发者介绍将SDK集成到OpenHarmony的方法。

adsjgfjha123123的博客 945

OpenHarmony 应用开发SDK、API 与基础工具

C API 只覆盖了部分鸿蒙基础底层能力,如 libc,图形库,窗口系统,多媒体,压缩库等,并没有完全提供类似于 ArkTS API 上的完整鸿蒙平台能力,开发者可以使用 C API 开发支持鸿蒙应用框架的扩展动态库,通过 import 语句导入到 ArkTS 环境中使用。鸿蒙生态应用的主要开发语言是 ArkTS,同时也提供使用 Native 语言开发 ArkTS 模块的扩展方式,鸿蒙系统中支持这种开发方式的 C 语言接口叫 C API。鸿蒙系统是分布式操作系统,一套 SDK 可适配多设备的开发。

weixin_69135651的博客 1741

OpenHarmony南向设备开发:轻量和小型系统-集成三方SDK

三方SDK通常由静态库和适配代码构成。

初一十五的博客 862

OpenHarmony实战:轻量系统芯片移植

本文从芯片适配的端到端视角,为芯片/模组制造商提供基于OpenHarmony的芯片适配指导。

m0_64420071的博客 2053

【入门到实战】OpenHarmony轻量和小型系统设备开发:LED外设控制

本文介绍如何通过调用OpenHarmony的NDK接口....

Androidbye的博客 1137

基于 OpenHarmony 5.0 的星闪轻量型设备应用开发-Ch1 开发环境搭建

HH-SPARK-WS63 星闪无线模组(以下简称 WS63)是由润和软件推出的基于海思 WS63V100 SoC 的面向星闪开发爱好者的芯片。WS63 的工程构建,可以选择在 Ubuntu 系统下,选用基于润和软件提供的 OpenHarmony 版本的 SDK;也可以选择在 Windows 系统下,使用 HiSpark Studio 软件,并搭配基于统一开发平台FBB(Family Big Box,统一开发框架,统一API)构建而来的 SDK,fbb_ws63。

北斗星的杂志 3517

OpenHarmony 标准/小型/轻量 系统编译

官方路径:https://gitee.com/openharmony,进入以后在公告栏有最新版本路径:“社区已于2025-01-22发布OpenHarmony-v5.0.2-Release版本, 详情请参考https://gitee.com/openharmony/docs/blob/master/zh-cn/release-notes/OpenHarmony-v5.0.2-release.md”。建议选择 通过repo获取->方式一(推荐)->从版本发布Tag节点获取源码。hb set选择编译目标。

weixin_42938827的博客 1946

基于 OpenHarmony 5.0 的星闪轻量型设备应用开发——Ch3 设备驱动开发

“设备”是相对于 WS63E 模组而言的其他硬件资源。这些“设备”可以是 LED 灯,也可以是蜂鸣器,亦或是温湿度传感器。如果想通过编写运行在 WS63E 上的 OpenHarmony 框架代码,用于控制这些设备的工作状态或能力,就需要进行设备驱动的开发。对 WS63E 而言,这些设备与之进行数据交互的通道就是 IO 引脚。基于 OpenHarmony 的 WS63E 设备驱动开发就是通过对相应 IO 引脚进行模式配置,数据赋值,数据读取,中断配置等一系列的操作。从本章开始,将以石院星闪物联网教学开发板为例

北斗星的杂志 2489

OpenHarmony南向设备开发:轻量系统芯片移植指南

由于OpenHarmony工程需要在Linux环境下进行编译..........

初一十五的博客 1090

OpenHarmony移植:Unity游戏适配开源鸿蒙小型设备

将Unity游戏适配到OpenHarmony小型设备,核心在于​​资源优化、系统API对接与性能调优​​。通过本文的实践,开发者可掌握从环境配置到最终发布的完整流程,应对小型设备的资源限制与系统差异。未来,随着OpenHarmony社区的壮大(如更多硬件厂商加入、图形API增强),Unity与OpenHarmony的融合将更加紧密,为小型设备带来更丰富的游戏体验。

m0_59315734的博客 1537

OpenHarmony和HarmonyOS区别及应用开发简介

OpenHarmony和HarmonyOS的区别,包括开发工具、应用开发和学习规划的介绍

。 5131

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

本文详细介绍了鸿蒙5.0开发的核心知识点和实战项目,包括鸿蒙HarmonyOSNext应用开发的学习路线和技术指南。

Androidbye的博客 1387

OpenHarmony实战:轻量级系统内核移植

芯片架构的移植是内核移植的基础

m0_64420071的博客 2149

【开源鸿蒙】OpenHarmony 5.0轻量系统最小开发环境搭建

本文将会介绍,如何下载源代码和工具链,让磁盘占用尽可能小的同时,还可以进行轻量系统上的OpenHarmony开发(进行源码编译构建)。最终实现了将磁盘占用从完整源码的67G减少到了15G,不到完整源码的四分之一磁盘占用!

码工许师傅 5979

【入门到实战】OpenHarmony南向设备轻量系统芯片移植指南:移植启动恢复子系统

本文详细介绍了鸿蒙5.0开发的核心知识点和实战项目,特别是启动恢复子系统的移植过程。

Androidbye的博客 1011

OpenHarmony(鸿蒙南向开发)——轻量系统芯片内核移植

编译框架搭建完成后,需要将芯片厂商的SDK加入OpenHarmony编译框架,从而可以编译出带SDK的烧录文件(此时编译出的是不带系统的裸机工程),以便OpenHarmony可以调用SDK中的接口。参考文件路径:“device/hisilicon/hispark_pegasus/sdk_liteos/platform/os/Huawei_LiteOS/targets/hi3861v100/include/target_config.h”路径:“kernel/liteos_m/kal/BUILD.gn”

鸿蒙开发知识记录 2114
上一篇: 【入门到实战】OpenHarmony轻量和小型系统设备开发:LED外设控制
下一篇: 【入门到实战】OpenHarmony轻量和小型系统设备开发:拍照开发指南
懂你的大海
博客等级 码龄6年 9049粉丝 1381原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值