在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

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

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

鴻蒙HDF架構(gòu):DeviceManager如何生成所有的host配套設(shè)施

鴻蒙系統(tǒng)HarmonyOS ? 來源:oschina ? 作者:悠然紅茶侯亮 ? 2020-10-14 14:01 ? 次閱讀

我們闡述了在啟動(dòng)DeviceManager這個(gè)核心服務(wù)時(shí),是如何生成所有的host配套設(shè)施的,下面我們來進(jìn)一步剖析細(xì)節(jié)。

我們已經(jīng)知道,一個(gè)Host對(duì)應(yīng)一個(gè)DevHostServiceClnt和一個(gè)DevHostService,很明顯主要行為都包含在后者內(nèi)部。當(dāng)后者啟動(dòng)時(shí),會(huì)執(zhí)行到DriverInstallerStartDeviceHost(),該函數(shù)又會(huì)調(diào)用DevHostServiceStartServie(),這些內(nèi)容在前一篇文章里都說過。

我們不用去想太多調(diào)用細(xì)節(jié),反正說起來就是要讓一個(gè)DevHostServiceClnt和一個(gè)DevHostService“掛接”(attach)起來,掛接的動(dòng)作里會(huì)進(jìn)一步在DevHostService里安裝設(shè)備驅(qū)動(dòng)。這個(gè)掛接動(dòng)作具體對(duì)應(yīng)的函數(shù)就是DevmgrServiceClntAttachDeviceHost()。在上一篇文章里,我們沒有展開講這個(gè)函數(shù),現(xiàn)在就從它說起。為了便于閱讀,我將掛接動(dòng)作的調(diào)用順序先繪制出來,如下圖所示:

1.掛接device Host

我用黃色框表達(dá)了DevmgrServiceClntAttachDeviceHost()一步,該函數(shù)代碼截選如下:

【drivers/hdf/frameworks/core/host/src/Devmgr_service_clnt.c】

int DevmgrServiceClntAttachDeviceHost(uint16_t hostId, struct IDevHostService *hostService)

{

struct IDevmgrService *devMgrSvcIf = NULL;

。 . 。 . 。 .

devMgrSvcIf = inst-》devMgrSvcIf;

。 . 。 . 。 .

// 實(shí)際調(diào)用的是DevmgrServiceAttachDeviceHost()

return devMgrSvcIf-》AttachDeviceHost(devMgrSvcIf, hostId, hostService);

}

最后一句實(shí)際調(diào)用的是DevmgrServiceAttachDeviceHost(),代碼截選如下:

【drivers/hdf/frameworks/core/manager/src/Devmgr_service.c】

static int DevmgrServiceAttachDeviceHost(

struct IDevmgrService *inst, uint16_t hostId, struct IDevHostService *hostService)

{

struct DevHostServiceClnt *hostClnt = DevmgrServiceFindDeviceHost(inst, hostId);

。 . 。 . 。 .

hostClnt-》deviceInfos = HdfAttributeManagerGetDeviceList(hostClnt-》hostId, hostClnt-》hostName);

。 . 。 . 。 .

hostClnt-》hostService = hostService;

return DevHostServiceClntInstallDriver(hostClnt);

}

首先,遍歷DevmgrService的hosts列表,根據(jù)hostId找到對(duì)應(yīng)的DevHostServiceClnt對(duì)象,并給該DevHostServiceClnt對(duì)象的deviceInfos域和hostService域賦值,然后調(diào)用重頭戲DevHostServiceClntInstallDriver()。

在獲取這個(gè)host范疇的所有device信息時(shí),也是去查詢上一篇文章提到的配置樹,樹節(jié)點(diǎn)的類型為DeviceResourceNode,只不過上一次系統(tǒng)是去查找具有“hdf_manager”屬性的節(jié)點(diǎn),而此次是查找名字為hostName的節(jié)點(diǎn),這個(gè)節(jié)點(diǎn)里包含著若干設(shè)備的信息,現(xiàn)在這些設(shè)備信息會(huì)被組織成一個(gè)HdfDeviceInfo鏈表。最終形成下面圖中的結(jié)構(gòu):

1.1安裝host范疇內(nèi)的設(shè)備驅(qū)動(dòng)

1.1.1在每個(gè)host的DevHostService里添加設(shè)備

Attach動(dòng)作的最后一步就是安裝驅(qū)動(dòng)啦,我們看一下這個(gè)DevHostServiceClntInstallDriver()函數(shù):

