版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quá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 意為實現(xiàn)了ZigBee協(xié)議的棧,簡稱協(xié)議棧。我們的平臺是基于 TI 的ZStack-CC2530-2.5.1a。這是一個半開源協(xié)議棧,其安全子模塊,路由模塊等關(guān)鍵代碼都以庫的方式封裝,看不到也沒辦法修改。一般只需要利用底層代碼在應(yīng)用層進行編寫即可。這種協(xié)議棧穩(wěn)定性
2、高,成本低,適用于工程人員使用。一個Z-Stack工程文件大約有10萬行代碼。面對這么多文件,讀者首先要理清楚他們的組織結(jié)構(gòu)和主要功能,因此Z-Stack采用了分層結(jié)構(gòu):這里要特別注意 Z-Stack 與 OSAL 的關(guān)系:ZigBee 網(wǎng)絡(luò)協(xié)議需要依靠 Z-Stack 協(xié)議棧實現(xiàn),而協(xié)議棧需要配合 OSAL 才能運行。OSAL 為協(xié)議棧實現(xiàn)了任務(wù)調(diào)度,并提供了多任務(wù)處理機制。OSAL類似于操作系統(tǒng)。OSAL 采用事件輪詢機制,各層初始化之后,系統(tǒng)進入低功耗模式,當事件發(fā)生時,系統(tǒng)被喚醒,開始進入中斷處理事件,事件結(jié)束后繼續(xù)進入低功耗模式。如果同時有幾個事件發(fā)生,則判斷優(yōu)先級,按次序處理事件。
3、這種軟件架構(gòu)極大降低了系統(tǒng)的功耗。協(xié)議棧中一層有一個任務(wù)task,用8位的taskID表示,在osalInitTasks()給各層分配了taskID,按優(yōu)先級排列。在各層的任務(wù)中又包含若干個事件,事件用16位的event表示,任何一個事件只占16位中的一位(0 x0001為一個事件,0 x0010為一個事件),所以任何一層最多只有16個事件。APP層中有一個系統(tǒng)事件0 x8000,為該層優(yōu)先級最高的事件。taskcan,cnt 是count(總數(shù))的簡寫,這個變量從名字就可以看出表示的是任務(wù)的數(shù)量。 tasksArr 意思是任務(wù)數(shù)組,它的原型是pTaskEventHandlerFntasksA
4、rr ,協(xié)議棧分層每層有一個任務(wù),每層都有一個事件處理函數(shù)來處理任務(wù),各層處理函數(shù)都放在了數(shù)組tsksArr中,只不過是以指針的方式存在數(shù)組tasksArr 中。任務(wù)和事件,三個和task相關(guān)的重要數(shù)據(jù)rtasksEvents,任務(wù)事件,tasksEventsidx通過idx提取該層的所有事件。const uint8 tasksCnt = sizeof( tasksArr ) / sizeof( tasksArr0 );/計算任務(wù)個數(shù)const pTaskEventHandlerFn tasksArr = macEventLoop, nwk_event_loop, Hal_ProcessEve
5、nt,. SerialApp_ProcessEvent;pTaskEventHandlerFn 從類型和翻譯就可以知道這是一個指向任務(wù)事件處理函數(shù)的指針,跳轉(zhuǎn)到SerialApp_ProcessEvent,存放了一個系統(tǒng)事件和用戶自定義的事件。結(jié)論: tasksArr是一個數(shù)組,數(shù)組里邊是指針,指針指向各種任務(wù)事件處理函數(shù)。每個函數(shù)的參數(shù)都是( uint8 task_id, UINT16 events ),每個函數(shù)的返回值都是UINT16數(shù)組taskArruint16 *tasksEventstasksEvents = (uint16 *)osal_mem_alloc( sizeof( uin
6、t16 ) * tasksCnt);/動態(tài)分配地址do if (tasksEventsidx) / 高優(yōu)先級(idx?。┑娜蝿?wù)做好準備 break;/有任務(wù)則跳出循環(huán) while (+idx tasksCnt);tasksEvents是一個指針,這是指針,但是當數(shù)組來用了數(shù)組的每個元素都對應(yīng)idx層的所有事件,事件是16位的。數(shù)組taskEventsz-stack為什么是多任務(wù)?怎么判斷優(yōu)先級。協(xié)議棧中整個組網(wǎng)過程是很復(fù)雜的,需要z-stack協(xié)議咋中各層相互配合,協(xié)議咋中就分配了很多任務(wù),TI在代碼中給各層分配了taskID,在使用osal操作系統(tǒng)執(zhí)行任務(wù)時,根據(jù)taskID來判讀各層的優(yōu)先
7、級,taskID越小優(yōu)先級越高,所以當協(xié)議棧全速運行時,先執(zhí)行的是mac層的任務(wù).各層任務(wù)中又包含16位的事件,各層中的事件也是有優(yōu)先級的,我們根據(jù)應(yīng)用層的事件來分析,應(yīng)用層中的事件除去一個系統(tǒng)事件外,還可以設(shè)置15個事件,一個事件只能占16位中的其中一位(某一位置1),系統(tǒng)事件的優(yōu)先級最高0 x8000,在應(yīng)用層中都是先處理系統(tǒng)事件,設(shè)置的事件1的位置越靠左,優(yōu)先級越高,多任務(wù)處理機制?實際上協(xié)議棧中的任務(wù)都是優(yōu)先級一個一個進行處理,只不過處理每個任務(wù)花費的時間很短,看上去就像多個任務(wù)同時進行處理一樣。在osal_run_system()函數(shù)下對任務(wù)進行分配當產(chǎn)生事件以后tasksEvent
8、sidx不為不為0.找到事件處理的代碼,關(guān)鍵分析以下幾行: events = tasksEventsidx;提取需要處理的任務(wù)事件,在這里給events賦值。 events = (tasksArridx)( idx, events );通過指針調(diào)用處理函數(shù),處理結(jié)束一個事件異或清零。 tasksEventsidx |= events;通過按位或操作,添加未處理的任務(wù)事件到任務(wù)事件數(shù)組。溫濕度代碼來體現(xiàn)任務(wù)處理機制事件的產(chǎn)生osal_set_event( uint8 task_id, uint16 event_flag )顧名思義,這個函數(shù)就是設(shè)置事件。被傳入的事件通過一個“或操作”來寫入任務(wù)的
9、事件變量。task_id是接收的任務(wù)ID,event_flag是被設(shè)置的事件。除了上面的osal_set_event()可以設(shè)置事件,還有一個函數(shù)也可以設(shè)置事件,而且可以通過定時器指定事件的時間:uint8 osal_start_timerEx( uint8 taskID, uint16 event_id, uint16 timeout_value )這里應(yīng)用了定時器,task_id是接收的任務(wù)ID,event_id是被設(shè)置的事件,而uint16 timeout_value 則是事件啟動的周期,如果設(shè)置為5000就是在5000毫秒后啟動這個事件。事件的處理 應(yīng)用層的事件處理也是按優(yōu)先級來進行的
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)的事件。處理完一個事件后異或清零。異或操作的知識按位的異或,相同為“0”,不同為“1”。異或操作的作用及思路在osal_run_system()函數(shù)中有 events=tasksEventsidx;這樣一串代碼,運行到應(yīng)
11、用層時,idx的值為8,就把應(yīng)用層的所有事件賦給了16位的events,以溫濕度代碼為例:初始值events的值就為 系統(tǒng)事件、溫濕度讀取事件、發(fā)送消息事件、及周期事件的或操作。events就為1000 0000 0000 0111,if ( events & SYS_EVENT_MSG )只要表達式不為零成立,就執(zhí)行。通過按位&與操作先把系統(tǒng)事件0 x8000提取出來,通過 return ( events SYS_EVENT_MSG )異或之后events的值就為0000 0000 0000 0111作為返回值, 異或之后的代碼不執(zhí)行,只有在下次循環(huán)時才會執(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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度消防工程應(yīng)急演練組織與實施分包合同3篇
- 2025年度演藝經(jīng)紀合同:藝人簽約與管理及演出安排2篇
- 二零二五年度二手車買賣及二手車交易糾紛處理辦法協(xié)議2篇
- 2024年度知識產(chǎn)權(quán)交易撮合及服務(wù)合同3篇
- 2024年度智慧城市建設(shè)項目薪酬激勵合同3篇
- 二零二五年度別墅銷售代理合作協(xié)議3篇
- 福建衛(wèi)生職業(yè)技術(shù)學(xué)院《外國女性作家作品研究》2023-2024學(xué)年第一學(xué)期期末試卷
- 醫(yī)院安消一體管理平臺建設(shè)需求
- 二零二五年度企業(yè)股權(quán)激勵實施細節(jié)合同3篇
- 2025年度版權(quán)質(zhì)押合同:甲方將其所持有的某部作品的著作權(quán)質(zhì)押給乙方質(zhì)押期限為2025年月日至2025年月3日3篇
- (完整版)自動感應(yīng)門施工方案
- [QC成果]提高剪力墻施工質(zhì)量一次合格率
- 樂高基礎(chǔ)篇樂高積木和搭建種類專題培訓(xùn)課件
- 8站小車呼叫的plc控制
- _ 基本粒子與宏觀物體內(nèi)在聯(lián)系
- 象棋比賽積分編排表
- 小學(xué)贛美版六年級美術(shù)上冊第二十課向往和平課件(16張)ppt課件
- DPP4抑制劑比較篇PPT課件
- 中藥飲片購進驗收記錄表格模板
- TCM遠紅外發(fā)展初析
- 滑坡穩(wěn)定性計算及滑坡推力計算
評論
0/150
提交評論