P4源碼開發(fā)人員文檔-進(jìn)程間通訊的開發(fā)者指南_第1頁
P4源碼開發(fā)人員文檔-進(jìn)程間通訊的開發(fā)者指南_第2頁
P4源碼開發(fā)人員文檔-進(jìn)程間通訊的開發(fā)者指南_第3頁
P4源碼開發(fā)人員文檔-進(jìn)程間通訊的開發(fā)者指南_第4頁
P4源碼開發(fā)人員文檔-進(jìn)程間通訊的開發(fā)者指南_第5頁
已閱讀5頁,還剩6頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

進(jìn)程/應(yīng)用之間的通信〔例如將傳感器應(yīng)用的傳感器數(shù)據(jù)發(fā)送到姿勢濾波應(yīng)用〕是PX4軟件〔node〕〕通過命名為總線〔buses〕進(jìn)展消息交換的過程被稱作訂閱主題〔topics〕。訂閱主題傳輸一個包含姿勢構(gòu)造〔滾轉(zhuǎn)、俯仰和偏航估量〕的消息。節(jié)點(diǎn)可以在總線/訂閱主題上公布〔publish〕一個消息〔發(fā)送數(shù)據(jù)〕或者訂閱〔subscribe〕一個總線/訂閱主題〔接收數(shù)據(jù)〕1個訂閱主題可以有多個公布器和訂閱器。這種設(shè)計(jì)模式阻擋了鎖定的問題〔lockingissues〕,在機(jī)器人領(lǐng)域格外常見。為了使這更為高效,通常在總線上只有一個消息,并且不會有隊(duì)列。這種公布/訂閱機(jī)制由微對象懇求處理器microobjectrequestbroker(uORB)實(shí)現(xiàn)??焖匍_頭這是一個簡潔但是完整的公布器〔publisher〕/訂閱器〔subscriber〕組合,公布器公布一個叫做random_integer的訂閱主題,并使用隨機(jī)的整數(shù)更訂閱主題。訂閱器檢查并打印這些更。topic.h/*/*declarethetopic*/ORB_DECLARE(random_integer);/*definethedatastructurethatwillbepublishedwheresubscriberscanseeit*/structrandom_integer_data{intr;6. };publisher.c#include<topic.h>/*createtopicmetadata*/ORB_DEFINE(random_integer);/*filehandlethatwillbeusedforpublishing*/staticinttopic_handle;.7.18.19.intinit{/*generatetheinitialdataforfirstpublication*/structrandom_integer_datard={.r=random,};/*advertisethetopicandmaketheinitialpublication*/topic_handle=orb_advertise(ORB_ID(random_integer),&rd);}intupdate_topic{/*generateanewrandomnumberforpublication*/structrandom_integer_datard={.r=random,};/*publishthenewdatastructure*/topic_handle,&rd);}subscriber.c#include#include<topic.h>/*filehandlethatwillbeusedforsubscribing*/staticinttopic_handle;intinit5. {/*subscribetothetopic*/topic_handle=orb_subscribe(ORB_ID(random_integer));8. }9. voidcheck_topic10.{boolupdated;structrandom_integer_datard;/*checktoseewhetherthetopichasupdatedsincethelasttimewereadit*/orb_check(topic_handle,&updated);if(updated){/*makealocalcopyoftheupdateddatastructure*/orb_copy(ORB_ID(random_integer),topic_handle,&rd);printf(“Randomintegerisnow%d\n“,rd.r);19. }20.}公布過程公布過程包含三個獨(dú)立卻相關(guān)聯(lián)的動作:定義訂閱主題,通告訂閱主題,并且公布更。定義訂閱主題定義訂閱主題器期望使用某一標(biāo)準(zhǔn)的訂閱主題和其相關(guān)的數(shù)據(jù)構(gòu)造,不需要再做額外的工作。常規(guī)訂閱主題為了定義一個常規(guī)的訂閱主題,公布器需要為訂閱器建一個可用的頭文件〔上面的topic.h〕。在這個頭文件里必需包含:ORB_DECLAREORB_DECLARE宏實(shí)例。一個用于描述將公布數(shù)據(jù)構(gòu)造的構(gòu)造定義。一個用于描述將公布數(shù)據(jù)構(gòu)造的構(gòu)造定義。訂閱主題的名字應(yīng)當(dāng)是描述性的;PX4的命名規(guī)章是是使用下劃線分開訂閱主題的名字;組件的名字應(yīng)當(dāng)首先使用通用的詞匯。sensors_raw訂閱主題中進(jìn)展公布。除了頭文件,公布器必需包含一個ORB_DEFINE宏實(shí)例在源文件中,該文件可以在構(gòu)建〔publisher.c例如〕ORB唯一表示這個topic??蛇x的訂閱主題〔optionaltopic〕用ORB_DECLARE_OPTIONAL宏代替。以這種方式聲明的訂閱主題需要由公布器進(jìn)展特別通告〔advertise〕訂閱主題在數(shù)據(jù)公布到一個訂閱主題時(shí),必需首先通告。公布器使用如下的API通告一個的訂閱主題:1. 1. /**2. *Advertiseasthepublisherofatopic.3. *4. *Thisperformstheinitialadvertisementofatopic;itcreatesthetopic.7.*nodein/objifrequiredandwritestheinitialdata.**@parammetaacro)TheuORBmetadata(usuallyfromtheORB_IDm8.*〕forthetopic.topicuORB元數(shù)據(jù)〔通常來自O(shè)RB_ID9.*@paramdata指向?qū)⒁猵ublish初始數(shù)據(jù)的指針。*eadvertisementApointertotheinitialdatatobepublished.10.Fortopicspublishedbyinterrupthandlers,th4.**@return**anmustbeperformedfromnon-interruptcontext.ERRORonerror,otherwisereturnsahandlethatcanbeusedtopublishtothetopic.Ifthetopicinquestionisnotknown(dueto15.*DECLARE)ORB_DEFINE_OPTIONALwithnocorrespondingORB_16.*ENOENT.thisfunctionwillreturn-1andseterrnoto17.18.*/ta);orb_advertise(conststructorb_metadata*meta,constvoid*da通告同時(shí)為訂閱主題公布初始數(shù)據(jù)。通告同時(shí)為訂閱主題公布初始數(shù)據(jù)。API的meta參數(shù)是由ORB_DEFINEORB_ID宏執(zhí)行從訂閱主題名到元數(shù)據(jù)構(gòu)造名的轉(zhuǎn)換。下。多個公布器〔這是個文件句柄,可以簡潔的傳遞到close〔〕函數(shù)〕,然后由另外一個公布器通告訂閱主題。公布更API,用于對訂閱主題公布更:..7.8.9./**Publishnewdatatoatopic.*Thedataisatomicallypublishedtothetopicandanywaitingsubscribers*willbenotified.Subscribersthatarenotwaitingcancheckthetopic*forupdatesusingorb_checkand/ororb_stat.*@handle@parammetao)Thehandlereturnedfromorb_advertise.TheuORBmetadata(usuallyfromtheORBmacr10.11.12.*@paramdataly.forthetopic.Apointertothedatatobepublished.OKonsuccess,ERRORotherwisewitherrnosetaccording13.14.*/externintorb_publish(conststructorb_metadata*meta,inthandle,con需要留意的是需要留意的是ORB并不緩存多個更,當(dāng)訂閱器檢查訂閱主題時(shí),只會看到最近的一個更。訂閱訂閱一個訂閱主題需要如下:一個ORB_DEFINE一個ORB_DEFINE或者ORB_DEFINE_OPTIONAL宏〔例如,在訂閱器中包含的頭文件〕含的頭文件〕在訂閱主題中公布的數(shù)據(jù)構(gòu)造定義?!餐ǔ碜砸粯拥念^文件〕在訂閱主題中公布的數(shù)據(jù)構(gòu)造定義?!餐ǔ碜砸粯拥念^文件〕假設(shè)這些條件都滿足,訂閱器使用下面的API假設(shè)這些條件都滿足,訂閱器使用下面的API來訂閱一個訂閱主題。1. /**2. *Subscribetoatopic.3. **Thereturnedvalueisafiledescriptorthatcanbepassedtopoll*inordertowaitforupdatestoatopic,aswellasorb_read,*orb_checkandorb_stat.7. **Subscriptionwillsucceedevenifthetopichasnotbeenadvertised;*inthiscasethetopicwillhaveatimestampofzero,itwillnever*signalapollevent,checkingwillalwaysreturnfalseanditcannot*becopied.Whenthetopicissubsequentlyadvertised,poll,check,*statandcopycallswillreacttotheinitialpublicationthatis*performedaspartoftheadvertisement.14. **Subscriptionwillfailifthetopicisnotknowntothesystem,i.e.*thereisnothinginthesystemthathasdefinedthetopicandthusit*canneverbepublished.18. * *@parammeta TheuORBmetadata(usuallyfromtheORB_IDmacro)* forthetopic.*@return ERRORonerror,otherwisereturnsahandle * thatcanbeusedtoreadandcheckthetopicforupdates. * Ifthetopicinquestionisnotknown(duetoan * ORB_DEFINE_OPTIONALwithnocorrespondingORB_DECLARE) * thisfunctionwillreturn-1andseterrnotoENOENT.26. */27.externint orb_subscribe(conststructorb_metadata*meta);挨次的需要。對一項(xiàng)任務(wù)可以執(zhí)行的訂閱數(shù)目并沒有具體的限制。取消對一個訂閱主題的訂閱,使用如下的API:.3.4.5./***Unsubscribefromatopic.*@paramhandlely.Ahandlereturnedfromorb_subscribe.OKonsuccess,ERRORotherwisewitherrnosetaccording6. */7. externint orb_unsubscribe(inthandle);從訂閱主題中拷貝數(shù)據(jù)訂閱器并不是引用存儲在ORB中的數(shù)據(jù),或者與其他訂閱器共享數(shù)據(jù);而是在其懇求下,將數(shù)據(jù)從ORB中拷貝出來存放在每一個訂閱器對應(yīng)的臨時(shí)緩沖區(qū)中。這一拷貝就避開了鎖定問題,并使得公布器和訂閱器的API定問題,并使得公布器和訂閱器的API都變的簡潔。也允許訂閱器準(zhǔn)時(shí)依據(jù)自己的使用需求對數(shù)據(jù)進(jìn)展修改。當(dāng)訂閱器期望得到公布到訂閱主題的最近數(shù)據(jù)拷貝時(shí),使用如下的API:.2.3.4./**Fetchdatafromatopic.*@parammetao)TheuORBmetadata(usuallyfromtheORBmacr.*@paramhandle@parambufferly.forthetopic.Ahandlereturnedfromorb_subscribe.Pointertothebufferreceivingthedata.OKonsuccess,ERRORotherwisewitherrnosetaccording9.10.*/uffer);復(fù)制可以保證數(shù)據(jù)是最公布的。更檢查orb_copy函數(shù)后,可以使用如下的API檢查從上一個時(shí)間開頭,訂閱主題是否接收到了的公布。1. /**2. *Checkwhetheratopichasbeenpublishedtosincethelastorb_copy.3. **Thischeckcanbeusedtodeterminewhethertocopyfromthetopicwhen*notusingpoll,ortoavoidtheoverheadofcallingpollwhenthe*topicislikelytohaveupdated.7. **Updatesaretrackedonaper-handlebasis;thiscallwillcontinueto*returntrueuntilorb_copyiscalledusingthesamehandle.Thisinterface3.14.15.shouldbepreferredovercallingorb_statduetotheracewindowbetweenstatandcopythatcanleadtomissedupdates.*@paramhandle@paramupdated*Ahandlereturnedfromorb_subscribe.Settotrueifthetopichasbeenpublishedsincethelasttimeitwascopiedusingthishandle.7.18.19.*@return**/OKifthecheckwassuccessful,ERRORotherwisewitherrnosetaccordingly.orb_check(inthandle,bool*updated);當(dāng)訂閱主題在通告之前,已經(jīng)被訂閱,這個API將會返回沒有更,直到訂閱主題被通告。當(dāng)訂閱主題在通告之前,已經(jīng)被訂閱,這個API將會返回沒有更,直到訂閱主題被通告。公布時(shí)間戳訂閱器可以使用如下的API檢查訂閱主題最近一次公布的時(shí)間:.5./***Returnthelasttimethatthetopicwaspublished.*@paramhandle@paramtimeorzeroifithasAhandlereturnedfromorb_subscribe.Returnsthetimethatthetopicwaspublished,6.7.**@returnly.*/externintneverbeenpublished/advertised.OKonsuccess,ERRORotherwisewitherrnosetaccording8.9.orb_stat(inthandle,uint64_t*time);布。等待更使用poll訂閱本身實(shí)際上也是文件描述符。時(shí)進(jìn)展回應(yīng)。假設(shè)其次輪沒有到任意訂閱的更,更超時(shí)計(jì)數(shù)器,并公布給其他訂閱器。color_counter.hORB_DECLARE(color_red);ORB_DECLARE(color_green);ORB_DECLARE(color_blue);ORB_DECLARE(color_timeouts);5. /*structurepublishedtocolor_red,color_green,color_blueandcolor_timeouts*/structcolor_update8. {9. intnumber;10.};color_counter.c#include<poll.h>ORB_DEFINE(color_timeouts,structcolor_update);voidsubscriber(void)18.{int sub_red,sub_green,sub_blue;int pub_timeouts;int timeouts=0;structcolor_updatecu;/*subscribetocolortopics*/sub_red=orb_subscribe(ORB_ID(color_red));sub_green=orb_subscribe(ORB_ID(color_green));sub_blue=orb_subscribe(ORB_ID(color_blue));/*advertisethetimeouttopic*/cu.number=0;pub_timeouts=orb_advertise(ORB_ID(color_timeouts),&cu);/*loopwaitingforupdates*/34. for(;;){35./*waitforupdatesora1-secondtimeout*/structpollfdfds[3]={{.fd=sub_red, .events=POLLIN},{.fd=sub_green,.events=POLLIN},{.fd=sub_blue,.events=POLLIN}41. };42. intret=poll(fds,3,1000);43.44. /*checkforatimeout*/45. if(ret==0){puts(“timeout“);cu.number=++timeouts;48.orb_publish(ORB_ID(color_timeouts),48.orb_publish(ORB_ID(color_timeouts),pub_timeouts,&cu);2.53.54./*checkforcolorupdates*/}else{if(fds[0].revents&POLLIN){orb_copy(ORB_ID(color_red),sub_red,&cu);55.printf(“redisnow%d\n“,cu.number);56.57.58.}if(fds[1].revents&POLLIN){orb_copy(ORB_ID(color_green),sub_green,&cu);59.printf(“greenisnow%d\n“,cu.number);60.61.62.}if(fds[2]

溫馨提示

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

評論

0/150

提交評論