自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

OpenHarmony HDF HDI基礎(chǔ)能力分析與使用

系統(tǒng)
本文介紹了 HDI 的總體方案,重點(diǎn)介紹了 HDI 的 IPC 模式具體實(shí)現(xiàn)方法和驅(qū)動(dòng)框架能力,相信對(duì)讀者理解和使用 HDI 有所幫助。

[[423125]]

想了解更多內(nèi)容,請(qǐng)?jiān)L問:

51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)

https://harmonyos.51cto.com

HDI接口概述

回顧之前的文章,HDF 驅(qū)動(dòng)框架的一個(gè)重要功能是為系統(tǒng)提供穩(wěn)定的統(tǒng)一的硬件接口,這樣才能保證系統(tǒng)服務(wù)可以運(yùn)行在不同硬件上而不需要額外的適配工作,HDI(Hardware Device Interfaces)正是為了實(shí)現(xiàn)該目的而設(shè)計(jì)。

OpenHarmony HDF HDI基礎(chǔ)能力分析與使用-鴻蒙HarmonyOS技術(shù)社區(qū)

HDI 是對(duì)硬件功能的較高層次抽象接口,各類外設(shè)完成 HDI 接口定義后便只會(huì)在 HDI 的兼容性規(guī)則下進(jìn)行變更,從而保證接口的穩(wěn)定性。具體的驅(qū)動(dòng)實(shí)現(xiàn)不需要再重復(fù)定義 HDI 接口,只需要按需實(shí)現(xiàn)即可接入系統(tǒng)功能。

在不同量級(jí)的 OpenHarmony 系統(tǒng)上,HDI 存在兩種部署形態(tài),IPC 模式和直通模式。

OpenHarmony HDF HDI基礎(chǔ)能力分析與使用-鴻蒙HarmonyOS技術(shù)社區(qū)

在輕量級(jí) OpenHarmony 系統(tǒng)上,出于減小系統(tǒng)性能負(fù)載考慮,HDI 實(shí)現(xiàn)為用戶態(tài)共享庫,由系統(tǒng)服務(wù)直接加載 HDI 實(shí)現(xiàn)到自己進(jìn)程中函數(shù)調(diào)用使用。HDI 實(shí)現(xiàn)封裝具體的用戶態(tài)內(nèi)核態(tài)交互過程,當(dāng)需要訪問驅(qū)動(dòng)程序時(shí)使用 IO Service 請(qǐng)求將消息通過 system call 方式調(diào)用到內(nèi)核驅(qū)動(dòng)實(shí)現(xiàn)。

在標(biāo)準(zhǔn) OpenHarmony 系統(tǒng)上,HDI 以獨(dú)立服務(wù)進(jìn)程方式部署,系統(tǒng)服務(wù)只加載 HDI 客戶端實(shí)現(xiàn)到自己進(jìn)程中,實(shí)際業(yè)務(wù)運(yùn)行在獨(dú)立進(jìn)程中,客戶端通過 IPC 與服務(wù)端交互,便于架構(gòu)解耦、權(quán)限管理。

HDI接口實(shí)現(xiàn)

直通模式為函數(shù)實(shí)現(xiàn)方式,無論調(diào)用還是實(shí)現(xiàn)都不需要其他組件支持即可實(shí)現(xiàn),這里將重點(diǎn)分析 IPC 模式的實(shí)現(xiàn)。

HDI發(fā)布

OpenHarmony HDF HDI基礎(chǔ)能力分析與使用-鴻蒙HarmonyOS技術(shù)社區(qū)

HDI IPC 模式基于 OpenHarmony 系統(tǒng)通信框架的通用模型,但是因?yàn)轵?qū)動(dòng)很多時(shí)候涉及到底層操作和多系統(tǒng)遷移的場(chǎng)景而使用C語言編寫,所以驅(qū)動(dòng)框架還提供了 HDI 服務(wù)的 C 語言實(shí)現(xiàn)的基礎(chǔ)組件,C++ 實(shí)現(xiàn)則主要使用系統(tǒng)通信框架組件。

HDI 服務(wù)發(fā)布基于 UHDF(用戶態(tài) HDF 驅(qū)動(dòng)框架)實(shí)現(xiàn),通用的服務(wù)發(fā)布實(shí)現(xiàn)如下。

