《鴻蒙智能互聯設備開發(微課版)》 課件 第6章 HDF驅動框架_第1頁
《鴻蒙智能互聯設備開發(微課版)》 課件 第6章 HDF驅動框架_第2頁
《鴻蒙智能互聯設備開發(微課版)》 課件 第6章 HDF驅動框架_第3頁
《鴻蒙智能互聯設備開發(微課版)》 課件 第6章 HDF驅動框架_第4頁
《鴻蒙智能互聯設備開發(微課版)》 課件 第6章 HDF驅動框架_第5頁
已閱讀5頁,還剩70頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

6.1.1

HDF驅動框架介紹通過本節學習,您可以:了解HDF驅動框架HDF驅動框架介紹HDF驅動框架介紹:HDF驅動架構采用C語言面向對象編程模型構建,通過平臺解耦、內核解耦,來達到兼容不同內核,統一平臺底座的目的,從而幫助開發者實現驅動一次開發,多系統部署的效果。HDF驅動框架介紹HDF驅動框架架構組成:OSAL:操作系統抽象層(OperatingSystemAbstractionLayer),提供統一封裝的內核操作相關接口,屏蔽不同系統操作差異,包含內存、鎖、線程、信號量等接口。HDF驅動框架介紹HDF驅動框架架構組成:1.HDF驅動基礎框架:提供統一的硬件資源管理,驅動加載管理以及設備節點管理等功能。驅動框架采用的是主從模式設計,由DeviceManager和DeviceHost組成。HDF驅動框架介紹HDF驅動框架架構組成:2.驅動程序:實現驅動具體的功能,每個驅動由一個或者多個驅動程序組成,每個驅動程序都對應著一個DriverEntry。HDF驅動框架介紹HDF驅動框架架構組成:3.驅動配置文件.hcs:主要由設備信息(DeviceInformation)和設備資源(DeviceResource)組成。HDF驅動框架介紹HDF驅動框架架構組成:4.驅動接口:HDI(HardwareDriverinterface,硬件設備接口)提供標準化的接口定義和實現,驅動框架提供IOService和IODispatcher機制,使得不同部署形態下驅動接口趨于形式一致。謝謝6.1.2HDF驅動模型介紹通過本節學習,您可以:了解HDF驅動模型HDF驅動模型介紹HDF設備驅動模型的組成:Host(設備容器)、Device(設備)、DeviceNode(設備節點)、Driver(驅動程序)。HDF框架將一類設備驅動放在同一個Host里面,用于管理一組設備的啟動加載等過程。Device對應一個真實的物理設備。DeviceNode是設備的一個部件,Device至少有一個DeviceNode。每個DeviceNode可以發布一個設備服務。每個DevicdNode唯一對應一個驅動,實現和硬件的功能交互。HDF驅動模型介紹在劃分Host時,驅動程序是部署在一個Host還是部署在不同的Host,主要考慮驅動程序之間是否存在耦合性,如果兩個驅動程序之間存在依賴,可以考慮將這部分驅動程序部署在一個Host里面。Host有兩種屬性:hostName,priority屬性取值描述hostName字符串設備集合的名稱。Priority整數,0-200設備集合的優先級。數值越大,優先級越低;如果優先級相同,則不能保證加載順序。HDF驅動模型介紹HDF驅動框架給DeviceNode設備節點定義的屬性:屬性取值描述moduleName字符串每個設備節點所對應的驅動程序被稱為一個module,每一個module都有一個moduleName。preload整數驅動被HDF加載的方式Priority整數,0-200驅動的優先級。數值越大,優先級越低;如果優先級相同,則不能保證加載順序。serviceNamen字符串驅動對外發布的服務的名稱,必須唯一。policy整數驅動對外發布服務的策略。permission整數設備節點的讀寫權限,一般采用以0為前綴的8進制整數,類似于linux的文件權限的概念。deviceMatchAttr字符串用于匹配設備節點的自定義屬性。HDF驅動模型介紹驅動的加載方式如下:

