RM新时代网站-首页

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

鴻蒙OpenHarmony【集成三方SDK】 (基于Hi3861開(kāi)發(fā)板)

jf_46214456 ? 來(lái)源:jf_46214456 ? 作者:jf_46214456 ? 2024-04-24 15:11 ? 次閱讀

OpenHarmony致力于打造一套更加開(kāi)放完善的IoT生態(tài)系統(tǒng),為此OpenHarmony規(guī)劃了一組目錄,用于將各廠商SDK集成到OpenHarmony中。本文檔基于Hi3861開(kāi)發(fā)板,向平臺(tái)開(kāi)發(fā)者介紹將SDK集成到OpenHarmony的方法。

規(guī)劃目錄結(jié)構(gòu)

三方SDK通常由靜態(tài)庫(kù)和適配代碼構(gòu)成。SDK的業(yè)務(wù)邏輯通過(guò)硬件模組工具鏈編譯得到靜態(tài)庫(kù)libs,每款模組都有其對(duì)應(yīng)的libs。SDK的南向API與OpenHarmony 的API存在使用差異,該差異可通過(guò)adapter適配代碼屏蔽,不同模組可共用一套adapter。

基于以上特征,在OpenHarmony目錄結(jié)構(gòu)中,可以對(duì)三方SDK目錄做如下劃分。

  • 適配代碼adapter,放置到domains/iot/link/ 目錄下,與模組解耦。
  • 業(yè)務(wù)庫(kù)libs,放置到device/hisilicon/hispark_pegasus/sdk_liteos/3rd_sdk/ 目錄下,與模組綁定。

平臺(tái)開(kāi)發(fā)者在適配前,務(wù)必先依次完成以下步驟,下面以demolink SDK舉例,進(jìn)行介紹。

  1. 創(chuàng)建廠商目錄,domains/iot/link/demolink/、device/hisilicon/hispark_pegasus/sdk_liteos/3rd_sdk/demolink/ ,用于廠商隔離。
  2. 創(chuàng)建domains/iot/link/demolink/BUILD.gn ,用于構(gòu)建適配代碼。
  3. 創(chuàng)建device/hisilicon/hispark_pegasus/sdk_liteos/3rd_sdk/demolink/libs/ 目錄,用于存放業(yè)務(wù)庫(kù)libs。

鴻蒙開(kāi)發(fā)指導(dǎo)文檔:[gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md]

搜狗高速瀏覽器截圖20240326151547.png

.
├── domains
│   └── iot
│       └── link
│           ├── demolink
│           │   └── BUILD.gn
│           ├── libbuild
│           │   └── BUILD.gn
│           └── BUILD.gn
└── device
     └── hisilicon
         └── hispark_pegasus
             └── sdk_liteos
                 └── 3rd_sdk
                     └── demolink
                         └── libs
HarmonyOS與OpenHarmony鴻蒙文檔籽料:mau123789是v直接拿

構(gòu)建業(yè)務(wù)libs

平臺(tái)SDK業(yè)務(wù)一般以靜態(tài)庫(kù)的形式提供,平臺(tái)廠商在獲取到OpenHarmony代碼后,需要根據(jù)對(duì)應(yīng)的硬件模組vendor,編譯業(yè)務(wù)libs,并將編譯結(jié)果放置在device/hisilicon/hispark_pegasus/sdk_liteos/3rd_sdk/demolink/libs/ 目錄下。下面介紹業(yè)務(wù)libs的構(gòu)建方法。

OpenHarmony已規(guī)劃用于編譯業(yè)務(wù)libs的目錄domains/iot/link/libbuild/ ,該目錄中包含domains/iot/link/libbuild/BUILD.gn和domains/iot/link/BUILD.gn文件,目錄結(jié)構(gòu)如下。

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

平臺(tái)開(kāi)發(fā)者在構(gòu)建libs前,務(wù)必先完成如下步驟。

  1. 在domains/iot/link/libbuild/ 目錄下放置業(yè)務(wù)源碼文件,包括.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為需要參與構(gòu)建的源文件,include_dirs為依賴的頭文件路徑,構(gòu)建的目標(biāo)結(jié)果是生成靜態(tài)庫(kù)libdemosdk.a。
    static_library("demosdk") {
        sources = [
            "demosdk.c"
        ]
        include_dirs = [
            "http://domains/iot/link/libbuild",
            "http://domains/iot/link/demolink"
        ]
    }
    
  3. 適配domains/iot/link/BUILD.gn,在編譯完成后還原該文件。
    此BUILD.gn文件用于指定構(gòu)建條目,需要在features中填入所有需參與編譯的靜態(tài)庫(kù)條目,使domains/iot/link/libbuild/BUILD.gn參與到構(gòu)建中來(lái)。
    import("http://build/lite/config/subsystem/lite_subsystem.gni")
    import("http://build/lite/config/component/lite_component.gni")
    lite_subsystem("iot") {
        subsystem_components = [
            ":link"
        ]
    }
    lite_component("link") {
        features = [
            "libbuild:demosdk"
        ]
    }
    