1. 實(shí)現(xiàn)驅(qū)動(dòng)入口

  1. int SampleDriverBind(struct HdfDeviceObject *deviceObject) 
  2.     HDF_LOGE("SampleDriverBind enter!"); 
  3.     static struct IDeviceIoService testService = { 
  4.         .Dispatch = SampleServiceDispatch, // 服務(wù)回調(diào)接口 
  5.     }; 
  6.     deviceObject->service = &testService; 
  7.     return HDF_SUCCESS; 
  8.   
  9. int SampleDriverInit(struct HdfDeviceObject *deviceObject) 
  10.     HDF_LOGE("SampleDriverInit enter"); 
  11.   
  12.     return HDF_SUCCESS; 
  13.   
  14. void SampleDriverRelease(struct HdfDeviceObject *deviceObject) 
  15.     HDF_LOGE("SampleDriverRelease enter"); 
  16.     return
  17.   
  18. struct HdfDriverEntry g_sampleDriverEntry = { 
  19.     .moduleVersion = 1, 
  20.     .moduleName = "sample_driver"
  21.     .Bind = SampleDriverBind, 
  22.     .Init = SampleDriverInit, 
  23.     .Release = SampleDriverRelease, 
  24. }; 
  25.  
  26. HDF_INIT(g_sampleDriverEntry); 

 首先要添加一個(gè) UHDF 驅(qū)動(dòng)用于發(fā)布 IoService 服務(wù),IoService 設(shè)備服務(wù)即為 HDI 服務(wù)實(shí)體。實(shí)現(xiàn)方式與 KHDF 驅(qū)動(dòng)一致。

2. 實(shí)現(xiàn)服務(wù)響應(yīng)接口

  1. int32_t SampleServiceOnRemoteRequest(struct HdfDeviceIoClient *client, int cmdId, 
  2.     struct HdfSBuf *data, struct HdfSBuf *reply) 
  3.     switch (cmdId) { 
  4.         case SAMPLE_SERVICE_PING: 
  5.             return SampleServiceStubPing(client, data, reply); 
  6.         … … 
  7.         default
  8.             HDF_LOGE("SampleServiceDispatch: not support cmd %d", cmdId); 
  9.             return HDF_ERR_INVALID_PARAM; 
  10.     } 
  11. static int32_t SampleServiceDispatch(struct HdfDeviceIoClient *client, int cmdId, 
  12.     struct HdfSBuf *data, struct HdfSBuf *reply) 
  13.     return SampleServiceOnRemoteRequest(client, cmdId, data, reply); 

當(dāng)收到 HDI 調(diào)用時(shí),服務(wù)響應(yīng)接口"SampleServiceDispatch"將會(huì)被調(diào)用。

  • client 調(diào)用者對(duì)象,在用戶態(tài)驅(qū)動(dòng)中暫時(shí)未支持
  • cmdId 調(diào)用命令字,用于區(qū)分調(diào)用的 API
  • data 調(diào)用入?yún)⑿蛄谢瘜?duì)象,在 IPC 調(diào)用場(chǎng)景為 parcel 對(duì)象的 C 語言封裝,入?yún)⑿枰褂眯蛄谢涌趶?data 對(duì)象中獲取后再使用
  • reply 調(diào)用出參對(duì)象,需要返回給調(diào)用的信息寫入該序列化對(duì)象

如果 C++ 實(shí)現(xiàn)客戶端可以使用下面接口將 sbuf 對(duì)象轉(zhuǎn)換為 parcel 對(duì)象后操作:

  1. int32_t SbufToParcel(struct HdfSBuf *sbuf, OHOS::MessageParcel **parcel); 

3. UHDF 驅(qū)動(dòng)配置

  1. platform :: host { 
  2.     hostName = "sample_host"
  3.     priority = 50; 
  4.     sample_device :: device { 
  5.         device0 :: deviceNode { 
  6.             policy = 2; 
  7.             priority = 100; 
  8.             moduleName = "libsample_driver.z.so"
  9.             serviceName = "sample_driver_service"
  10.         } 
  11.     } 

參數(shù)說明:

  • host 一個(gè) host 節(jié)點(diǎn)即為一個(gè)獨(dú)立進(jìn)程,如果需要獨(dú)立進(jìn)程,新增屬于自己的 host 節(jié)點(diǎn)
  • policy 服務(wù)發(fā)布策略,HDI 服務(wù)設(shè)置為 2
  • moduleName 驅(qū)動(dòng)實(shí)現(xiàn)庫名
  • serviceName 服務(wù)名稱,請(qǐng)保持全局唯一性

因?yàn)?HDI 服務(wù) C 和 C++ 實(shí)現(xiàn)使用的 IPC 組件不一樣,面向?qū)ο髮?shí)現(xiàn)也不一致,所以在具體實(shí)現(xiàn)上存在一些差異。