typedef

enum{

DEVICE_PRELOAD_ENABLE=0,

DEVICE_PRELOAD_ENABLE_STEP2,

DEVICE_PRELOAD_DISABLE,

DEVICE_PRELOAD_INVALID

}DevicePreload;preload字段配置為0(DEVICE_PRELOAD_ENABLE),則系統啟動過程中默認加載。preload字段配置為1(DEVICE_PRELOAD_ENABLE_STEP2),當系統支持快速啟動的時候,則在系統完成之后再加載這一類驅動。preload字段配置為2(DEVICE_PRELOAD_DISABLE),則系統啟動過程中默認不加載。謝謝6.1.3HDF驅動開發步驟通過本節學習,您可以:了解HDF驅動開發步驟HDF驅動開發步驟HDF框架的驅動開發的組成部分:驅動實現、驅動編譯腳本編寫和驅動配置。1.驅動實現:驅動實現包含驅動業務代碼實現和驅動入口注冊,具體寫法如下:(1)驅動業務代碼模板

#include"hdf_device_desc.h"http://HDF框架對驅動開發相關能力接口的頭文件

#include"hdf_log.h"http://HDF框架提供的日志接口頭文件

#defineHDF_LOG_TAGtest_driver//打印日志所包含的標簽,如果不定義則用默認定義的HDF_TAG標簽。

//將驅動對外提供的服務能力接口綁定到HDF框架。

int32_tHdfTestDriverBind(structHdfDeviceObject*deviceObject){

HDF_LOGD("Testdriverbindsuccess");

returnHDF_SUCCESS;

}

//驅動自身業務初始化的接口

int32_tHdfTestDriverInit(structHdfDeviceObject*deviceObject){

HDF_LOGD("TestdriverInitsuccess");

returnHDF_SUCCESS;

}

//驅動資源釋放的接口

voidHdfTestDriverRelease(structHdfDeviceObject*deviceObject){

HDF_LOGD("Testdriverreleasesuccess");

return;

}HDF驅動開發步驟(2)驅動入口注冊到HDF框架

structHdfDriverEntryg_testDriverEntry={

.moduleVersion=1,

.moduleName="test_driver",

.Bind=HdfTestDriverBind,

.Init=HdfTestDriverInit,

.Release=HdfTestDriverRelease,

};

//調用HDF_INIT將驅動入口注冊到HDF框架中。在加載驅動時HDF框架會先調用Bind函數,再調用Init函數加載該驅動;當Init調用異常時,HDF框架會調用Release釋放驅動資源并退出。

HDF_INIT(g_testDriverEntry);驅動注冊,就是實例化驅動入口,驅動入口必須為HdfDriverEntry(在hdf_device_desc.h中定義)類型的全局變量,且moduleName要和device_info.hcs中保持一致。HDF框架會將所有加載的驅動的HdfDriverEntry對象首地址匯總,形成一個類似數組的段地址空間,方便上層調用。HDF驅動開發步驟2.驅動編譯腳本編寫添加模塊BUILD.gn把新增模塊的BUILD.gn所在的目錄添加到上一級BUILD.gn文件中

import("http://drivers/adapter/khdf/liteos/hdf.gni")

hdf_driver("hdf_led"){

sources=[

"led.c",#此處為點燈實驗,根據實驗進行修改

]

include_dirs=[

"http://device/st/drivers/module_driver/Module_Common/inc/",

]}

group("drivers"){

deps=[

"led",#新增模塊BUILD.gn的名稱,根據實驗進行修改

]

}HDF驅動開發步驟3.驅動配置驅動配置包含兩部分:HDF框架定義的驅動設備描述和驅動的私有配置信息。(1)驅動設備描述HDF框架加載驅動所需要的信息來源于HDF框架定義的驅動設備描述,因此基于HDF框架開發的驅動必須要在HDF框架定義的device_info.hcs配置文件中添加對應的設備描述。

