簡要分析z-stack的任務(wù)處理機(jī)制_第1頁
簡要分析z-stack的任務(wù)處理機(jī)制_第2頁
簡要分析z-stack的任務(wù)處理機(jī)制_第3頁
簡要分析z-stack的任務(wù)處理機(jī)制_第4頁
簡要分析z-stack的任務(wù)處理機(jī)制_第5頁
已閱讀5頁,還剩9頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、Z-STACK協(xié)議棧任務(wù)調(diào)度以溫濕度傳感器代碼為例講解ZigBee 是一種低速短距離傳輸?shù)臒o線網(wǎng)絡(luò)協(xié)議,這一名稱(又稱紫蜂協(xié)議)來源于蜜蜂的八字舞。蜜蜂(bee)是靠飛翔和“嗡嗡”(zig)地抖動翅膀的“舞蹈”來與同伴傳遞花粉所在方位信息,也就是說蜜蜂依靠這樣的方式構(gòu)成了群體中的通信網(wǎng)絡(luò),ZigBee 協(xié)議因此而得名。Z-Stack 意為實(shí)現(xiàn)了ZigBee協(xié)議的棧,簡稱協(xié)議棧。我們的平臺是基于 TI 的ZStack-CC2530-2.5.1a。這是一個(gè)半開源協(xié)議棧,其安全子模塊,路由模塊等關(guān)鍵代碼都以庫的方式封裝,看不到也沒辦法修改。一般只需要利用底層代碼在應(yīng)用層進(jìn)行編寫即可。這種協(xié)議棧穩(wěn)定性

2、高,成本低,適用于工程人員使用。一個(gè)Z-Stack工程文件大約有10萬行代碼。面對這么多文件,讀者首先要理清楚他們的組織結(jié)構(gòu)和主要功能,因此Z-Stack采用了分層結(jié)構(gòu):這里要特別注意 Z-Stack 與 OSAL 的關(guān)系:ZigBee 網(wǎng)絡(luò)協(xié)議需要依靠 Z-Stack 協(xié)議棧實(shí)現(xiàn),而協(xié)議棧需要配合 OSAL 才能運(yùn)行。OSAL 為協(xié)議棧實(shí)現(xiàn)了任務(wù)調(diào)度,并提供了多任務(wù)處理機(jī)制。OSAL類似于操作系統(tǒng)。OSAL 采用事件輪詢機(jī)制,各層初始化之后,系統(tǒng)進(jìn)入低功耗模式,當(dāng)事件發(fā)生時(shí),系統(tǒng)被喚醒,開始進(jìn)入中斷處理事件,事件結(jié)束后繼續(xù)進(jìn)入低功耗模式。如果同時(shí)有幾個(gè)事件發(fā)生,則判斷優(yōu)先級,按次序處理事件。

3、這種軟件架構(gòu)極大降低了系統(tǒng)的功耗。協(xié)議棧中一層有一個(gè)任務(wù)task,用8位的taskID表示,在osalInitTasks()給各層分配了taskID,按優(yōu)先級排列。在各層的任務(wù)中又包含若干個(gè)事件,事件用16位的event表示,任何一個(gè)事件只占16位中的一位(0 x0001為一個(gè)事件,0 x0010為一個(gè)事件),所以任何一層最多只有16個(gè)事件。APP層中有一個(gè)系統(tǒng)事件0 x8000,為該層優(yōu)先級最高的事件。taskcan,cnt 是count(總數(shù))的簡寫,這個(gè)變量從名字就可以看出表示的是任務(wù)的數(shù)量。 tasksArr 意思是任務(wù)數(shù)組,它的原型是pTaskEventHandlerFntasksA

4、rr ,協(xié)議棧分層每層有一個(gè)任務(wù),每層都有一個(gè)事件處理函數(shù)來處理任務(wù),各層處理函數(shù)都放在了數(shù)組tsksArr中,只不過是以指針的方式存在數(shù)組tasksArr 中。任務(wù)和事件,三個(gè)和task相關(guān)的重要數(shù)據(jù)rtasksEvents,任務(wù)事件,tasksEventsidx通過idx提取該層的所有事件。const uint8 tasksCnt = sizeof( tasksArr ) / sizeof( tasksArr0 );/計(jì)算任務(wù)個(gè)數(shù)const pTaskEventHandlerFn tasksArr = macEventLoop, nwk_event_loop, Hal_ProcessEve

5、nt,. SerialApp_ProcessEvent;pTaskEventHandlerFn 從類型和翻譯就可以知道這是一個(gè)指向任務(wù)事件處理函數(shù)的指針,跳轉(zhuǎn)到SerialApp_ProcessEvent,存放了一個(gè)系統(tǒng)事件和用戶自定義的事件。結(jié)論: tasksArr是一個(gè)數(shù)組,數(shù)組里邊是指針,指針指向各種任務(wù)事件處理函數(shù)。每個(gè)函數(shù)的參數(shù)都是( uint8 task_id, UINT16 events ),每個(gè)函數(shù)的返回值都是UINT16數(shù)組taskArruint16 *tasksEventstasksEvents = (uint16 *)osal_mem_alloc( sizeof( uin

6、t16 ) * tasksCnt);/動態(tài)分配地址do if (tasksEventsidx) / 高優(yōu)先級(idx?。┑娜蝿?wù)做好準(zhǔn)備 break;/有任務(wù)則跳出循環(huán) while (+idx tasksCnt);tasksEvents是一個(gè)指針,這是指針,但是當(dāng)數(shù)組來用了數(shù)組的每個(gè)元素都對應(yīng)idx層的所有事件,事件是16位的。數(shù)組taskEventsz-stack為什么是多任務(wù)?怎么判斷優(yōu)先級。協(xié)議棧中整個(gè)組網(wǎng)過程是很復(fù)雜的,需要z-stack協(xié)議咋中各層相互配合,協(xié)議咋中就分配了很多任務(wù),TI在代碼中給各層分配了taskID,在使用osal操作系統(tǒng)執(zhí)行任務(wù)時(shí),根據(jù)taskID來判讀各層的優(yōu)先