HDI基礎(chǔ)組件

UHDF 框架為了支持 HDI 實(shí)現(xiàn),提供了以下基礎(chǔ)組件(僅用于 C 語言 HDI 實(shí)現(xiàn)):

SBuf

SBuf 是同時(shí)支持 KHDF 和 UHDF 驅(qū)動(dòng) IoService 消息序列化的工具對(duì)象。在 UHDF IPC 通信場(chǎng)景中,SBuf 可以與系統(tǒng) IPC 框架序列化對(duì)象 MessageParcel 對(duì)象(僅支持 C++ )相互轉(zhuǎn)換,從而實(shí)現(xiàn) C 和 C++ 實(shí)現(xiàn)的 IPC 互通。

常用 API 如下:

  1. struct HdfSBuf; 
  2. struct HdfSbufImpl; 
  3. struct HdfRemoteService; 
  4.  
  5. /** 
  6.  * @brief HdfSBuf類型定義。 
  7.  * 
  8.  * @since 1.0 
  9.  */ 
  10. enum HdfSbufType { 
  11.     SBUF_RAW = 0,   /* 用于用戶態(tài)內(nèi)核態(tài)通信的sbuf類型 */ 
  12.     SBUF_IPC,       /* 用于跨進(jìn)程通信的sbuf類型 */ 
  13.     SBUF_IPC_HW,    /* 用于擴(kuò)展的預(yù)留類型 */ 
  14.     SBUF_TYPE_MAX,  /* sbuf類型最大值 */ 
  15. }; 
OpenHarmony HDF HDI基礎(chǔ)能力分析與使用-鴻蒙HarmonyOS技術(shù)社區(qū)

上述接口均有對(duì)應(yīng)的寫入接口,不再一一列舉,可查閱官網(wǎng)API參考文檔。

RemoteService