root{

device_info{

match_attr="hdf_manager";HDF驅動開發步驟

templatehost{//host模板,繼承該模板的節點(如下test_host)如果使用模板中的默認值,則節點字段可以缺省。

hostName="";

priority=100;

templatedevice{

templatedeviceNode{

policy=0;

priority=100;

preload=0;

permission=0664;

moduleName="";

serviceName="";

deviceMatchAttr="";

}

}

}HDF驅動開發步驟

platform::host{

hostName="platform_host";//host名稱,host節點是用來存放某一類驅動的容器。

priority=50;//host啟動優先級(0-200),值越大優先級越低,建議默認配100,優先級相同則不保證host的加載順序。

device_led::device{//led設備節點

device0::deviceNode{//led驅動的DeviceNode節點

policy=2;//policy字段是驅動服務發布的策略

priority=200;//驅動啟動優先級(0-200),值越大優先級越低,建議默認配100,優先級相同則不保證device的加載順序

preload=0;//驅動按需加載字段

permission=0777;//驅動創建設備節點權限

moduleName="HDF_LED";//驅動名稱,該字段的值必須和驅動入口結構的moduleName值一致

serviceName="hdf_led";//驅動對外發布服務的名稱,必須唯一

deviceMatchAttr="st_stm32mp157_led";//驅動私有數據匹配的關鍵字,必須和驅動私有數據配置表中的match_attr值相等

}

}

}

}}HDF驅動開發步驟(2)驅動私有配置信息如果驅動有私有配置,則可以添加一個驅動的配置文件,用來填寫一些驅動的默認配置信息。HDF框架在加載驅動的時候,會將對應的配置信息獲取并保存在HdfDeviceObject中的property里面,通過Bind和Init傳遞給驅動。驅動的配置信息示例如下:配置信息定義之后,需要將該配置文件添加到板級配置入口文件hdf.hcs,示例如下:

root{

LedDriverConfig{

led_gpio_num=13;

match_attr="st_stm32mp157_led";//該字段的值必須和device_info.hcs中的deviceMatchAttr值一致

}

}

#include"device_info/device_info.hcs"

#include"led/led_config.hcs"

謝謝6.2.1驅動服務介紹通過本節學習,您可以:了解驅動服務介紹驅動服務介紹當驅動需要以接口的形式對外提供能力時,可以使用HDF框架的驅動服務管理能力。驅動服務是HDF驅動設備對外提供能力的對象,由HDF框架統一管理。驅動服務管理主要包含驅動服務的發布和獲取。1.驅動服務的發布:HDF框架定義了驅動對外發布服務的策略,由配置文件中的policy字段來控制,policy字段的取值范圍以及含義如下:

typedef

enum{

SERVICE_POLICY_NONE=0,//驅動不提供服務

SERVICE_POLICY_PUBLIC=1,//驅動對內核態發布服務

SERVICE_POLICY_CAPACITY=2,//驅動對內核態和用戶態都發布服務

SERVICE_POLICY_FRIENDLY=3,//驅動服務不對外發布服務,但可以被訂閱

SERVICE_POLICY_PRIVATE=4,//驅動私有服務不對外發布服務,也不能被訂閱

SERVICE_POLICY_INVALID//錯誤的服務策略

}ServicePolicy;驅動服務介紹2.驅動服務的獲取:驅動服務的獲取有兩種方式:通過HDF接口直接獲取:當明確驅動已經加載完成時,獲取該驅動的服務可以通過HDF框架提供的能力接口直接獲取。通過HDF提供的訂閱機制獲取:當內核態對驅動(同一個host)加載的時機不感知時,可以通過HDF框架提供的閱機