【drivers/hdf/frameworks/core/manager/src/Devhost_service_clnt.c】

int DevHostServiceClntInstallDriver(struct DevHostServiceClnt *hostClnt)

{

。 . 。 . 。 .

struct HdfSListIterator it;

struct HdfDeviceInfo *deviceInfo = NULL;

struct IDevHostService *devHostSvcIf = NULL;

。 . 。 . 。 .

devHostSvcIf = (struct IDevHostService *)hostClnt-》hostService;

。 . 。 . 。 .

HdfSListIteratorInit(&it, hostClnt-》deviceInfos);

while (HdfSListIteratorHasNext(&it)) {

deviceInfo = (struct HdfDeviceInfo *)HdfSListIteratorNext(&it);

if ((deviceInfo == NULL) || (deviceInfo-》preload != DEVICE_PRELOAD_ENABLE)) {

continue;

}

// 實(shí)際調(diào)用的是 DevHostServiceAddDevice()

ret = devHostSvcIf-》AddDevice(devHostSvcIf, deviceInfo);

。 . 。 . 。 .

}

return HDF_SUCCESS;

}

其實(shí)就是遍歷一下該host范疇內(nèi)的所有HdfDeviceInfo節(jié)點(diǎn),如果節(jié)點(diǎn)的preload是“使能”的,就執(zhí)行對(duì)應(yīng)的AddDevice操作,即DevHostServiceAddDevice()函數(shù),其代碼截選如下:

【drivers/hdf/frameworks/core/host/src/Devhost_service.c】

static int DevHostServiceAddDevice(struct IDevHostService *inst,

const struct HdfDeviceInfo *deviceInfo)

{

int ret = HDF_FAILURE;

struct HdfDevice *device = NULL;

struct HdfDeviceNode *devNode = NULL;

struct DevHostService *hostService = (struct DevHostService *)inst;

struct IDriverLoader *driverLoader = HdfDriverLoaderGetInstance();

。 . 。 . 。 .

device = DevHostServiceGetDevice(hostService, deviceInfo-》deviceId);

。 . 。 . 。 .

// 實(shí)際調(diào)用的是 HdfDriverLoaderLoadNode()

devNode = driverLoader-》LoadNode(driverLoader, deviceInfo);

。 . 。 . 。 .

devNode-》hostService = hostService;

// 實(shí)際調(diào)用的是 HdfDeviceAttach()

ret = device-》super.Attach(&device-》super, devNode);

。 . 。 . 。 .

return HDF_SUCCESS;

。 . 。 . 。 .

}

在這個(gè)函數(shù)里,先調(diào)用DevHostServiceGetDevice()嘗試從DevHostService的devices列表里查找與deviceId匹配的節(jié)點(diǎn),如果找不到就創(chuàng)建一個(gè)新HdfDevice節(jié)點(diǎn),并插入該列表。

當(dāng)然,一開始devices列表是個(gè)空列表,此時(shí)只會(huì)創(chuàng)建新節(jié)點(diǎn)。反正經(jīng)此一步,我們一般可以拿到一個(gè)可用的HdfDevice對(duì)象。接著利用驅(qū)動(dòng)加載器加載一個(gè)和deviceInfo匹配的HdfDeviceNode節(jié)點(diǎn)。最后還需把得到的HdfDevice和HdfDeviceNode掛接起來。

1.1.1.1加載HdfDeviceNode

加載HdfDeviceNode的動(dòng)作實(shí)際上是HdfDriverLoaderLoadNode(),代碼截選如下:

【drivers/hdf/frameworks/core/host/src/Hdf_driver_loader.c】

static struct HdfDeviceNode *HdfDriverLoaderLoadNode(

struct IDriverLoader *loader, const struct HdfDeviceInfo *deviceInfo)

{

struct HdfDriverEntry *driverEntry = NULL;

struct HdfDeviceNode *devNode = NULL;

。 . 。 . 。 .

// 實(shí)際調(diào)用的是 HdfDriverLoaderGetDriverEntry()

driverEntry = loader-》GetDriverEntry(deviceInfo);

。 . 。 . 。 .

devNode = HdfDeviceNodeNewInstance();

。 . 。 . 。 .

devNode-》driverEntry = driverEntry;

devNode-》deviceInfo = deviceInfo;

devNode-》deviceObject.property = HcsGetNodeByMatchAttr(HcsGetRootNode(),

deviceInfo-》deviceMatchAttr);

。 . 。 . 。 .

if ((deviceInfo-》policy == SERVICE_POLICY_PUBLIC) || (deviceInfo-》policy == SERVICE_POLICY_CAPACITY)) {

。 . 。 . 。 .

if (driverEntry-》Bind(&devNode-》deviceObject) != 0) {

HDF_LOGE(“bind driver failed”);

HdfDeviceNodeFreeInstance(devNode);

return NULL;

}

}

return devNode;

}