RemoteService 對(duì)象和系統(tǒng) IPC 框架中的 IRemoteObject 對(duì)象(僅支持 C++)對(duì)應(yīng)并可以相互轉(zhuǎn)換,表示一個(gè) IPC 對(duì)象。相關(guān) API 說明:

  1. // 消息分發(fā)器,用于服務(wù)端響應(yīng)調(diào)用或者在客戶端發(fā)起調(diào)用 
  2. struct HdfRemoteDispatcher { 
  3.     int (*Dispatch)(struct HdfRemoteService *, int, struct HdfSBuf *, struct HdfSBuf *); 
  4. }; 
  5.  
  6. // RemoteService 死亡回調(diào)對(duì)象 
  7. struct HdfDeathRecipient { 
  8.     void (*OnRemoteDied)(struct HdfDeathRecipient *, struct HdfRemoteService *); 
  9. }; 
  10.  
  11. struct HdfRemoteService { 
  12.     struct HdfObject object_; 
  13.     struct HdfObject *target; 
  14.     struct HdfRemoteDispatcher *dispatcher; 
  15.     bool isHw; 
  16. }; 
  17. // 以自定義的消息分發(fā)器實(shí)例化一個(gè)RemoteService 
  18. struct HdfRemoteService *HdfRemoteServiceObtain( 
  19.     struct HdfObject *object, struct HdfRemoteDispatcher *dispatcher); 
  20.  
  21. // 回收RemoteService對(duì)象 
  22. void HdfRemoteServiceRecycle(struct HdfRemoteService *service); 
  23.  
  24. // 添加RemoteService的死亡通知,如果對(duì)應(yīng)RemoteService的進(jìn)程異常退出,HdfDeathRecipient的回調(diào)接口將被調(diào)用 
  25. void HdfRemoteServiceAddDeathRecipient(struct HdfRemoteService *service, struct HdfDeathRecipient *recipient); 

 基于 RemoteService 實(shí)現(xiàn)一個(gè)服務(wù)端的示例:

  1. int SampleServiceStubDispatch( 
  2.     struct HdfRemoteService* service, int code, struct HdfSBuf *data, struct HdfSBuf *reply) 
  3.     // IPC 調(diào)用響應(yīng)接口 
  4.     int ret = HDF_FAILURE; 
  5.     switch (code) { 
  6.         case SAMPLE_IF_0: { 
  7.             // do something 
  8.             break; 
  9.         } 
  10.         default: { 
  11.             ret = HDF_ERR_INVALID_PARAM; 
  12.         } 
  13.     } 
  14.     return ret; 
  15. bool SampleStubConstruct() 
  16.     // 構(gòu)造消息分發(fā)器,實(shí)現(xiàn)消息處理回調(diào) 
  17.     static struct HdfRemoteDispatcher dispatcher = { 
  18.         .Dispatch = SampleServiceStubDispatch 
  19. }; 
  20. // 實(shí)例化RemoteService 
  21.     inst->remote = HdfRemoteServiceObtain((struct HdfObject *)inst, &dispatcher); 
  22.     if (inst->remote == NULL) { 
  23.         HDF_LOGE("Device service manager failed to obtain remote service"); 
  24.         return false
  25. … … 

直接基于 RemoteService 實(shí)現(xiàn)服務(wù)端只適用于需要實(shí)現(xiàn)匿名 IPC 服務(wù)的情況,基于 UHDF 發(fā)布 HDI 服務(wù)只需要實(shí)現(xiàn) Driver 綁定的 IoService 即可。

RemoteService 客戶端對(duì)象只能從 SBuf HdfSBufReadRemoteService 接口獲取。

HDI實(shí)現(xiàn)

OpenHarmony HDF HDI基礎(chǔ)能力分析與使用-鴻蒙HarmonyOS技術(shù)社區(qū)
  • Driver 為 HDI 服務(wù)的驅(qū)動(dòng)入口實(shí)現(xiàn)
  • IoService 為 HDI 服務(wù)的服務(wù)入口實(shí)現(xiàn),IoService 的 Dispatch 方法中調(diào)用 ServiceStub 中的真正服務(wù)響應(yīng)接口(OnRemoteRequest)
  • ServiceStub 為服務(wù)端實(shí)現(xiàn)對(duì)象,主要處理與 IPC 相關(guān)的業(yè)務(wù)邏輯,在這里完成參數(shù)反序列化后調(diào)用真正的 Service 實(shí)現(xiàn)接口,即 ServiceImpl 接口
  • ServiceImpl 為 HDI 接口的真正實(shí)現(xiàn),這里不關(guān)注 IPC 過程,只實(shí)現(xiàn)函數(shù)接口。
  • 驅(qū)動(dòng)框架提供了實(shí)現(xiàn)的樣例代碼,可參考 gitee driver 代碼倉。

HDI接口調(diào)用

HDI驅(qū)動(dòng)框架HDI接口

HDI 服務(wù)管理功能由驅(qū)動(dòng)框架 DeviceManager 實(shí)現(xiàn),所以驅(qū)動(dòng)框架提供了 HDI 服務(wù)管理相關(guān) HDI 接口。

C++實(shí)現(xiàn):

  1. namespace OHOS { 
  2. namespace HDI { 
  3. namespace ServiceManager { 
  4. namespace V1_0 { 
  5.  
  6. struct IServiceManager : public IRemoteBroker { 
  7. public
  8.     DECLARE_INTERFACE_DESCRIPTOR(u"HDI.IServiceManager.V1_0"); 
  9.     // get()靜態(tài)方法用于獲取IServiceManager對(duì)象實(shí)例 
  10.     static ::OHOS::sptr<IServiceManager> Get(); 
  11.     // GetService()接口是真正提供的HDI接口,用于查詢并獲取其他HDI服務(wù)的客戶端對(duì)象 
  12.     virtual ::OHOS::sptr<IRemoteObject> GetService(const char* serviceName) = 0; 
  13. }; 
  14. } // namespace V1_0 
  15. } // namespace ServiceManager 
  16. } // namespace HDI 
  17. } // namespace OHOS 

C 實(shí)現(xiàn):

  1. #ifdef __cplusplus 
  2. extern "C" { 
  3. #endif /* __cplusplus */ 
  4.  
  5. struct HDIServiceManager { 
  6.     struct HdfRemoteService *remote; 
  7.  
  8.     struct HdfRemoteService *(*GetService)(struct HDIServiceManager *self, const char* serviceName); 
  9. }; 
  10.  
  11. struct HDIServiceManager *HDIServiceManagerGet(void); 
  12. void HDIServiceManagerRelease(struct HDIServiceManager *servmgr); 
  13.  
  14. #ifdef __cplusplus 
  15. #endif /* __cplusplus */ 

C 語言因?yàn)槿鄙僭拿嫦驅(qū)ο笾С郑@里我們采用 OOC 的實(shí)現(xiàn),函數(shù)方法 HDIServiceManagerGet/Release 用于 HDIServiceManager 對(duì)象的實(shí)例化和釋放,HDI 接口關(guān)聯(lián)在接口對(duì)象內(nèi)部成員中,與 C++實(shí)現(xiàn)類似。

HDI客戶端實(shí)現(xiàn)

OpenHarmony HDF HDI基礎(chǔ)能力分析與使用-鴻蒙HarmonyOS技術(shù)社區(qū)

HDI 客戶端同時(shí)支持 C 和 C++ 實(shí)現(xiàn),實(shí)現(xiàn)方法較為簡單,只需 realize HDI 接口類即可。提供 C++ 實(shí)現(xiàn)基于系統(tǒng) IPC 子系統(tǒng)的統(tǒng)一模型,C 語言基于 RemoteService 和 SBuf 組件實(shí)現(xiàn),但是有一些公共的約定:

客戶端提供接口對(duì)象,接口與對(duì)象綁定且必須與 HDI 一致

提供服務(wù)接口對(duì)象的實(shí)例化和釋放接口。

客戶端實(shí)現(xiàn) IPC 過程,只為調(diào)用者暴露函數(shù)化接口。

HDI接口調(diào)用

HDI 客戶端接口已經(jīng)提供了服務(wù)獲取接口,調(diào)用者調(diào)用服務(wù)獲取接口后再調(diào)用服務(wù)對(duì)象方法即可完成 HDI 調(diào)用。

這里以服務(wù)管理 HDI 接口為例:

C++接口調(diào)用:

  1. #include <iservmgr_hdi.h> 
  2.  
  3. void GetTestService() 
  4.      
  5.     auto servmgr = IServiceManager::Get(); 
  6.     if (servmgr == nullptr) { 
  7.     HDF_LOGE("failed to get IServiceManager"); 
  8.     return
  9.   } 
  10.  
  11.     auto sampleService = servmgr->GetService(TEST_SERVICE_NAME); 
  12.   if (sampleService == nullptr) { 
  13.     HDF_LOGE("failed to get TEST_SERVICE"); 
  14.     return
  15.   } 
  16.     // do something 

C 接口調(diào)用:

  1. #include <servmgr_hdi.h> 
  2.  
  3. void GetTestService() 
  4.      
  5.     struct HDIServiceManager *servmgr = HDIServiceManagerGet(); 
  6.     if (servmgr == nullptr) { 
  7.     HDF_LOGE("failed to get IServiceManager"); 
  8.     return
  9.   } 
  10.  
  11.     struct HdfRemoteService *sampleService = servmgr->GetService(servmgr, TEST_SERVICE_NAME); 
  12.   if (sampleService == nullptr) { 
  13.     HDF_LOGE("failed to get TEST_SERVICE"); 
  14.     return
  15.   } 
  16.     // do something 

 總結(jié)

本文介紹了 HDI 的總體方案,重點(diǎn)介紹了 HDI 的 IPC 模式具體實(shí)現(xiàn)方法和驅(qū)動(dòng)框架能力,相信對(duì)讀者理解和使用 HDI 有所幫助。

想了解更多內(nèi)容,請(qǐng)?jiān)L問:

51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)

https://harmonyos.51cto.com

 

責(zé)任編輯:jianghua 來源: 鴻蒙社區(qū)
相關(guān)推薦

2021-09-10 15:12:04

鴻蒙HarmonyOS應(yīng)用

2021-09-08 15:09:29

鴻蒙HarmonyOS應(yīng)用

2022-03-24 15:00:09

Harmony編解碼鴻蒙

2023-09-06 15:35:14

2023-09-14 15:49:42

PWM鴻蒙

2021-09-07 15:48:28

鴻蒙HarmonyOS應(yīng)用

2022-04-20 20:28:40

HDF 驅(qū)動(dòng)框架鴻蒙操作系統(tǒng)

2023-09-13 15:33:57

I2C鴻蒙

2023-08-17 15:01:08

ArkUI布局渲染

2022-09-05 15:18:23

HDF單鏈表嵌入式系統(tǒng)

2023-03-20 16:05:49

HDF傳感器驅(qū)動(dòng)開發(fā)

2023-10-27 06:33:14

鴻蒙開發(fā)套件

2022-06-02 14:27:05

UI框架JS

2022-10-17 14:29:24

鴻蒙應(yīng)用開發(fā)

2022-04-29 10:06:20

SCA風(fēng)險(xiǎn)漏洞

2022-03-18 15:29:02

Harmony鴻蒙架構(gòu)

2022-06-08 10:17:51

服務(wù)管理通信
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)