制來訂閱該驅動,當該驅動加載完成時,HDF框架會將被訂閱的驅動服務發布給訂閱者。謝謝6.2.2驅動服務管理開發通過本節學習,您可以:了解驅動服務管理開發驅動服務管理開發1.驅動服務管理接口針對驅動服務管理功能,HDF框架開放了部分接口給開發者調用。方法描述int32_t(*Bind)(structHdfDeviceObject*deviceObject);需要驅動開發者實現Bind函數,將自己的服務接口綁定到HDF框架中conststructHdfObject*DevSvcManagerClntGetService(constchar*svcName);獲取驅動的服務intHdfDeviceSubscribeService(structHdfDeviceObject*deviceObject,constchar*serviceName,structSubscriberCallbackcallback);訂閱驅動的服務驅動服務管理開發2.驅動服務管理開發步驟(1)驅動服務的編寫驅動服務管理開發的第一步是定義驅動的服務接口。

//驅動服務結構的定義

structITestDriverService{

structIDeviceIoServiceioService;//服務結構的首個成員必須是IDeviceIoService類型的成員

int32_t(*ServiceA)(void);//驅動的第一個服務接口

int32_t(*ServiceB)(uint32_tinputCode);//驅動的第二個服務接口,有多個可以依次往下累加

};

驅動服務接口的實現

int32_tTestDriverServiceA(void)

{

//驅動開發者實現業務邏輯

returnHDF_SUCCESS;

}

int32_tTestDriverServiceB(uint32_tinputCode)

{

//驅動開發者實現業務邏輯

returnHDF_SUCCESS;

}驅動服務管理開發(2)驅動服務綁定驅動服務綁定到HDF框架中,實現HdfDriverEntry中的Bind指針函數。

int32_tTestDriverBind(structHdfDeviceObject*deviceObject)

{

//deviceObject為HDF框架給每一個驅動創建的設備對象,用來保存設備相關的私有數據和服務接口

if(deviceObject==NULL){

HDF_LOGE("Testdeviceobjectisnull!");

returnHDF_FAILURE;

}

static

structITestDriverServicetestDriverA={

.ServiceA=TestDriverServiceA,

.ServiceB=TestDriverServiceB,

};

deviceObject->service=&testDriverA.ioService;

returnHDF_SUCCESS;

}驅動服務管理開發(3)驅動服務獲取通過HDF接口直接獲取:

const

structITestDriverService*testService=

(const

structITestDriverService*)DevSvcManagerClntGetService("test_driver");

if(testService==NULL){

returnHDF_FAILURE;

}

testService->ServiceA();testService->ServiceB(5);驅動服務管理開發

//object為訂閱者的私有數據,service為被訂閱的服務對象

int32_tTestDriverSubCallBack(structHdfDeviceObject*deviceObject,const

structHdfObject*service)

{

const

structITestDriverService*testService=

(const

structITestDriverService*)service;

if(testService==NULL){

returnHDF_FAILURE;

}

testService->ServiceA();

testService->ServiceB(5);

}通過HDF提供的訂閱機制獲取:需要編寫訂閱回調函數,當被訂閱的驅動加載完成后,HDF框架會將被訂閱驅動的服務發布給訂閱者,通過這個回調函數給訂閱者使用。驅動服務管理開發

//訂閱過程的實現

int32_tTestDriverInit(structHdfDeviceObject*deviceObject)