完成以上3點(diǎn)后,需在代碼根目錄下執(zhí)行命令“hb build -T //domains/iot/link:iot”,等待執(zhí)行完成,檢查out/hispark_pegasus/wifiiot_hispark_pegasus/libs/目錄下是否生成了目標(biāo)庫(kù)文件。

將庫(kù)文件拷貝到device/hisilicon/hispark_pegasus/sdk_liteos/3rd_sdk/demolink/libs/ 目錄下,并將domains/iot/link/libbuild/ 目錄中的.c和.h文件清除。

編寫(xiě)適配代碼

代碼編寫(xiě)

平臺(tái)SDK中使用的API通常與OpenHarmony API存在差異,無(wú)法直接使用,需要一層適配代碼adapter進(jìn)行中間轉(zhuǎn)換。本節(jié)以domains/iot/link/demolink/demosdk_adapter.c中的任務(wù)創(chuàng)建接口DemoSdkCreateTask舉例,向開(kāi)發(fā)者演示如何在OpenHarmony上編寫(xiě)適配代碼。

  1. 查看待適配接口DemoSdkCreateTask的描述、參數(shù)、返回值。
    struct TaskPara {
        char *name;
        void *(*func)(char* arg);
        void *arg;
        unsigned char prio;
        unsigned int size;
    };
    
    /*
     * IoT OS 創(chuàng)建線程接口
     * 返回值: 返回0 成功, 其他 失敗
     */
    int DemoSdkCreateTask(unsigned int *handle, const struct TaskPara *para);
    
  2. 查看OpenHarmony API接口文檔,選取一個(gè)功能類似的接口,并比對(duì)參數(shù)及用法上的差異。例如本文選取osThreadNew ,通過(guò)和DemoSdkCreateTask接口比對(duì),可以發(fā)現(xiàn)兩接口依賴的參數(shù)基本一致,只是參數(shù)所歸屬的結(jié)構(gòu)體不同。
    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. 完成代碼差異轉(zhuǎn)換。
    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 failn");
            return DEMOSDK_ERR;
        }
        *(unsigned int *)handle = (unsigned int)threadId;
        return DEMOSDK_OK;
    }
    

腳本編寫(xiě)

開(kāi)發(fā)者在完成代碼適配后,還需要在adapter同級(jí)目錄下新建BUILD.gn文件。該文件可在整包構(gòu)建時(shí),將適配代碼編譯成靜態(tài)庫(kù),并鏈接到bin包中去。在domains/iot/link/demolink/BUILD.gn中,sources中為需要參與構(gòu)建的源文件,include_dirs中為依賴的頭文件路徑,構(gòu)建目標(biāo)結(jié)果是生產(chǎn)靜態(tài)庫(kù)libdemolinkadapter.a。

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

修改domains/iot/link/BUILD.gn文件,使domain/iot/hilink/BUILD.gn參與到構(gòu)建系統(tǒng)中。

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

編寫(xiě)業(yè)務(wù)代碼

業(yè)務(wù)libs庫(kù)和適配代碼準(zhǔn)備就緒后,還需要編寫(xiě)業(yè)務(wù)入口函數(shù),調(diào)起三方SDK的業(yè)務(wù)入口。

下面以demolink舉例,介紹如何在applications/sample/wifi-iot/app/路徑下編寫(xiě)代碼,調(diào)起demosdk的入口函數(shù)。

  1. 目錄創(chuàng)建
    開(kāi)發(fā)者編寫(xiě)業(yè)務(wù)時(shí),務(wù)必先在applications/sample/wifi-iot/app/ 路徑下新建一個(gè)目錄(或一套目錄結(jié)構(gòu)),用于存放業(yè)務(wù)源碼文件。
    例如:在app下新增業(yè)務(wù)目錄demolink,并在其中創(chuàng)建業(yè)務(wù)入口代碼helloworld.c和編譯構(gòu)建文件BUILD.gn,如下。

    .
    └── applications
        └── sample
            └── wifi-iot
                └── app
                    │── demolink
                    │    │── helloworld.c
                    │    └── BUILD.gn
                    └── BUILD.gn
    
  2. 編寫(xiě)業(yè)務(wù)代碼。
    在helloworld.c文件中編寫(xiě)業(yè)務(wù)入口函數(shù)DemoSdkMain,并調(diào)起demolink的業(yè)務(wù)DemoSdkEntry,最后通過(guò)SYS_RUN()調(diào)用入口函數(shù)完成業(yè)務(wù)啟動(dòng)。

    #include "hos_init.h"
    #include "demosdk.h"
    
    void DemoSdkMain(void)
    {
        DemoSdkEntry();
    }
    
    SYS_RUN(DemoSdkMain);
    
  3. 編寫(xiě)構(gòu)建腳本
    新增applications/sample/wifi-iot/app/demolink/BUILD.gn文件,指定源碼和頭文件路徑,編譯輸出靜態(tài)庫(kù)文件libexample_demolink.a。

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

    修改applications/sample/wifi-iot/app/BUILD.gn,使demolink參與編譯。

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