HdfDeviceNode的定義如下:

【drivers/hdf/frameworks/core/host/include/Hdf_device_node.h】

struct HdfDeviceNode {

struct IDeviceNode super;

struct HdfSListNode entry;

struct PowerStateToken *powerToken;

struct DevHostService *hostService;

struct HdfDeviceObject deviceObject;

struct IHdfDeviceToken *token;

struct HdfDriverEntry *driverEntry;

const struct HdfDeviceInfo *deviceInfo;

};

可以看到,驅(qū)動(dòng)加載器在創(chuàng)建HdfDeviceNode節(jié)點(diǎn)時(shí),還是有一些工作要做的:

1)得加載相應(yīng)設(shè)備的驅(qū)動(dòng)程序入口,最終體現(xiàn)為HdfDriverEntry;

2)創(chuàng)建一個(gè)HdfDeviceNode對(duì)象,經(jīng)過研究,我們可以看到最終創(chuàng)建的其實(shí)是HdfDeviceNode的派生類(DeviceNodeExt)對(duì)象;

3)把HdfDeviceNode節(jié)點(diǎn)和設(shè)備驅(qū)動(dòng)程序綁定起來;

1.1.1.1.1獲取驅(qū)動(dòng)入口

驅(qū)動(dòng)加載器獲取HdfDriverEntry的實(shí)際動(dòng)作是HdfDriverLoaderGetDriverEntry():

【drivers/hdf/lite/manager/src/Lite_driver_loader.c】

struct HdfDriverEntry *HdfDriverLoaderGetDriverEntry(

const struct HdfDeviceInfo *deviceInfo)

{

int count = (int) (((uint8_t *)(HDF_DRIVER_END()) - (uint8_t *)(HDF_DRIVER_BEGIN())) / sizeof(size_t));

size_t *addrBegin = (size_t*)(HDF_DRIVER_BEGIN());

if ((deviceInfo == NULL) || (deviceInfo-》moduleName == NULL) || (deviceInfo-》svcName == NULL)) {

HDF_LOGE(“Hdf get device entry failed, input deviceInfo is NULL!”);

return NULL;

}

for (int i = 0; i 《 count; i++) {

struct HdfDriverEntry *driverEntry = (struct HdfDriverEntry *)(*addrBegin);

if (strcmp(deviceInfo-》moduleName, driverEntry-》moduleName) == 0) {

return driverEntry;

}

addrBegin++;

}

HDF_LOGE(“Hdf get %s device entry failed!”, deviceInfo-》svcName);

return NULL;

}

其中,HdfDriverEntry的定義如下:

【drivers/hdf/frameworks/include/core/Hdf_device_desc.h】

struct HdfDriverEntry {

int32_t moduleVersion;

const char *moduleName;

int32_t (*Bind)(struct HdfDeviceObject *deviceObject);

int32_t (*Init)(struct HdfDeviceObject *deviceObject);

void (*Release)(struct HdfDeviceObject *deviceObject);

};

現(xiàn)在我們來解釋一下,HdfDriverLoaderGetDriverEntry()到底在干什么。我們?cè)O(shè)想,HDF會(huì)先加載需要的所有驅(qū)動(dòng)程序,每個(gè)驅(qū)動(dòng)程序內(nèi)部都會(huì)構(gòu)造一個(gè)HdfDriverEntry對(duì)象,而且會(huì)填好那個(gè)Bind域,這其實(shí)就是在填寫一個(gè)回調(diào)函數(shù)指針,當(dāng)然,也只有驅(qū)動(dòng)程序自己知道該填寫哪個(gè)函數(shù)指針。

HDF會(huì)把加載的所有驅(qū)動(dòng)的HdfDriverEntry對(duì)象的起始地址匯總起來,形成一個(gè)類似地址數(shù)組的東西,這個(gè)數(shù)組的第一項(xiàng)的地址對(duì)應(yīng)上面代碼中的HDF_DRIVER_BEGIN(),最后一項(xiàng)的地址對(duì)應(yīng)HDF_DRIVER_END()(最后一項(xiàng)不填內(nèi)容)。示意圖如下:

獲取驅(qū)動(dòng)入口時(shí),就是在遍歷這個(gè)指針數(shù)組,查詢與moduleName匹配的節(jié)點(diǎn)。

1.1.1.1.2 創(chuàng)建HdfDeviceNode對(duì)象

接著嘗試創(chuàng)建HdfDeviceNode對(duì)象,此時(shí)調(diào)用的HdfDeviceNodeNewInstance()函數(shù)如下:

【drivers/hdf/frameworks/core/host/src/Hdf_device_node.c】

struct HdfDeviceNode *HdfDeviceNodeNewInstance()

{

return (struct HdfDeviceNode *)HdfObjectManagerGetObject(HDF_OBJECT_ID_DEVICE_SERVICE);

}

又需要去查我們熟悉的對(duì)象創(chuàng)建表(g_liteObjectCreators),最終查到會(huì)調(diào)用DeviceNodeExtCreate():

【drivers/hdf/lite/manager/src/Hdf_device_node_ext.c】

struct HdfObject *DeviceNodeExtCreate()

{

struct DeviceNodeExt *instance =

(struct DeviceNodeExt *)OsalMemCalloc(sizeof(struct DeviceNodeExt));

if (instance != NULL) {

DeviceNodeExtConstruct(instance);

instance-》ioService = NULL;

}

return (struct HdfObject *)instance;

}

可以看到,實(shí)際創(chuàng)建的是一個(gè)DeviceNodeExt對(duì)象。DeviceNodeExt繼承于HdfDeviceNode,定義如下:

【drivers/hdf/lite/include/manager/Hdf_device_node_ext.h】

struct DeviceNodeExt {

struct HdfDeviceNode super;

struct HdfIoService *ioService;

};

其構(gòu)造函數(shù)如下:

【drivers/hdf/lite/manager/src/Hdf_device_node_ext.c】

static void DeviceNodeExtConstruct(struct DeviceNodeExt *inst)

{

struct IDeviceNode *nodeIf = (struct IDeviceNode *)inst;

if (nodeIf != NULL) {

HdfDeviceNodeConstruct(&inst-》super);

nodeIf-》PublishService = DeviceNodeExtPublishService;

}

}

注意,它修改了繼承來的PublishService域,將函數(shù)指針設(shè)為DeviceNodeExtPublishService了。

HdfDriverLoaderLoadNode()會(huì)給DeviceNodeExt的driverEntry域、deviceInfo域、deviceObject.property賦值,那么在進(jìn)行綁定之前,DeviceNodeExt的示意圖大概是這樣的:

1.1.1.1.3 綁定驅(qū)動(dòng)入口

接下來要將剛剛創(chuàng)建的DeviceNodeExt節(jié)點(diǎn)和驅(qū)動(dòng)入口綁定起來:

driverEntry-》Bind(&devNode-》deviceObject)

前文我們已經(jīng)說了,每個(gè)程序會(huì)實(shí)現(xiàn)自己的Bind動(dòng)作,而HDF只負(fù)責(zé)回調(diào)Bind。注意,回調(diào)時(shí)HDF需要傳入DeviceNodeExt節(jié)點(diǎn)的deviceObject部分的指針,因?yàn)樾枰?qū)動(dòng)程序填寫其中的域。當(dāng)然,我們從上圖中可以看到,deviceObject部分只剩下service域(IDeviceIoService*)需要填寫。那么很明顯,一個(gè)驅(qū)動(dòng)程序要能被HDF使用,那么它就得包含一個(gè)IDeviceIoService對(duì)象。IDeviceIoService的定義如下:

【drivers/hdf/frameworks/include/core/Hdf_device_desc.h】

struct IDeviceIoService {

struct HdfObject object;

int32_t (*Open)(struct HdfDeviceIoClient *client);

int32_t (*Dispatch)(struct HdfDeviceIoClient *client, int cmdId, struct HdfSBuf *data,

struct HdfSBuf *reply);

void (*Release)(struct HdfDeviceIoClient *client);

};

現(xiàn)在我們可以基于前文示意圖,繪制一張DeviceNodeExt和驅(qū)動(dòng)程序綁定后的示意圖了,如下圖:

1.1.1.2 掛接HdfDeviceNode

DevHostServiceAddDevice()在加載好DeviceNodeExt之后,調(diào)用了一句Attach:

ret = device-》super.Attach(&device-》super, devNode);

嘗試把HdfDevice節(jié)點(diǎn)和DeviceNodeExt聯(lián)系起來,這一句其實(shí)是調(diào)用HdfDeviceAttach(),相關(guān)代碼如下:

【drivers/hdf/frameworks/core/host/include/Hdf_device.h】

struct IHdfDevice {

struct HdfObject object;

int (*Attach)(struct IHdfDevice *, struct HdfDeviceNode *);

};

struct HdfDevice {

struct IHdfDevice super;

struct HdfSListNode node;

struct HdfSList services;

uint16_t deviceId;

uint16_t hostId;

};

【drivers/hdf/frameworks/core/host/src/Hdf_device.c】

static int HdfDeviceAttach(struct IHdfDevice *devInst, struct HdfDeviceNode *devNode)

{

struct HdfDevice *device = (struct HdfDevice *)devInst;

struct IDeviceNode *nodeIf = (struct IDeviceNode *)devNode;

。 . 。 . 。 .

HdfSListAdd(&device-》services, &devNode-》entry);

// 實(shí)際調(diào)用的是 HdfDeviceLaunchNode()

return nodeIf-》LaunchNode(devNode, devInst);

}

代碼里先將DeviceNodeExt添加進(jìn)HdfDevice的services列表里,然后調(diào)用了HdfDeviceLaunchNode()。

我們前文已經(jīng)說過,HdfDevice節(jié)點(diǎn)在之前已經(jīng)添加進(jìn)DevHostService的devices列表了,現(xiàn)在它又和DeviceNodeExt聯(lián)系起來了,再結(jié)合前文中的知識(shí),我們可以畫一張大一點(diǎn)兒的關(guān)系示意圖了,如下:

至此,相信大家已經(jīng)基本了解掛接設(shè)備host所形成的數(shù)據(jù)結(jié)構(gòu)了,正如上圖所示,每個(gè)host都會(huì)對(duì)應(yīng)上圖中紅、綠、藍(lán)三個(gè)范疇。大家不妨自己試著畫畫這張圖,看看還會(huì)發(fā)現(xiàn)什么。至于HDF的其他方面,我們可以在其他文章里再探討。
編輯:hfy

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

    關(guān)注

    3

    文章

    4372

    瀏覽量

    64295
  • 設(shè)備驅(qū)動(dòng)

    關(guān)注

    0

    文章

    68

    瀏覽量

    11104
  • 鴻蒙系統(tǒng)
    +關(guān)注

    關(guān)注

    183

    文章

    2641

    瀏覽量

    67762