{

if(deviceObject==NULL){

HDF_LOGE("Testdriverinitfailed,deviceObjectisnull!");

returnHDF_FAILURE;

}

structSubscriberCallbackcallBack;

callBack.deviceObject=deviceObject;

callBack.OnServiceConnected=TestDriverSubCallBack;

int32_tret=HdfDeviceSubscribeService(deviceObject,"test_driver",callBack);

if(ret!=HDF_SUCCESS){

HDF_LOGE("Testdriversubscribetestdriverfailed!");

}

returnret;}謝謝6.3.1驅動消息機制管理通過本節學習,您可以:了解驅動消息機制管理驅動消息機制管理鴻蒙系統的的HDF框架提供了統一的驅動消息機制。當用戶態應用和內核態驅動需要交互時,可以使用HDF框架的消息機制來實現。用戶態:指應用程序運行的環境,應用程序在用戶態下運行,可以訪問系統資源,如文件、網絡等。用戶態下的應用程序運行在受限的環境中,不能直接訪問系統硬件資源,必須通過系統調用來請求內核提供服務。內核態:指操作系統內核運行的環境,在操作系統啟動時,內核被加載到內存中,并開始執行。消息機制的功能有以下兩種:用戶態應用發送消息到驅動。用戶態應用接收驅動主動上報事件。驅動消息機制管理消息機制的接口:接口描述structHdfIoService*HdfIoServiceBind(constchar*serviceName)用戶態獲取驅動的服務,獲取該服務之后通過服務中的Dispatch方法向驅動發送消息voidHdfIoServiceRecycle(structHdfIoService*service);獲取驅動的服務intHdfDeviceRegisterEventListener(structHdfIoService*target,structHdfDevEventlistener*listener);用戶態程序注冊接收驅動上報事件的操作方法intHdfDeviceSendEvent(structHdfDeviceObject*deviceObject,uint32_tid,structHdfSBuf*data);驅動主動上報事件接口謝謝6.3.2驅動消息機制開發通過本節學習,您可以:了解驅動消息機制開發驅動消息機制開發驅動消息機制的開發步驟:1.修改服務策略policy字段將驅動配置信息中服務策略policy字段設置為2。

device_test::Device{

policy=2;

...

}2.配置驅動信息中的服務設備節點權限配置驅動信息中的服務設備節點權限(permission字段)是框架給驅動創建設備節點的權限,默認是0666,驅動開發者根據驅動的實際使用場景配置驅動設備節點的權限。驅動消息機制開發3.實現Dispatch方法在服務實現過程中,實現服務基類成員IDeviceIoService中的Dispatch方法。

//Dispatch是用來處理用戶態發下來的消息

int32_tTestDriverDispatch(structHdfDeviceIoClient*device,intcmdCode,structHdfSBuf*data,structHdfSBuf*reply){

HDF_LOGE("testdriverliteAdispatch");

returnHDF_SUCCESS;

}

int32_tTestDriverBind(structHdfDeviceObject*device){

HDF_LOGE("testforliteostestdriverAOpen!");

if(device==NULL){

HDF_LOGE("testforliteostestdriverAOpenfailed!");

returnHDF_FAILURE;

}

static

structITestDriverServicetestDriverA={

.ioService.Dispatch=TestDriverDispatch,

.ServiceA=TestDriverServiceA,

.ServiceB=TestDriverServiceB,

};

device->service=(structIDeviceIoService*)(&testDriverA);

returnHDF_SUCCESS;}驅動消息機制開發4.定義cmd類型驅動定義消息處理函數中的cmd類型。5.獲取服務接口并發送消息用戶態獲取服務接口并發送消息到驅動。#defineTEST_WRITE_READ1//讀寫操作碼1

intSendMsg(const

char*testMsg)

{

if(testMsg==NULL){

HDF_LOGE("testmsgisnull");

returnHDF_FAILURE;

}

structHdfIoService*serv=HdfIoServiceBind("test_driver");

if(serv==NULL){

HDF_LOGE("failtogetservice");

returnHDF_FAILURE;}驅動消息機制開發

structHdfSBuf*data=HdfSBufObtainDefaultSize();

if(data==NULL){HDF_LOGE("failtoobtainsbufdata");

returnHDF_FAILURE;

}

structHdfSBuf*reply=HdfSBufObtainDefaultSize();

if(reply==NULL){HDF_LOGE("failtoobtainsbufreply");

ret=HDF_DEV_ERR_NO_MEMORY;

gotoout;

}

if(!HdfSbufWriteString(data,testMsg)){HDF_LOGE("failtowritesbuf");

ret=HDF_FAILURE;

gotoout;

}

intret=serv->dispatcher->Dispatch(&serv->object,TEST_WRITE_READ,data,reply);

if(ret!=HDF_SUCCESS){HDF_LOGE("failtosendservicecall");

gotoout;

}

out:

HdfSBufRecycle(data);

HdfSBufRecycle(reply);

HdfIoServiceRecycle(serv);

returnret;}驅動消息機制開發6.用戶態接收驅動上報的消息用戶態編寫驅動上報消息的處理函數。