7、級,taskID越小優(yōu)先級越高,所以當(dāng)協(xié)議棧全速運(yùn)行時(shí),先執(zhí)行的是mac層的任務(wù).各層任務(wù)中又包含16位的事件,各層中的事件也是有優(yōu)先級的,我們根據(jù)應(yīng)用層的事件來分析,應(yīng)用層中的事件除去一個(gè)系統(tǒng)事件外,還可以設(shè)置15個(gè)事件,一個(gè)事件只能占16位中的其中一位(某一位置1),系統(tǒng)事件的優(yōu)先級最高0 x8000,在應(yīng)用層中都是先處理系統(tǒng)事件,設(shè)置的事件1的位置越靠左,優(yōu)先級越高,多任務(wù)處理機(jī)制?實(shí)際上協(xié)議棧中的任務(wù)都是優(yōu)先級一個(gè)一個(gè)進(jìn)行處理,只不過處理每個(gè)任務(wù)花費(fèi)的時(shí)間很短,看上去就像多個(gè)任務(wù)同時(shí)進(jìn)行處理一樣。在osal_run_system()函數(shù)下對任務(wù)進(jìn)行分配當(dāng)產(chǎn)生事件以后tasksEvent

8、sidx不為不為0.找到事件處理的代碼,關(guān)鍵分析以下幾行: events = tasksEventsidx;提取需要處理的任務(wù)事件,在這里給events賦值。 events = (tasksArridx)( idx, events );通過指針調(diào)用處理函數(shù),處理結(jié)束一個(gè)事件異或清零。 tasksEventsidx |= events;通過按位或操作,添加未處理的任務(wù)事件到任務(wù)事件數(shù)組。溫濕度代碼來體現(xiàn)任務(wù)處理機(jī)制事件的產(chǎn)生osal_set_event( uint8 task_id, uint16 event_flag )顧名思義,這個(gè)函數(shù)就是設(shè)置事件。被傳入的事件通過一個(gè)“或操作”來寫入任務(wù)的

9、事件變量。task_id是接收的任務(wù)ID,event_flag是被設(shè)置的事件。除了上面的osal_set_event()可以設(shè)置事件,還有一個(gè)函數(shù)也可以設(shè)置事件,而且可以通過定時(shí)器指定事件的時(shí)間:uint8 osal_start_timerEx( uint8 taskID, uint16 event_id, uint16 timeout_value )這里應(yīng)用了定時(shí)器,task_id是接收的任務(wù)ID,event_id是被設(shè)置的事件,而uint16 timeout_value 則是事件啟動的周期,如果設(shè)置為5000就是在5000毫秒后啟動這個(gè)事件。事件的處理 應(yīng)用層的事件處理也是按優(yōu)先級來進(jìn)行的

10、,1的位置越靠左優(yōu)先級越高。優(yōu)先級最高的為系統(tǒng)事件0 x8000,系統(tǒng)事件中又使用switchcase :語句分成三小部分,如果設(shè)備加入,或組建網(wǎng)絡(luò)都是先執(zhí)行系統(tǒng)事件中的ZDO_START_CHANGE上圖所示是用戶自己設(shè)定的溫濕度讀取事件,周期事件,發(fā)送事件,優(yōu)先級溫室度讀取事件較高,在tempandhum.c中seriaAPP_processEvent()函數(shù)下能找到其對應(yīng)的事件。處理完一個(gè)事件后異或清零。異或操作的知識按位的異或,相同為“0”,不同為“1”。異或操作的作用及思路在osal_run_system()函數(shù)中有 events=tasksEventsidx;這樣一串代碼,運(yùn)行到應(yīng)

11、用層時(shí),idx的值為8,就把應(yīng)用層的所有事件賦給了16位的events,以溫濕度代碼為例:初始值events的值就為 系統(tǒng)事件、溫濕度讀取事件、發(fā)送消息事件、及周期事件的或操作。events就為1000 0000 0000 0111,if ( events & SYS_EVENT_MSG )只要表達(dá)式不為零成立,就執(zhí)行。通過按位&與操作先把系統(tǒng)事件0 x8000提取出來,通過 return ( events SYS_EVENT_MSG )異或之后events的值就為0000 0000 0000 0111作為返回值, 異或之后的代碼不執(zhí)行,只有在下次循環(huán)時(shí)才會執(zhí)行到。osal_run_system() 函數(shù)下先是把tasksEventsidx =0;清零然后再通過

溫馨提示

  • 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

提交評論