運(yùn)行

在代碼根目錄下,執(zhí)行命令“hb build”編譯輸出版本包。最后啟動(dòng)運(yùn)行,運(yùn)行結(jié)果如圖所示,與demolink預(yù)期相符。

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.

審核編輯 黃宇

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 開(kāi)發(fā)板
    +關(guān)注

    關(guān)注

    25

    文章

    5032

    瀏覽量

    97371
  • SDK
    SDK
    +關(guān)注

    關(guān)注

    3

    文章

    1035

    瀏覽量

    45899
  • 鴻蒙
    +關(guān)注

    關(guān)注

    57

    文章

    2339

    瀏覽量

    42804
  • OpenHarmony
    +關(guān)注

    關(guān)注

    25

    文章

    3713

    瀏覽量

    16252
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    鴻蒙OpenHarmony【輕量系統(tǒng)運(yùn)行】 (基于Hi3861開(kāi)發(fā)板

    由于Hi3861為WLAN模組,您可以在版本編譯及燒錄后,通過(guò)如下操作,使開(kāi)發(fā)板實(shí)現(xiàn)聯(lián)網(wǎng)功能。
    的頭像 發(fā)表于 04-23 09:50 ?751次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>OpenHarmony</b>【輕量系統(tǒng)運(yùn)行】 (基于<b class='flag-5'>Hi3861</b><b class='flag-5'>開(kāi)發(fā)板</b>)

    鴻蒙OpenHarmony【輕量系統(tǒng) 環(huán)境搭建】 (基于Hi3861開(kāi)發(fā)板

    除上述[安裝庫(kù)和工具集]和[安裝編譯工具]外,針對(duì)Hi3861開(kāi)發(fā)板還需要安裝特定的編譯工具。
    的頭像 發(fā)表于 04-26 17:47 ?1875次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>OpenHarmony</b>【輕量系統(tǒng) 環(huán)境搭建】 (基于<b class='flag-5'>Hi3861</b><b class='flag-5'>開(kāi)發(fā)板</b>)

    鴻蒙OpenHarmony【輕量系統(tǒng) 燒錄】 (基于Hi3861開(kāi)發(fā)板

    針對(duì)Hi3861開(kāi)發(fā)板,除了DevEco Device Tool
    的頭像 發(fā)表于 05-10 16:59 ?1122次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>OpenHarmony</b>【輕量系統(tǒng) 燒錄】 (基于<b class='flag-5'>Hi3861</b><b class='flag-5'>開(kāi)發(fā)板</b>)

    鴻蒙OpenHarmony【輕量系統(tǒng) 運(yùn)行】 (基于Hi3861開(kāi)發(fā)板

    由于Hi3861為WLAN模組,您可以在版本編譯及燒錄后,通過(guò)如下操作,使開(kāi)發(fā)板實(shí)現(xiàn)聯(lián)網(wǎng)功能。
    的頭像 發(fā)表于 05-10 16:38 ?694次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>OpenHarmony</b>【輕量系統(tǒng) 運(yùn)行】 (基于<b class='flag-5'>Hi3861</b><b class='flag-5'>開(kāi)發(fā)板</b>)

    盤(pán)點(diǎn)那些硬件+項(xiàng)目學(xué)習(xí)套件:Hi3861鴻蒙開(kāi)發(fā)板及入門(mén)常見(jiàn)問(wèn)題解答

    ,一個(gè)是鴻蒙應(yīng)用開(kāi)發(fā),一個(gè)是鴻蒙設(shè)備開(kāi)發(fā)。我們的Hi3861鴻蒙
    發(fā)表于 02-01 16:55

    Hi3861開(kāi)發(fā)板介紹

    介紹Hi3861 WLAN模組的開(kāi)發(fā)環(huán)境搭建、版本編譯構(gòu)建、燒錄、源碼修改、調(diào)試驗(yàn)證等方法。通過(guò)學(xué)習(xí),開(kāi)發(fā)者會(huì)對(duì)Hi3861 WLAN模組開(kāi)發(fā)
    發(fā)表于 09-21 15:15

    【視頻】設(shè)備開(kāi)發(fā)第5期:SDK集成指南

    本課程以Hi3861開(kāi)發(fā)板為例介紹了設(shè)備開(kāi)發(fā)時(shí)如何集成三方SDK,并結(jié)合官網(wǎng)文檔和開(kāi)源代碼展示了
    發(fā)表于 12-23 12:34

    如何使用 HiBurn 工具燒錄鴻蒙的 .bin 文件到 Hi3861 開(kāi)發(fā)板

    鴻蒙官方文檔的Hi3861開(kāi)發(fā)板第一個(gè)示例程序中描述了如何使用 DevEco Device Tool 工具燒錄二進(jìn)制文件到 Hi3861 開(kāi)發(fā)板
    的頭像 發(fā)表于 10-25 09:23 ?4676次閱讀

    基于鴻蒙系統(tǒng)+Hi3861的WiFi小車開(kāi)發(fā)

    本文簡(jiǎn)單介紹鴻蒙系統(tǒng) + Hi3861 的WiFi小車開(kāi)發(fā),適用于開(kāi)發(fā)潤(rùn)和Hi3861開(kāi)發(fā)板的小
    的頭像 發(fā)表于 03-03 09:31 ?5684次閱讀
    基于<b class='flag-5'>鴻蒙</b>系統(tǒng)+<b class='flag-5'>Hi3861</b>的WiFi小車<b class='flag-5'>開(kāi)發(fā)</b>

    自制Hi3861開(kāi)發(fā)板(附原理圖和電路圖)

    OpenHarmony的發(fā)展已經(jīng)進(jìn)入了新的階段,逐步把重點(diǎn)向富設(shè)備開(kāi)發(fā)方向。OpenHarmony 3.x的各大特性也是針對(duì)富設(shè)備來(lái)的,但是仍然支持輕量設(shè)備,如Hi3861芯片設(shè)備。于
    的頭像 發(fā)表于 04-14 10:23 ?1w次閱讀
    自制<b class='flag-5'>Hi3861</b><b class='flag-5'>開(kāi)發(fā)板</b>(附原理圖和電路圖)

    Hi3861編譯燒錄更快捷

    更快捷 Hi3861作為OpenHarmony社區(qū)Top級(jí)開(kāi)發(fā)板,相信很多鴻蒙智聯(lián)設(shè)備開(kāi)發(fā)者都在Linux上編譯燒錄過(guò)
    的頭像 發(fā)表于 02-11 13:25 ?929次閱讀

    潤(rùn)開(kāi)鴻Hi3861開(kāi)發(fā)板介紹

    Hi3861開(kāi)發(fā)板是一片大約2cm*5cm大小的開(kāi)發(fā)板,是一款高度集成的2.4GHz WLAN SoC芯片,集成IEEE 802.11b/g
    的頭像 發(fā)表于 04-27 10:59 ?3601次閱讀
    潤(rùn)開(kāi)鴻<b class='flag-5'>Hi3861</b><b class='flag-5'>開(kāi)發(fā)板</b>介紹

    中文編程鴻蒙Hi3861開(kāi)發(fā)基礎(chǔ)案例之-01創(chuàng)建新工程

    中文編程鴻蒙Hi3861開(kāi)發(fā)創(chuàng)建新工程
    的頭像 發(fā)表于 05-11 09:53 ?2737次閱讀
    中文編程<b class='flag-5'>鴻蒙</b><b class='flag-5'>Hi3861</b><b class='flag-5'>開(kāi)發(fā)</b>基礎(chǔ)案例之-01創(chuàng)建新工程

    中文編程鴻蒙Hi3861開(kāi)發(fā)基礎(chǔ)案例之-02LED燈控制

    中文編程鴻蒙Hi3861開(kāi)發(fā)控制LED燈
    的頭像 發(fā)表于 05-11 09:54 ?2917次閱讀
    中文編程<b class='flag-5'>鴻蒙</b><b class='flag-5'>Hi3861</b><b class='flag-5'>開(kāi)發(fā)</b>基礎(chǔ)案例之-02LED燈控制

    鴻蒙OpenHarmony南向:【Hi3861開(kāi)發(fā)板介紹】

    Hi3861開(kāi)發(fā)板是一片大約2cm*5cm大小的開(kāi)發(fā)板,是一款高度集成的2.4GHz WLAN SoC芯片,集成IEEE 802.11b/g
    的頭像 發(fā)表于 05-06 17:19 ?1108次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>OpenHarmony</b>南向:【<b class='flag-5'>Hi3861</b><b class='flag-5'>開(kāi)發(fā)板</b>介紹】
    RM新时代网站-首页