static

intOnDevEventReceived(void*priv,uint32_tid,structHdfSBuf*data)

{

OsalTimespectime;

OsalGetTime(&time);

HDF_LOGE("%sreceivedeventat%llu.%llu",(char*)priv,time.sec,time.usec);

const

char*string=HdfSbufReadString(data);

if(string==NULL){

HDF_LOGE("failtoreadstringineventdata");

returnHDF_FAILURE;

}

HDF_LOGE("%s:deveventreceived:%d%s",(char*)priv,id,string);

returnHDF_SUCCESS;}驅動消息機制開發用戶態注冊接收驅動上報消息的操作方法。

intRegisterListen()

{

structHdfIoService*serv=HdfIoServiceBind("test_driver");

if(serv==NULL){

HDF_LOGE("failtogetservice");

returnHDF_FAILURE;

}

static

structHdfDevEventlistenerlistener={

.callBack=OnDevEventReceived,

.priv="Service0"

};

if(HdfDeviceRegisterEventListener(serv,&listener)!=0){

HDF_LOGE("failtoregistereventlistener");

returnHDF_FAILURE;

}

......

HdfDeviceUnregisterEventListener(serv,&listener);

HdfIoServiceRecycle(serv);

returnHDF_SUCCESS;

}驅動消息機制開發驅動上報事件。

int32_tTestDriverDispatch(structHdfDeviceObject*device,intcmdCode,structHdfSBuf*data,structHdfSBuf*reply)

{

...//processapicallhere

returnHdfDeviceSendEvent(deviceObject,cmdCode,data);}謝謝6.4.1HCS介紹通過本節學習,您可以:了解HDF驅動框架的配置描述源碼HCSHCS介紹HCS(HDFConfigurationSource)是HDF驅動框架的配置描述源碼,內容以Key-Value為主要形式。它實現了配置代碼與驅動代碼解耦,便于開發者進行配置管理。HCS配置管理以樹狀結構來組織配置項,開發者可以根據需要定義不同的配置項,并將其組織成一個層次化的結構。每個配置項都有一個唯一的標識符,開發者可以通過標識符來訪問和修改配置項的值。通過HCS配置管理,開發者可以實現動態配置的功能。在運行時,開發者可以根據需要修改特定的配

置項的值,而無需重新編譯和部署應用程序。HCS配置管理支持多種配置項類型,包括整數、浮點數、字符串等。開發者可以根據具體需求選擇適合的配置項類型。HCS介紹HC-GEN(HDFConfigurationGenerator)是HCS配置轉換工具,可以將HDF配置文件轉換為軟件可讀取的文件格式,環境不同,轉換的文件格式也不同。在弱性能環境中,轉換為配置樹源碼或配置樹宏定義,驅動可直接調用C代碼或宏式APIs獲取配置。在高性能環境中,轉換為HCB(HDFConfigurationBinary)二進制文件,驅動可使用HDF框架提供

