




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
基于OpenHarmony的嵌入式開發
第五章OpenHarmony的服務框架安全邊距5.1基礎數據服務[5.1.0]基礎數據服務
服務是現代操作系統中的重要功能,服務能夠將不同的硬件設備資源和軟件系統資源進行歸類和集中,對外提供一整套能夠實現發現、注冊和調用的機制,實現對特定功能的集中化操作。極大程度的簡化操作系統、驅動框架、第三方應用的操作復雜度。
OpenHarmony的服務框架具有實現編程開發多樣性的重要特點?;贠penHarmony的服務框架(SAFWK,SystemAbilityFramework),通過LiteIPC等機制,向外提供了與開發語言無關的接口,實現了底層匯編和C語言到更豐富的編程語言的過渡?;贠penHarmony的嵌入式開發2安全邊距5.1基礎數據服務[5.1.0]基礎數據服務
OpenHarmony子系統架構圖基于OpenHarmony的嵌入式開發3系統服務框架基于面向服務的架構,提供了服務(Service)開發、特性(Feature)開發、對外接口(IUnknown)的開發、以及多服務共進程、進程間服務調用等開發能力。在不同的內核平臺(性能平臺)上,也提供了不同的能力。(1)LiteOS-M內核:包括服務開發、服務的子功能開發、對外接口的開發以及多服務共進程的開發框架。LiteOS-M上服務框架依賴依賴bootstrap服務,在系統啟動函數中調用HOS_SystemInit()函數。(2)LiteOS-A內核:在LiteOS-M內核能力基礎之上,包括了進程間服務調用、進程間服務調用權限控制、進程間服務接口的開發等能力。安全邊距5.1基礎數據服務[5.1.1]Vector結構體
Vector是一種動態數組,支持根據鍵-值進行查找等操作,在服務框架中,用于存放各種服務對象。基于OpenHarmony的嵌入式開發4/*ThisclassisapplicabletotheClanguagedevelopmentscenariowherethedatavolumeissmall*anddynamicexpansionisrequired.\n*/typedefstructSimpleVector{/**Maximumnumberofdatarecordsthatcanbestored.Theinitialvalueis<b>0</b>.*/
int16max;/**Peakvalueofthenumberofstoreddatarecords.Theinitialvalueis<b>0</b>.*/int16top;/**Numberofdatarecordsthathavebeenreleased.Theinitialvalueis<b>0</b>.*/int16free;/**Datastoragepointer*/void**data;/*Convertsadataelementintoakeyforcomparison.Thekeyisprovidedbyusers,andthedefaultvalueis<b>NULL</b>.*/VECTOR_Keykey;/*Comparesthesizesofkey1andkey2,whichareprovidedbyusers.Thevalue<b>1</b>indicatesthatkey1isgreater*thankey2,thevalue<b>0</b>indicatesthatkey1isequaltokey2,andthevalue<b>-1</b>indicatesthatkey1isless*thankey2.Thedefaultvalueis<b>NULL</b>*/VECTOR_Comparecompare;}Vector;/foundation/distributedschedule/samgr_lite/interfaces/kits/samgr/common.hdata的最大存儲范圍,即data[max]top表示當前存儲在data中的最大地址,即data[top]=XXX存儲指針
free表示記錄釋放的data[index]的數量data是具體存放數據的地址,也是整個vector的關鍵,注意data類型key是函數指針,用于將一個數據元素轉變為key進行比compare是函數指針,用于比較兩個key是否相同。key和compare主要在Vector創建時使用。安全邊距5.1基礎數據服務[5.1.1]Vector結構體
Vector_Make操作:VECTOR_Make函數所執行的僅僅是簡單的賦初值功能,并返回創建的Vector對象,函數傳入了key和compare函數。
VECTOR_Clear操作:執行對某個vector結構體空間的釋放,在執行前,應先調用SAMGR_Free將data所指的空間釋放,再釋放空間。基于OpenHarmony的嵌入式開發5VectorVECTOR_Make(VECTOR_Keykey,VECTOR_Comparecompare){Vectorvector={0,0,0,NULL,key,compare};returnvector;}voidVECTOR_Clear(Vector*vector){if(vector==NULL){...}if(vector->data==NULL){...}SAMGR_Free(vector->data);vector->max=0;vector->top=0;vector->free=0;vector->data=NULL;}安全邊距5.1基礎數據服務[5.1.1]Vector結構體
VECTOR_Add操作:將element添加到data[top]中?;玖鞒倘缦拢?/p>
①當top<max時,將element直接存入data[top]位置,返回top++;
②當top>=max時,由于可能存在free的空間,所以進行循環,當有空閑位置(data[i]==NULL)時將element存入,并返回位置i,通過registerService函數可知返回的i存儲為serviceId,所以返回的實際是當前存儲對象的位置;③若沒有找到空閑的位置,則需要對vector進行空間擴展;④分配新的空間,空間大小為原空間大小+4;⑤將原data中的數據復制到新空間中;⑥將新空間更新到vector中;⑦重復第一步的操作,需要注意的是,return先返回的是top的位置,表示當前存儲element的位置,然后再執行++操作,用于下一次對象存儲的開始top起點?;贠penHarmony的嵌入式開發6free表示記錄釋放的data[index]的數量安全邊距5.1基礎數據服務[5.1.1]Vector結構體
VECTOR_At操作:根據所給的index返回data[index]
VECTOR_Swap操作:將index對應的element提取并返回,如果傳入了新的element則將其覆蓋index對應的舊element,傳入NULL則free++表示多一塊空閑空間,將舊element對應位置指針置為NULL?;贠penHarmony的嵌入式開發7void*VECTOR_At(Vector*vector,int16index){if(vector==NULL||vector->top<=index||index<0){returnNULL;}returnvector->data[index];}返回的是void指針類型void*VECTOR_Swap(Vector*vector,int16index,void*element){if(vector==NULL||vector->top<=index||index<0){...}if(element==NULL){
vector->free++;}void*oldElement=vector->data[index];vector->data[index]=element;returnoldElement;}安全邊距5.1基礎數據服務[5.1.1]Vector結構體
VECTOR_Find/VECTOR_FindByKey:查找element對應index函數基于OpenHarmony的嵌入式開發8int16VECTOR_FindByKey(Vector*vector,constvoid*key)
{if(vector==NULL||key==NULL){returnINVALID_INDEX;}int16i;for(i=0;i<vector->top;++i){if(vector->data[i]==NULL){
continue;}void*first=(vector->key!=NULL)?vector->key(vector->data[i]):vector->data[i];if(first==key){
returni;}if(vector->compare==NULL||first==NULL){
continue;}if(vector->compare(first,key)==0){returni;}}returnINVALID_INDEX;}int16VECTOR_Find(Vector*vector,constvoid*element){if(vector==NULL||element==NULL){returnINVALID_INDEX;}returnVECTOR_FindByKey(vector,(vector->key==NULL)?element:vector->key(element));}安全邊距5.1基礎數據服務[5.1.2]Service
Service(服務)指一個特定的模塊在SAMGR中所注冊的對象。SA的服務中心通過Vector保存了多個服務,每一個服務對應著一個線程池和消息隊列,又對應著0個或若干個feature?;贠penHarmony的嵌入式開發9/*@briefIndicatesthebasictypeofaservice.*Youneedtoimplementthefunctionpointersof<b>Service</b>
*/structService{
/*ThisfunctioniscalledbySamgrduringserviceregistrationandstartup.*Youneedto
implementthisfunction.*/
constchar*(*GetName)(Service*service);
/*AfterSamgrassignstaskstoaservice,theservicecallsthefunctioninitsowntasks.*Youneedtoimplementthisfunction.*/
BOOL(*Initialize)(Service*service,Identityidentity);
/*Thisfunctionisusedtoprocessrequestssentbythecallerthrough{@linkIUnknown}.*Youneedtoimplementthisfunction.*/
BOOL(*MessageHandle)(Service*service,Request*request);
/*Thisfunctionisusedtoreturntaskconfigurations.Youneedtoimplementthisfunction.*/
TaskConfig(*GetTaskConfig)(Service*service);};注冊和啟動時調用,返回最長16字節常量字符串,作為服務名稱服務初始化服務消息處理函數返回服務的Task配置項,包括服務的優先級、棧尺寸、隊列尺寸和Task類型等配置內容/foundation/distributedschedule/samgr_lite/interfaces/kits/samgr/service.h安全邊距5.1基礎數據服務[5.1.2]Service
ServiceImpl結構體:保存服務實現過程中的內部數據基于OpenHarmony的嵌入式開發10structServiceImpl{Service*service;IUnknown*defaultApi;TaskPool*taskPool;Vectorfeatures;int16serviceId;uint8inited;Operationsops;};Service*service,指向當前ServiceImpl對象所對應的具體的service對象,這些具體的service對象都是Service類的子類對象IUnknown*defaultApi,繼承了IUnknown接口的service的接口默認APITaskPool*taskPool,samgr為service創建的taskPool的指針,同時創建了還有消息隊列,queueId同時保存在taskPool中Vectorfeatures,feature需要依賴于對應的service才能注冊和運行,一個service可以有0個、1個或多個feature。service本身不記錄其所對應的feature的信息,由ServiceImpl.features完成int16serviceId,當前ServiceImpl對象指針保存在g_samgrImpl.servicesvector內的data[serviceId]中uint8inited,標記當前ServiceImpl對應的service的狀態,service只有在init后才能注冊feature。service在處理消息事件的時候,狀態也要對應置為SVC_BUSY,處理完消息后返回SVC_IDLE狀態enumInitStatus{SVC_INIT=0,SVC_IDLE,SVC_BUSY,};Operationsops,記錄service處理消息事件的時間戳、msg、步驟和是否存在異常等信息安全邊距5.1基礎數據服務[5.1.3]Feature
Feature(功能或特性)指在一個服務對象中,能夠對外提供的具體的可以調用的接口,一個服務可以對應多個Feature
基于OpenHarmony的嵌入式開發11/***@briefDefinesthebaseclassofafeature.*/structFeature{/*ThisfunctionisimplementedbydevelopersandcalledbySamgrduringfeatureregistration*andstartup.*/
constchar*(*GetName)(Feature*feature);/*Thisfunctionisimplementedbydevelopers.AfterSamgrdispatchestaskstoaservice,the*servicecallsthisfunctioninitsowntasks.*/
void(*OnInitialize)(Feature*feature,Service*parent,Identityidentity);/*ThisfunctionisimplementedbydevelopersandiscalledbySamgrwhenafeatureis*deregisteredtostoprunningservices.*/
void(*OnStop)(Feature*feature,Identityidentity);/*Thisfunctionisimplementedbydeveloperstoprocessrequestssentbycallersthrough*IUnknown.*/
BOOL(*OnMessage)(Feature*feature,Request*request);};/foundation/distributedschedule/samgr_lite/interfaces/kits/samgr/feature.h注冊和啟動時調用,返回最長16字節常量字符串,作為特性名稱特性初始化特性停止,服務在取消注冊或停止特性時調用特性消息處理函數,用于處理調用者通過IUnknown傳遞的請求安全邊距5.1基礎數據服務[5.1.4]IUnknown
IUnknown:OpenHarmony的一種基本COM組件(ComponentObjectModel,組件對象模型)基于OpenHarmony的嵌入式開發12/***@briefDefinesthe<b>IUnknown</b>class.**Youneedtoinheritthisstructurewhendevelopingasubclassofthe<b>IUnknown</b>interface.\n**/structIUnknown{/***Queriesthesubclassobjectofthe<b>IUnknown</b>interfaceofaspecifiedversion*(downcasting).*/
int(*QueryInterface)(IUnknown*iUnknown,intversion,void**target);/**Addsthereferencecount.*/
int(*AddRef)(IUnknown*iUnknown);/**Releasethereferencetoan<b>IUnknown</b>interface.*/int(*Release)(IUnknown*iUnknown);};/foundation/distributedschedule/samgr_lite/interfaces/kits/samgr/iunknown.hIUnknown的引用計數,用計數每增加1(AddRef)就代表當前組件被一個對象引用,每減少1(Release)就代表當前組件減少了一個引用者,當引用計數為0時,就代表已經沒有對象使用它,其生命周期也就就到此結束,可以釋放其所占用的資源。QueryInterface,查詢接口,是一種自表述接口,可以通過QueryInterface查詢某個對象是否支持某些特定的接口,若支持該接口,則在target參數返回指向該接口的指針,否則返回錯誤。安全邊距5.1基礎數據服務[5.1.4]IUnknown
IUnknown:OpenHarmony的一種基本COM組件(ComponentObjectModel,組件對象模型)基于OpenHarmony的嵌入式開發13intIUNKNOWN_QueryInterface(IUnknown*iUnknown,intver,void**target){if(iUnknown==NULL||target==NULL){returnEC_INVALID;}IUnknownEntry*entry=GET_OBJECT(iUnknown,IUnknownEntry,iUnknown);if((entry->ver&(uint16)ver)!=ver){returnEC_INVALID;}if(ver==OLD_VERSION&&entry->ver!=OLD_VERSION&&(entry->ver&(uint16)DEFAULT_VERSION)!=DEFAULT_VERSION){returnEC_INVALID;}*target=iUnknown;iUnknown->AddRef(iUnknown);returnEC_SUCCESS;}typedefstructIUnknownEntry{/**VersioninformationofIUnknowninterface.*/uint16ver;/**ReferencecountofIUnknowninterface.*/int16ref;IUnknowniUnknown;}IUnknownEntry;安全邊距5.1基礎數據服務[5.1.5]Message:與消息相關的結構體
Identity:決定請求和響應對應服務或功能的id
基于OpenHarmony的嵌入式開發14/***@briefIdentifiesaserviceandfeature.**Youcanusethisstructuretoidentitya{@linkIUnknown}featuretowhichmessageswillbe*sentthroughtheasynchronousfunctionof{@linkIUnknown}.\n**/structIdentity{/**ServiceID*/int16serviceId;/**FeatureID*/int16featureId;/**MessagequeueID*/MQueueIdqueueId;};安全邊距5.1基礎數據服務[5.1.5]Message:與消息相關的結構體
Request:保存請求的消息id與數據內容基于OpenHarmony的嵌入式開發15/***@briefDefinesarequest.**Youcanusethisstructuretodefinetherequestthatwillbesenttoafeaturethroughthe*asynchronousfunctionof{@linkIUnknown}.\n*Request,whichisdatathatispackedtosendtoafeature.\n*Ifthedataisnotemptyandthelengthisnot0,thesystemautomaticallyreleasesthedata.\n**/structRequest{/**MessageID*/int16msgId;/**Datalength*/int16len;/**Datacontent*/void*data;/**Messagevalue,whichisdefinedbydevelopers*/uint32msgValue;};安全邊距5.1基礎數據服務[5.1.5]Message:與消息相關的結構體
Response:主要包含響應的內容基于OpenHarmony的嵌入式開發16/***@briefDefinesaresponse.**Thisstructureisusedtosendaresponseafterthemessageprocessingfunctionofaservice*orfeatureprocessesarequest.\n*Ifthedataisnotemptyandthelengthisnot0,thesystemautomaticallyreleasesthedata.\n**/structResponse{/**Datacontent*/void*data;/**Datalength*/int16len;#ifdefMINI_SAMGR_LITE_RPCvoid*reply;#endif};安全邊距5.1基礎數據服務[5.1.5]Message:與消息相關的結構體
Exchange:消息管理的基礎,函數對與請求與響應的功能性調用都是以Exchange結構體的內容作為基礎的其他結構體:TaskConfig(Definestaskconfigurationsforaservice,includingthetaskpriority,
stacksize,queuesize,tasktype,andsharedtaskID)、TaskPool和Operations等基于OpenHarmony的嵌入式開發17structExchange{Identityid;
/**<Thetargetserviceorfeatureidentity.*/Requestrequest;Responseresponse;shorttype;
/**<Theexchangetype.*/Handlerhandler;
/**<asyncresponseorimmediatelyrequestcallbackfunction*/uint32*sharedRef;
/**<usetosharetherequestandresponseforsavingmemory*/};安全邊距5.1基礎數據服務[5.1.6]SamgrLiteImpl
SamgrLiteImpl基于OpenHarmony的嵌入式開發18structSamgrLiteImpl{SamgrLitevtbl;MutexIdmutex;BootStatusstatus;Vectorservices;TaskPool*sharedPool[MAX_POOL_NUM];};vtbl:用于實現SamgrLite的函數指針,通過指針的關聯就可以通過vtbl中的函數對service、feature和api進行注冊、注銷和獲取API等操作;mutex:mutex是互斥鎖,用于保證多線程下共享數據的同步,其實現方法取決于內核,每一個SamgrLiteImpl對應唯一的mutexId。status:service啟動的狀態typedefenum{BOOT_SYS=0,
//將要啟動系統Service
BOOT_SYS_WAIT=1,
//正在啟動系統Service
BOOT_APP=2,
//將要啟動APPServcie
BOOT_APP_WAIT=3,
//正在啟動APPServcie
BOOT_DYNAMIC=4,
//將要啟動DynamicServcie
BOOT_DYNAMIC_WAIT=5,
//正在啟動DynamicService
}BootStatus;services表示在注冊Servcie時將一個servcieImpl結構體追加到Vector末尾,用于后續的初始化,通過該方法實現對所有注冊的子系統的管理sharedPool[MAX_POOL_NUM]則表示為每個service創建的taskPool資源,通過GetTaskConfig()返回每個service運行時的task參數配置安全邊距5.2服務框架的啟動和注冊[5.2.1]服務框架的啟動過程
SAMGR_Bootstrap()函數完成服務框架啟動
LiteOS-M服務框架需要依賴bootstrap服務,在系統啟動函數中調用系統初始化函數實現LiteOS-A服務框架啟動,是由服務框架支持的進程在其main()函數中調用相關函數實現的。
SAMGR_Bootstrap()會啟動已經注冊的服務,對所有系統啟動時尚未初始化的服務進行初始化,使得整個系統進入DYNAMIC平穩運行的狀態。服務創建的最小完整流程:①注冊系統服務(service);②注冊系統服務特性(feature);③通過samgr啟動并初始化所有的系統服務和功能基于OpenHarmony的嵌入式開發19安全邊距5.2服務框架的啟動和注冊[5.2.1]服務框架的啟動過程
SAMGR_Bootstrap()函數完成服務框架啟動基于OpenHarmony的嵌入式開發20進入SAMGR_Bootstrap()獲取已經創建的g_samgrImpl檢查互斥鎖是否初始化創建日志信息退出當前函數清看門狗創建臨時的Vector創建互斥鎖遷移BootStatus
狀態否是將未初始化的服務加入到臨時VectorvoidSAMGR_Bootstrap(void){SamgrLiteImpl*samgr=GetImplement();if(samgr->mutex==NULL){HILOG_INFO(HILOG_MODULE_SAMGR,"Samgrisnotinit,noservice!");return;}WDT_Reset(WDG_SVC_BOOT_TIME);VectorinitServices=VECTOR_Make(NULL,NULL);MUTEX_Lock(samgr->mutex);samgr->status=TO_NEXT_STATUS(samgr->status);int16size=VECTOR_Size(&(samgr->services));int16i;for(i=0;i<size;++i){ServiceImpl*serviceImpl=(ServiceImpl*)VECTOR_At(&(samgr->services),i);if(serviceImpl==NULL||serviceImpl->inited!=SVC_INIT){continue;}VECTOR_Add(&initServices,serviceImpl);}……安全邊距5.2服務框架的啟動和注冊[5.2.1]服務框架的啟動過程
SAMGR_Bootstrap()函數完成服務框架啟動基于OpenHarmony的嵌入式開發21進入SAMGR_Bootstrap()獲取已經創建的g_samgrImpl檢查互斥鎖是否初始化創建日志信息退出當前函數清看門狗創建臨時的Vector創建互斥鎖遷移BootStatus
狀態否是將未初始化的服務加入到臨時Vector釋放護互斥鎖初始化Vector中保存的服務清空釋放Vector檢查初始化是否完成創建日志信息函數結束是否MUTEX_Unlock(samgr->mutex);HILOG_INFO(HILOG_MODULE_SAMGR,BOOT_FMT(samgr->status),
VECTOR_Size(&initServices));InitializeAllServices(&initServices);VECTOR_Clear(&initServices);int32err=InitCompleted();if(err!=EC_SUCCESS){HILOG_INFO(HILOG_MODULE_SAMGR,
"Gotonextbootstepreturncode:%d",err);}}安全邊距5.2服務框架的啟動和注冊[5.2.2]服務框架的注冊過程示例(broadcast服務)(1)注冊系統服務:Init基于OpenHarmony的嵌入式開發22staticvoidInit(void)
{SAMGR_GetInstance()->RegisterService((Service*)&g_broadcastService);}/foundation/distributedschedule/samgr_lite/communication/broadcast/source/broadcast_service.cSamgrLite*SAMGR_GetInstance(void)
{if(g_samgrImpl.mutex==NULL){
//g_samgrImpl沒有初始化,調用Init并返回g_samgrImpl.vtblInit();}
return&(GetImplement()->vtbl);}/foundation/distributedschedule/samgr_lite/samgr/source/samgr_lite.ctypedefstructSamgrLite{BOOL(*RegisterService)(Service*service);Service*(*UnregisterService)(constchar*name);BOOL(*RegisterFeature)(constchar*serviceName,Feature*feature);……}staticvoidInit(void)
{WDT_Start(WDG_SAMGR_INIT_TIME);g_samgrImpl.vtbl.RegisterService=RegisterService;g_samgrImpl.vtbl.UnregisterService=UnregisterService;g_samgrImpl.vtbl.RegisterFeature=RegisterFeature;……}廣播服務的初始化函數安全邊距5.2服務框架的啟動和注冊[5.2.2]服務框架的注冊過程示例(broadcast服務)(1)注冊系統服務:RegisterService基于OpenHarmony的嵌入式開發23staticBOOLRegisterService(Service*service){if(IsInvalidService(service)){returnFALSE;}
SamgrLiteImpl*samgr=GetImplement();MUTEX_Lock(samgr->mutex);
int16pos=VECTOR_FindByKey(&(samgr->services),(void*)service->GetName(service));if(pos>=0){MUTEX_Unlock(samgr->mutex);returnFALSE;}if(VECTOR_Num(&(samgr->services))>=MAX_SERVICE_NUM){MUTEX_Unlock(samgr->mutex);returnFALSE;}
ServiceImpl*serviceImpl=SAMGR_CreateServiceImpl(service,samgr->status);if(serviceImpl==NULL){MUTEX_Unlock(samgr->mutex);returnFALSE;}
serviceImpl->serviceId=VECTOR_Add(&(samgr->services),serviceImpl);MUTEX_Unlock(samgr->mutex);if(serviceImpl->serviceId==INVALID_INDEX){SAMGR_Free(serviceImpl);returnFALSE;}returnTRUE;}返回初始化好的SamgrLiteImpl對象匹配給定的Name,返回index創建一個serviceImpl
調用VECTOR_Add添加新的serviceImpl
安全邊距5.2服務框架的啟動和注冊[5.2.2]服務框架的注冊過程示例(broadcast服務)(2)注冊系統服務特性Feature:Init基于OpenHarmony的嵌入式開發24staticvoidInit(void)
{PubSubFeature*feature=&g_broadcastFeature;feature->relations.topic=-1;feature->relations.callbacks.consumer=NULL;UtilsListInit(&feature->relations.callbacks.node);UtilsListInit(&feature->relations.node);feature->mutex=MUTEX_InitValue();
SAMGR_GetInstance()->RegisterFeature(BROADCAST_SERVICE,(Feature*)feature);PubSubImplement*apiEntry=BCE_CreateInstance((Feature*)feature);
SAMGR_GetInstance()->RegisterFeatureApi(BROADCAST_SERVICE,
PUB_SUB_FEATURE,GET_IUNKNOWN(*apiEntry));}創建全局g_broadcastFeature,PubSubFeature類型與Service類似的,注冊特性Feature返回PubSubImplement類型對象PubSubImplement*BCE_CreateInstance(Feature*feature){g_pubSubImplement.feature=(PubSubFeature*)feature;return&g_pubSubImplement;}注冊FeatureApi將傳入的PubSubFeature添加到全局的g_pubSubImplement.feature中安全邊距5.2服務框架的啟動和注冊[5.2.2]服務框架的注冊過程示例(broadcast服務)(2)注冊系統服務特性Feature:RegisterFeature基于OpenHarmony的嵌入式開發25staticBOOLRegisterFeature(constchar*serviceName,Feature*feature){if(IsInvalidFeature(feature)){returnFALSE;}
ServiceImpl*serviceImpl=GetService(serviceName);if(serviceImpl==NULL||serviceImpl->inited!=SVC_INIT){returnFALSE;}if(DEFAULT_GetFeature(serviceImpl,feature->GetName(feature))!=NULL){returnFALSE;}int16featureId=DEFAULT_AddFeature(serviceImpl,feature);if(featureId<0){returnFALSE;}returnTRUE;}feature是否有效條件為feature及其GetName、OnInitialize、OnMessage和OnStop都不為空通過serviceName查找,返回ServiceImpl對象FeatureImpl*DEFAULT_GetFeature(ServiceImpl*serviceImpl,constchar*featureName)根據serviceImpl和featurename通過Vector查找操作返回FeatureImpl(null)int16DEFAULT_AddFeature(ServiceImpl*serviceImpl,Feature*feature)將featureImpl寫入到serviceImpl->features.data[featureId],返回featureId通過featureImpl建立起feature和serviceImpl的聯系安全邊距5.2服務框架的啟動和注冊[5.2.2]服務框架的注冊過程示例(broadcast服務)(2)注冊系統服務特性Feature:RegisterFeatureApi(3)服務初始化:啟動SAMGR_Bootstrap(),將所有已經注冊但尚未初始化啟動的服務進行初始化啟動基于OpenHarmony的嵌入式開發26staticBOOLRegisterFeatureApi(constchar*serviceName,constchar*feature,IUnknown*publicApi)
{if(IsInvalidIUnknown(publicApi)){
returnFALSE;}
ServiceImpl*serviceImpl=GetService(serviceName);if(serviceImpl==NULL){returnFALSE;}if(feature==NULL){if(serviceImpl->defaultApi!=NULL){
returnFALSE;}
serviceImpl->defaultApi=publicApi;returnTRUE;}
FeatureImpl*featureImpl=DEFAULT_GetFeature(serviceImpl,feature);if(featureImpl==NULL){returnFALSE;}returnSAMGR_AddInterface(featureImpl,publicApi);}IUnknown是否有效,條件為iUnknown存在,以及QueryInterface、AddRef和Release指針函數已經實現通過serviceName查找,返回ServiceImpl對象將默認的API設置為傳入的publicApi根據serviceImpl和featureName,通過VECTOR_FindByKey操作返回featureImpl實際實現:featureImpl->iUnknown=iUnknown;安全邊距5.3異步調用[5.3.1]消息調用的相關接口(1)SAMGR_SendRequest:發送請求基于OpenHarmony的嵌入式開發27/*Sendsarequesttoaserviceorfeatureofaspecifiedidentity.Thisfunctioniscalledbyaservicetosendmessagestoitsownfeaturesthroughthe
asynchronousfunctionofIUnknown*/int32SAMGR_SendRequest(constIdentity*identity,constRequest*request,Handlerhandler){if(request==NULL||identity==NULL){returnEC_INVALID;}Exchangeexchange={*identity,*request,{NULL,0},MSG_NON,handler,NULL};exchange.id.queueId=NULL;if(handler!=NULL){exchange.id.queueId=SAMGR_GetCurrentQueueID();exchange.type=MSG_CON;}returnQUEUE_Put(identity->queueId,&exchange,0,DONT_WAIT);}identity:pointertotheIDofthefeatureorservicethatprocessesthemessage.request:pointertotherequest.handler:functionhandlingtheresponse.IfthevalueisNULL,noresponseisrequired.structExchange{Identityid;
/**<Thetargetserviceorfeatureidentity.*/Requestrequest;Responseresponse;shorttype;
/**<Theexchangetype.*/Handlerhandler;
/**<asyncresponseorimmediatelyrequestcallbackfunction*/uint32*sharedRef;
/**<usetosharetherequestandresponseforsavingmemory*/};安全邊距5.3異步調用[5.3.1]消息調用的相關接口(2)SAMGR_SendResponse:響應請求
基于OpenHarmony的嵌入式開發28/*
Sendsaresponseafterprocessingarequest.Thisfunctioniscalledtosendaresponseafter*processingarequestbyMessageHandleofaserviceorOnMessageofafeature.*/int32SAMGR_SendResponse(constRequest*request,constResponse*response)
{
if(request==NULL){returnEC_INVALID;}Exchange*exchange=GET_OBJECT(request,Exchange,request);if(exchange->type!=MSG_CON){returnEC_INVALID;}if(exchange->handler==NULL){
returnEC_SUCCESS;}exchange->type=MSG_ACK;exchange->response.data=NULL;exchange->response.len=0;if(response!=NULL){exchange->response=*response;}
if(exchange->id.queueId==NULL){exchange->handler(&exchange->request,&exchange->response);returnEC_SUCCESS;}
int32ret=SharedSend(exchange->id.queueId,exchange,1);if(ret!=EC_SUCCESS){exchange->handler(&exchange->request,&exchange->response);(void)FreeReference(exchange);}returnEC_SUCCESS;}request:pointertotheoriginalrequest.response:pointertotheresponsecontent.notaskqueue,then
calltheresponseprocessorincurrenttask.Sendbacktotheorigintoprocessthetask.安全邊距5.3異步調用[5.3.1]消息調用的相關接口(3)SAMGR_SendSharedRequest
:發送共享請求
(4)SAMGR_SendSharedDirectRequest:直接發送請求和響應基于OpenHarmony的嵌入式開發29/*
Sendsarequesttomultipleservicesorfeaturestosavememory.Thisfunctionisusedtopublishtopics*fortheBroadcastservicetobroadcastmessages.*/uint32*SAMGR_SendSharedRequest(constIdentity*identity,constRequest*request,
uint32*token,Handlerhandler);identity:pointertotheIDsofservicesorfeatures,towhichrequestsaresent.request:pointertotherequest.token:pointertoreferencecounting.handler:functionhandlingtheresponse.IfthevalueisNULL,noresponseisrequired./*Sendsarequestandresponseofacallertothefeaturethread.Thehandlerisdirectly
calledtoprocessthe*requestandresponsewithoutusingthemessageprocessingfunctions.Thisfunctionisusedtopublishtopics*fortheBroadcastservicetobroadcastmessages.Thevalueofreferencecountingisincrementedbyoneeach
*timethisfunctioniscalled.*/int32SAMGR_SendSharedDirectRequest(constIdentity*id,constRequest*req,constResponse*resp,uint32**ref,Handlerhandler);id:pointertotheIDsofservicesorfeatures,towhichtherequestand
responsearesent.request:pointertotherequest.resp:pointertotheresponse.ref:referencecounting.handler:functionforhandlingtherequestandresponse.Thisparameter
cannotbeNULL安全邊距5.3異步調用[5.3.1]消息調用的相關接口(5)SAMGR_MsgRecv
:讀取消息
(6)SharedSend:發送共享信息基于OpenHarmony的嵌入式開發30int32SAMGR_MsgRecv(MQueueIdqueueId,uint8*interMsg,uint32size)
{if(queueId==NULL||interMsg==NULL||size==0){returnEC_INVALID;}if(memset_s(interMsg,size,0x00,size)!=EOK){returnEC_FAILURE;}returnQUEUE_Pop(queueId,interMsg,0,WAIT_FOREVER);}staticint32SharedSend(MQueueIdqueueId,Exchange*exchange,intinitRef)
{/*ifthemsgdataandresponseisNULL,wejustdirectcopy,noneedsharedthemessage.*/if((exchange->request.data==NULL||exchange->request.len<=0)&&(exchange->response.data==NULL||exchange->response.len<=0)){returnQUEUE_Put(queueId,exchange,0,DONT_WAIT);}/*1.addreference*/……(*(exchange->sharedRef))++;
……}與硬件/系統密切相關LiteOS-A:/foundation/distributedschedule/samgr_lite/samgr/adapter/posixLiteOS-M:/foundation/distributedschedule/samgr_lite/samgr/adapter/cmsis安全邊距5.3異步調用[5.3.1]消息調用的相關接口
QUEUE_Put:CMSIS
vs.POSIX基于OpenHarmony的嵌入式開發31intQUEUE_Put(MQueueIdqueueId,constvoid*element,uint8pri,inttimeout)
{uint32_twaitTime=(timeout<=0)?0:(uint32_t)timeout;
osStatus_tret=osMessageQueuePut(queueId,element,pri,waitTime);if(ret!=osOK){returnEC_BUSBUSY;}returnEC_SUCCESS;}intQUEUE_Put(
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 山西體育職業學院《C語言》2023-2024學年第二學期期末試卷
- 貴陽康養職業大學《微波測量技術及儀器》2023-2024學年第二學期期末試卷
- 寧波工程學院《成本會計學》2023-2024學年第二學期期末試卷
- 吉林城市職業技術學院《傳感與檢測技術》2023-2024學年第二學期期末試卷
- 九江職業技術學院《云計算和大數據技術》2023-2024學年第二學期期末試卷
- 南京城市職業學院《商務決策模型》2023-2024學年第二學期期末試卷
- 2024年發電機組、內燃發電機組及旋轉式變流機項目資金需求報告代可行性研究報告
- 核磁共振成像設備維護保養培訓
- 學生個人規劃課件
- 小學生感恩教育主題班會
- 中國竹笛演奏知到課后答案智慧樹章節測試答案2025年春四川音樂學院
- 農貿市場改造可行性報告
- 古詩詞誦讀《鵲橋仙(纖云弄巧)》課件(共37張) 2024-2025學年統編版高中語文必修上冊
- (高清版)DBJ33∕T 1286-2022 住宅工程質量常見問題控制標準
- 土地租賃合同詳細版樣板6篇
- SiPM讀出芯片設計:原理、案例與技術突破
- 高中家長會 高二下學期期中家長會課件
- 2025年安徽合肥東部新中心建設投資限公司招聘8人高頻重點模擬試卷提升(共500題附帶答案詳解)
- 長方體禮盒的制作(說課稿)-2023-2024學年五年級下冊數學人教版
- 2025年新西師大版數學一年級下冊課件 綜合與實踐 歡樂購物街 活動1 認識人民幣
- 健康主題班會 《如何正確與異性同學相處》班會課件
評論
0/150
提交評論