收藏 人收藏

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    鴻蒙5開發(fā)寶藏案例分享---應(yīng)用架構(gòu)實(shí)戰(zhàn)技巧

    鴻蒙應(yīng)用架構(gòu)實(shí)戰(zhàn):分層設(shè)計(jì)與線程通信詳解 大家好! 今天咱們聊聊鴻蒙開發(fā)中那些“官方文檔提了但實(shí)際開發(fā)難找”的架構(gòu)設(shè)計(jì)技巧。結(jié)合官方文檔(鏈接1、鏈接2),我會(huì)用 真實(shí)代碼案例+通俗講
    發(fā)表于 06-12 16:14

    Kuikly鴻蒙版正式開源 —— 揭秘卓越性能適配之旅

    端的基礎(chǔ)能力和設(shè)施,包括豐富的跨端組件,完善的調(diào)試、構(gòu)建、發(fā)布、監(jiān)控配套工具鏈,穩(wěn)定性監(jiān)控能力等。 Kuikly框架優(yōu)勢(shì): 一碼五端,支持Android、iOS、鴻蒙、Web、小程序5個(gè)平臺(tái)(Web
    發(fā)表于 06-04 16:46

    迅為RK3568開發(fā)板實(shí)操-HDF驅(qū)動(dòng)配置UART-修改HCS配置

    deviceMatchAttr 的值表示驅(qū)動(dòng)的私有配置信息 5 serviceName 表示服務(wù)名稱,服務(wù)加載成功之后會(huì)在開發(fā)板的/dev/目錄下生成節(jié)點(diǎn)。例如 HDF_PLATFORM_UART_9 后面跟著的數(shù)據(jù) 9 是 UartOpen()的端口號(hào)
    發(fā)表于 05-22 11:32

    DevEco Studio AI輔助開發(fā)工具兩大升級(jí)功能 鴻蒙應(yīng)用開發(fā)效率再提升

    HarmonyOS應(yīng)用的AI智能輔助開發(fā)助手——CodeGenie,該AI助手深度集成在DevEco Studio中,提供鴻蒙知識(shí)智能問答、鴻蒙ArkTS代碼補(bǔ)全/生成和萬能卡片生成
    發(fā)表于 04-18 14:43

    【北京迅為】iTOP-RK3568開發(fā)板鴻蒙OpenHarmony系統(tǒng)南向驅(qū)動(dòng)開發(fā)實(shí)操-HDF驅(qū)動(dòng)配置UART

    【北京迅為】iTOP-RK3568開發(fā)板鴻蒙OpenHarmony系統(tǒng)南向驅(qū)動(dòng)開發(fā)實(shí)操-HDF驅(qū)動(dòng)配置UART
    的頭像 發(fā)表于 03-25 11:02 ?602次閱讀
    【北京迅為】iTOP-RK3568開發(fā)板<b class='flag-5'>鴻蒙</b>OpenHarmony系統(tǒng)南向驅(qū)動(dòng)開發(fā)實(shí)操-<b class='flag-5'>HDF</b>驅(qū)動(dòng)配置UART

    DevEco Studio 聯(lián)合小藝接入 DeepSeek,步驟更簡(jiǎn)單開發(fā)鴻蒙更專業(yè)

    將訴求發(fā)出,馬上獲得反饋,并且明確給出了對(duì)網(wǎng)站的設(shè)計(jì)元素分析和整體架構(gòu)設(shè)計(jì),甚至給出了性能優(yōu)化方案和設(shè)計(jì)驗(yàn)收指標(biāo)。簡(jiǎn)直是又快又清晰又準(zhǔn)確。 2) 現(xiàn)在讓他結(jié)合鴻蒙最佳實(shí)踐,按照他的設(shè)計(jì),生成這個(gè)首頁
    發(fā)表于 03-13 15:11

    北京迅為RK3568開發(fā)板OpenHarmony系統(tǒng)南向驅(qū)動(dòng)開發(fā)內(nèi)核HDF驅(qū)動(dòng)框架架構(gòu)

    北京迅為RK3568開發(fā)板OpenHarmony系統(tǒng)南向驅(qū)動(dòng)開發(fā)內(nèi)核HDF驅(qū)動(dòng)框架架構(gòu)
    的頭像 發(fā)表于 03-11 14:13 ?1014次閱讀
    北京迅為RK3568開發(fā)板OpenHarmony系統(tǒng)南向驅(qū)動(dòng)開發(fā)內(nèi)核<b class='flag-5'>HDF</b>驅(qū)動(dòng)框架<b class='flag-5'>架構(gòu)</b>

    迅為RK3568開發(fā)板篇OpenHarmony實(shí)操HDF驅(qū)動(dòng)控制LED-編寫應(yīng)用APP

    、函數(shù)或構(gòu)建規(guī)則,用于支持構(gòu)建過程。//build/ohos.gni 可能包含了 OpenHarmony 特有的構(gòu)建配置,而$HDF_ADAPTER/uhdf2/uhdf.gni 可能包含了與 uHDF
    發(fā)表于 02-06 10:27

    【「鴻蒙操作系統(tǒng)設(shè)計(jì)原理與架構(gòu)」閱讀體驗(yàn)】- 第5章閱讀有感

    HarmonyOS 中的 HDF 類比成一個(gè)基于劇場(chǎng)的大型演出活動(dòng)的組織協(xié)調(diào)團(tuán)隊(duì)來理解的話: 從整體架構(gòu)角度類比 劇場(chǎng)及基礎(chǔ)設(shè)施(硬件平臺(tái)):演出活動(dòng)的劇場(chǎng)中,有各種基礎(chǔ)的設(shè)施如舞臺(tái)
    發(fā)表于 02-02 00:34

    【「鴻蒙操作系統(tǒng)設(shè)計(jì)原理與架構(gòu)」閱讀體驗(yàn)】01-初始華為鴻蒙

    的應(yīng)用經(jīng)驗(yàn),已形成了一套較完備的理論體系。鴻蒙操作系統(tǒng)在該理論體系的基礎(chǔ)上,結(jié)合我國(guó)多年的產(chǎn)業(yè)化經(jīng)驗(yàn),參考學(xué)術(shù)界的最新研究成果,完成了基礎(chǔ)架構(gòu)設(shè)計(jì)。鴻蒙操作系統(tǒng)通過架構(gòu)解耦,可彈性部署
    發(fā)表于 01-25 11:05

    #新年新氣象,大家新年快樂!#AIGC入門及鴻蒙入門

    人工智能生成內(nèi)容(AIGC)和鴻蒙系統(tǒng)是當(dāng)前科技領(lǐng)域的兩個(gè)熱門話題。以下是對(duì)它們的入門指南: AIGC入門 1. 基礎(chǔ)概念: AIGC,全稱Artificial Intelligence
    發(fā)表于 01-13 10:46

    AIGC入門及鴻蒙入門

    人工智能生成內(nèi)容(AIGC)和鴻蒙系統(tǒng)是當(dāng)前科技領(lǐng)域的兩個(gè)熱門話題。以下是對(duì)它們的入門指南: AIGC入門 1. 基礎(chǔ)概念: AIGC,全稱Artificial Intelligence
    發(fā)表于 01-13 10:32

    名單公布!【書籍評(píng)測(cè)活動(dòng)NO.53】鴻蒙操作系統(tǒng)設(shè)計(jì)原理與架構(gòu)

    的開源,全球開發(fā)者和廣大伙伴能更踴躍地協(xié)同共建鴻蒙社區(qū),促進(jìn)鴻蒙生態(tài)枝繁葉茂 ; 希望高校和科研院所能做好鴻蒙操作系統(tǒng)的人才培養(yǎng),為國(guó)產(chǎn)操作系統(tǒng)及其生態(tài)的可持續(xù)發(fā)展提供堅(jiān)實(shí)的支撐。 也希望所有
    發(fā)表于 12-16 15:10

    鴻蒙跨端實(shí)踐-JS虛擬機(jī)架構(gòu)實(shí)現(xiàn)

    類似的框架,我們需要自行實(shí)現(xiàn)以確保核心基礎(chǔ)能力的完整。 鴻蒙虛擬機(jī)的開發(fā)經(jīng)歷了從最初 ArkTs2V8 到 JSVM + Roma新架構(gòu)方案 。在此過程中,我們實(shí)現(xiàn)了完整的鴻蒙版的“J2V8”和 基于系統(tǒng)JSVM的JS虛擬機(jī)框架
    的頭像 發(fā)表于 09-30 14:42 ?2900次閱讀
    <b class='flag-5'>鴻蒙</b>跨端實(shí)踐-JS虛擬機(jī)<b class='flag-5'>架構(gòu)</b>實(shí)現(xiàn)

    聚徽觸控-多媒體教學(xué)一體機(jī)需要哪些配套設(shè)施

    多媒體教學(xué)一體機(jī)需要的配套設(shè)施主要包括以下幾個(gè)部分:
    的頭像 發(fā)表于 07-23 09:44 ?529次閱讀
    主站蜘蛛池模板: 色老头网址 | 午夜一级精品免费毛片 | 一区二区三区国模大胆 | 成年男人永久免费看片 | 九九热精品在线视频 | 免费黄视频在线观看 | 色多多www网站 | 韩国在线免费视频 | 欧美黄区 | 色噜噜色偷偷 | 失禁h啪肉尿出来高h受 | 亚洲专区一区 | 亚洲人成77777在线观看网 | 久久久国产乱子伦精品 | 波多野吉衣一区二区三区在线观看 | 国产高清色视频免费看的网址 | 在线色播| 成人五级毛片免费播放 | 天天碰天天| 在线天堂中文有限公司 | 天堂网色| 天天上天天干 | 亚洲人成综合网站在线 | 男人视频在线观看 | 国产亚洲欧美日韩俺去了 | 看片地址| 147西西人体大胆免费网 | 三级视频欧美 | 黄色福利小视频 | 亚洲va久久久噜噜噜久久男同 | 色婷婷一区二区三区四区成人 | 黄色毛片子 | 色天使色护士 在线视频观看 | 色色色色色色色色色色色色 | 激情五月婷婷丁香 | 国产深夜福利在线观看网站 | 67194最新网址 | 国产黄网站 | 嘿嘿嘿视频在线观看网站 | 午夜老司机福利 | 在线观看h网站 |