的配置解析接口獲取配置。HCS介紹使用HCS模式的典型應用場景如圖所示。HCS經過HC-GEN編譯生成HCB二進制文件,HDF驅動框架中的HCSParser模塊會從HCB文件中重建配置樹,HDF驅動模塊使用HCSParser提供的配置讀取接口獲取配置內容。HCB二進制文件重建配置樹謝謝6.4.2HCS配置語法通過本節學習,您可以:了解HCS配置語法HCS配置語法1.關鍵字HCS配置語法的部分關鍵字,如表所示。關鍵字用途說明root配置根節點-include引用其他HCS配置文件-delete刪除節點或屬性只能用于操作include導入的配置樹template定義模板節點-match_attr用于標記節點的匹配查找屬性解析配置時可以使用該屬性的值查找到對應節點HCS配置語法2.基本組成結構HCS配置文件主要由屬性(Attribute)和節點(Node)兩部分組成。(1)屬性屬性是最小的配置單元,是一個獨立的配置項。語法如下:attribute_name=value;attribute_name是字母、數字、下劃線的組合且必須以字母或下劃線開頭,字母區分大小寫。value的可用格式如下:數字常量,支持二進制、八進制、十進制、十六進制數。字符串,內容使用雙引號(“”)引用。節點引用。attribute必須以分號(;)結束且必須屬于一個node。HCS配置語法(2)節點節點是一組屬性的集合,語法如下:

node_name{

module="test";

...}node_name是字母、數字、下劃線的組合且必須以字母或下劃線開頭,字母區分大小寫。大括號后無需添加結束符分號“;”。root為保留關鍵字,用于聲明配置表的根節點。每個配置表必須以root節點開始。root節點中必須包含module屬性,其值應該為一個字符串,用于表征該配置所屬模塊。節點中可以增加match_attr屬性,其值為一個全局唯一的字符串。當驅動程序在解析配置時可以以該屬性的值為參數調用查找接口查找到包含該屬性的節點。HCS配置語法3.數據類型在屬性定義中使用自動數據類型,不顯式指定類型,屬性支持的數據類型有整型、字符串、數組、布爾類型。整型:整型長度自動推斷,根據實際數據長度給與最小空間占用的類型。二進制,0b前綴,示例:0b1010。八進制,0前綴,示例:0664。十進制,無前綴,且支持有符號與無符號,示例:1024,+1024均合法。驅動程序在讀取負值時注意使用有符號數讀取接口。十六進制,0x前綴,示例:0xff00、0xFF。HCS配置語法字符串:字符串使用雙引號(“”)表示。布爾類型:布爾類型中true表示真,false表示假。數組:數組元素支持整型、字符串,不支持混合類型。整型數組中uint32_t、uint64_t混用會向上轉型為uint64_t數組。整型數組與字符串數組示例如下:

attr_foo=[0x01,0x02,0x03,0x04];

attr_bar=["hello","world"];4.預處理include用于導入其他HCS文件。語法示例如下:其中,文件名必須使用雙引號(“”),不在同一目錄下需要使用相對路徑引用。被include文件也必須是合法的HCS文件。若是多個include,如果存在相同的節點,后者覆蓋前者,其余的節點依次展開。#include"foo.hcs"

#include"../bar.hcs"HCS配置語法5.注釋注釋支持兩種風格:單行注釋和多行注釋。

//comment單行注釋

/*

comment多行注釋

*/6.引用修改引用修改可以實現修改另外任意一個節點的內容,語法為:node:&source_nodeHCS配置語法上述語句表示node中的內容是對source_node節點內容的修改。示例如下:

root{

module="test";

foo{

foo_:&root.bar{

attr="foo";

}

foo1:&foo2{

attr=0x2;

}

foo2{

attr=0x1;

}

}

bar{

attr="bar";

}}

root{

module="test";

foo{

foo2{

attr=0x2;

}

}

bar{

attr="foo";

}}最終生成配置樹為:可以看到foo.foo_節點通過引用將bar.attr屬性的值修改為了"foo",foo.foo1節點通過引用將foo.foo2.attr屬性的值修改為了0x2。foo.foo_以及foo.foo1節點表示對目標節點內容的修改,其自身并不會存在最終生成的配置樹中。HCS配置語法7.節點復制節點復制可以實現在節點定義時從另一個節點先復制內容,用于定義內容相似的

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論