項目三 了解無線傳感器協(xié)議棧_第1頁
項目三 了解無線傳感器協(xié)議棧_第2頁
項目三 了解無線傳感器協(xié)議棧_第3頁
項目三 了解無線傳感器協(xié)議棧_第4頁
項目三 了解無線傳感器協(xié)議棧_第5頁
已閱讀5頁,還剩51頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

項目三了解ZigBee無線傳感器網(wǎng)絡(luò)協(xié)議棧1a知識目標(biāo):1.掌握zigbee無線傳感器網(wǎng)絡(luò)的協(xié)議棧和協(xié)議的區(qū)別等知識。2.掌握Z-Stack協(xié)議棧的OSAL分配機制。3.了解Z-Stack協(xié)議棧的OSAL運行機制。4.掌握Z-Stack協(xié)議棧的OSAL常用函數(shù)。項目三了解ZigBee無線傳感器網(wǎng)絡(luò)協(xié)議棧2a技能目標(biāo):1.掌握Z-Stack協(xié)議棧的運行機制。2.掌握Z-Stack協(xié)議棧中OSAL的添加新任務(wù)的方法。。項目三了解ZigBee無線傳感器網(wǎng)絡(luò)協(xié)議棧3a在實際zigbee無線傳感器網(wǎng)絡(luò)工程的開發(fā)過程中:首先借助TI提供的協(xié)議棧中例程SampleApp,接著根據(jù)需要完成的功能,查看支持Z-Stack協(xié)議棧的硬件電路圖,再查閱數(shù)據(jù)手冊(CC2530的數(shù)據(jù)手冊、Z-Stack協(xié)議棧說明、Z-Stack協(xié)議棧API函數(shù)使用說明等)文件,然后再進(jìn)行協(xié)議棧的修改。最后,還需要燒錄器下載到相應(yīng)的硬件,實現(xiàn)zigbee無線傳感器網(wǎng)絡(luò)的組建和開發(fā)。設(shè)計思路4a3.1.1協(xié)議與協(xié)議棧協(xié)議定義的是一系列的通信標(biāo)準(zhǔn),通信雙方需要共同按照這一標(biāo)準(zhǔn)進(jìn)行正常的數(shù)據(jù)收發(fā);議棧是協(xié)議的具體實現(xiàn)形式。通俗的理解為代碼實現(xiàn)的函數(shù)庫,以便于開發(fā)人員調(diào)用。3.1Z-Stack協(xié)議棧5a3.1.1協(xié)議與協(xié)議棧協(xié)議棧是指網(wǎng)絡(luò)中各層協(xié)議的總和,一套協(xié)議的規(guī)范。其形象地反映了一個網(wǎng)絡(luò)中文件傳輸?shù)倪^程:由上層協(xié)議到底層協(xié)議,再由底層協(xié)議到上層協(xié)議。使用最廣泛的是因特網(wǎng)協(xié)議棧,由上到下的協(xié)議分別是:應(yīng)用層(Http、Telnet、DNS、Email等),運輸層(TCP、UDP),網(wǎng)絡(luò)層(IP),鏈路層(WI-FI、以太網(wǎng)、令牌環(huán)、FDDI等)。3.1Z-Stack協(xié)議棧6a3.1.1協(xié)議與協(xié)議棧3.1Z-Stack協(xié)議棧7a3.1.1協(xié)議與協(xié)議棧Zigbee協(xié)議棧開發(fā)的基本思路如下。①借助TI提供的協(xié)議棧中例程SampleApp進(jìn)行二次開發(fā),用戶不需要深入研究復(fù)雜的zigbee協(xié)議棧,這樣可以減輕開發(fā)者的工作量。②Zigbee無線傳感器網(wǎng)絡(luò)中數(shù)據(jù)采集,只需要用戶在應(yīng)用層加入傳感器的讀取函數(shù)和添加頭文件即可實現(xiàn)。③如果考慮節(jié)能,可以根據(jù)數(shù)據(jù)采集周期(zigbee協(xié)議棧例程中已開發(fā)了定時程序)進(jìn)行定時,定時時間到就喚醒zigbee終端節(jié)點,終端節(jié)點喚醒后,自動采集傳感器數(shù)據(jù),然后將數(shù)據(jù)發(fā)送給路由器或者直接發(fā)給協(xié)調(diào)器,即監(jiān)測節(jié)點定時匯報監(jiān)測數(shù)據(jù)。④協(xié)調(diào)器(網(wǎng)關(guān))根據(jù)下發(fā)的控制命令,將控制信息轉(zhuǎn)發(fā)到具體的節(jié)點,即控制節(jié)點等待控制命令下發(fā)。3.1Z-Stack協(xié)議棧8a3.1.2使用Z-Stack協(xié)議棧傳輸SampleApp.c中定義了發(fā)送函數(shù)staticvoidSampleApp_SendTheMessage(void)。該函數(shù)通過調(diào)用AF_DataRequest來發(fā)送數(shù)據(jù)。該函數(shù)定義在Profile目錄下的AF.c文件中。3.1Z-Stack協(xié)議棧9a3.1.2使用Z-Stack協(xié)議棧傳輸*dstAddr:發(fā)送目的地址+端點地址(端點號)和傳送模式。*srcEP:源(答復(fù)或確認(rèn))終端的描述(比如操作系統(tǒng)中任務(wù)ID等)源EP。cID:被Profile指定的有效的集群號。len:發(fā)送數(shù)據(jù)長度。*buf:指向存放發(fā)送數(shù)據(jù)的緩沖區(qū)的指針。*transID:任務(wù)ID號。options:有效位掩碼的發(fā)送選項。Radius:發(fā)送跳數(shù),通常設(shè)置為AF_DEFAULT_RADIUS。3.1Z-Stack協(xié)議棧10a3.2.1物理層

物理層(PHY)定義了無線信道和MAC子層之間的接口,提供物理層數(shù)據(jù)服務(wù)和物理層管理服務(wù),主要是在驅(qū)動程序的基礎(chǔ)上,實現(xiàn)數(shù)據(jù)傳輸和管理。物理層數(shù)據(jù)服務(wù)從無線物理信道上收發(fā)數(shù)據(jù),管理服務(wù)包括信道能量監(jiān)測(ED)、鏈接質(zhì)量指示(LQI)、載波檢測(CS)和空閑信道評估(CCA)等,維護(hù)一個由物理層相關(guān)數(shù)據(jù)組成的數(shù)據(jù)庫。3.2zigbee無線傳感器網(wǎng)絡(luò)功能層簡介11a3.2.2質(zhì)訪問控制層介質(zhì)訪問控制層(MAC)提供點對點通信的數(shù)據(jù)確認(rèn)(Per-hopAcknowledgments)以及一些用于網(wǎng)絡(luò)發(fā)現(xiàn)和網(wǎng)絡(luò)形成的命令,但是介質(zhì)訪問控制層不支持多跳(Multi-hop)、網(wǎng)型網(wǎng)絡(luò)(Mesh)等概念3.2zigbee無線傳感器網(wǎng)絡(luò)功能層簡介12a3.2.3網(wǎng)絡(luò)層

網(wǎng)絡(luò)層(NWK)主要負(fù)責(zé)設(shè)備加入和退出網(wǎng)絡(luò)、路由管理,在設(shè)備之間發(fā)現(xiàn)和維護(hù)路由,發(fā)現(xiàn)鄰設(shè)備,存儲鄰設(shè)備信息等。3.2zigbee無線傳感器網(wǎng)絡(luò)功能層簡介13a3.2.3網(wǎng)絡(luò)層網(wǎng)絡(luò)層(NWK)主要負(fù)責(zé)設(shè)備加入和退出網(wǎng)絡(luò)、路由管理,在設(shè)備之間發(fā)現(xiàn)和維護(hù)路由,發(fā)現(xiàn)鄰設(shè)備,存儲鄰設(shè)備信息等。1.地址類型網(wǎng)絡(luò)地址分配Z-Stack尋址路由安全3.2zigbee無線傳感器網(wǎng)絡(luò)功能層簡介14a3.2.4應(yīng)用層

應(yīng)用層主要包括應(yīng)用支持子層(APS)和Zigbee設(shè)備對象(ZDO)。其中,APS負(fù)責(zé)維護(hù)和綁定表、在綁定設(shè)備之間傳送消息;而ZDO定義設(shè)備在網(wǎng)絡(luò)中的角色,發(fā)起和響應(yīng)綁定請求,在網(wǎng)絡(luò)設(shè)備之間建立安全機制。3.2zigbee無線傳感器網(wǎng)絡(luò)功能層簡介15a3.3.1OSAL基礎(chǔ)知識1.資源(Resource)2.共享資源(SharedResource)3.任務(wù)(Task)4.多任務(wù)運行(Muti-TaskRunning)5.內(nèi)核(Kernel)6.互斥(MutualExclusion)7.消息隊列(MessageQueue)3.3OSAL多任務(wù)分配機制16a3.3.1OSAL基礎(chǔ)知識1.資源(Resource)2.共享資源(SharedResource)3.任務(wù)(Task)4.多任務(wù)運行(Muti-TaskRunning)5.內(nèi)核(Kernel)6.互斥(MutualExclusion)7.消息隊列(MessageQueue)3.3OSAL多任務(wù)分配機制17a3.3.2OSAL簡介

Z-stack是TI公司開發(fā)的zigbee協(xié)議棧,并經(jīng)過zigbee聯(lián)盟認(rèn)可而被全球眾多開發(fā)商所廣泛采用。Z-Stack采用基于一個輪轉(zhuǎn)查詢式操作系統(tǒng),幫助程序員方便地開發(fā)一套zigbee系統(tǒng)。3.3OSAL多任務(wù)分配機制18a3.3.2OSAL簡介3.3OSAL多任務(wù)分配機制19a3.3.2OSAL簡介

一般情況下,用戶只需額外添加3個文件就可以完成一個項目,一個是主控文件,存放具體的任務(wù)事件處理函數(shù)(例如SampleApp_ProcessEvent或GenericApp_ProcessEvent);一個是這個主控文件的頭文件(例如SampleApp.h),另外一個是操作系統(tǒng)接口文件(例如OSAL_SampleApp.c),該文件主要存放任務(wù)數(shù)組tasksArr[],任務(wù)數(shù)組的具體內(nèi)容為每個任務(wù)的相應(yīng)的處理函數(shù)指針。3.3OSAL多任務(wù)分配機制20a3.3.2OSAL簡介

“數(shù)據(jù)實體接口”的目標(biāo)是向上層提供所需的常規(guī)數(shù)據(jù)服務(wù);“管理實體接口”的目標(biāo)是向上層提供訪問內(nèi)部層的參數(shù)、配置和管理數(shù)據(jù)服務(wù)。物理層和媒體接入控制子層均屬于IEEE802.15.4標(biāo)準(zhǔn),而IEEE802.15.4標(biāo)準(zhǔn)與網(wǎng)絡(luò)/安全層、應(yīng)用層一起,構(gòu)成了zigbee協(xié)議棧。3.3OSAL多任務(wù)分配機制21a3.3.3協(xié)議棧軟件架構(gòu)

整個Z-Stack的主要工作流程大致分為系統(tǒng)啟動、驅(qū)動初始化、OSAL初始化和啟動、進(jìn)入任務(wù)輪詢幾個階段。3.3OSAL多任務(wù)分配機制22a3.3.3協(xié)議棧軟件架構(gòu)3.3OSAL多任務(wù)分配機制23a3.3.3協(xié)議棧軟件架構(gòu)系統(tǒng)上電后,通過執(zhí)行ZMain文件夾中ZMain.c的main()函數(shù)實現(xiàn)硬件的初始化。關(guān)總中斷osal_int_disable(INTS_ALL);初始化板上硬件設(shè)置HAL_BOARD_INIT();檢查工作電壓狀態(tài)zmain_vdd_check();初始化I/O口InitBoard(OB_COLD);初始化HAL層驅(qū)動HalDriverInit();初始化非易失性存儲器sal_nv_init(NULL);初始化MAC層ZMacInit();分配64位地址zmain_ext_addr();初始化Zstack的全局變量并初始化必要的NV項目zgInit();初始化操作系統(tǒng)osal_init_system();使能全局中斷osal_int_enable(INTS_ALL);初始化后續(xù)硬件InitBoard(OB_READY);顯示必要的硬件信息zmain_dev_info();最后進(jìn)入操作系統(tǒng)調(diào)度osal_start_system()。3.3OSAL多任務(wù)分配機制24a此例程的默認(rèn)路徑為C:\TexasInstruments\ZStack-CC2530-2.3.0-1.4.0\Projects\zstack\Samples\SampleApp\CC2530DB下找到SampleApp.eww。在右側(cè)工作空間窗口打開App文件夾,我們可以看到5個文件,分別是“SampleApp.c”、“SampleApp.h”、“OSAL_SampleApp.c”、“SampleAppHw.c”、“SampleAppHw.h”。整個程序所實現(xiàn)的功能都在這5個文件當(dāng)中。3.4OSAL運行機制25a運行機制。3.4OSAL運行機制26a①tasksCnt該變量保存了任務(wù)數(shù),其聲明為constuint8tasksCnt,其中uint8的定義為typedefunsignedcharuint8。tasksCnt變量的定義在OSALSampleApp.c文件中。②tasksEvents該變量是一個指針,指向了事件表的首地址,其聲明為uint16*tasksEvents,其中uint16的定義為typedefunsignedshortuint16。tasksEvents[]是一個指針數(shù)組,只是在OSAL_SampleApp.c文件進(jìn)行定義。③tasksArr該變量是一個數(shù)組,該數(shù)組的每一項都是一個函數(shù)指針,指向了事件的處理函數(shù),其聲明為pTaskEventHandlerFntasksArr[],其中pTaskEventHandlerFn的定義為typedefunsignedshort(*pTaskEventHandlerFn)(unsignedchartask_id,unsignedshortevent)。變量pTaskEventHandlerFn的定義OSAL_Tasks.h文件中。3.4OSAL運行機制27aOSAL調(diào)度機制如下。①入口程序為Zmain.c;②執(zhí)行main()主程序;③任務(wù)調(diào)度初始化osal_init_system();④默認(rèn)啟動了osalInitTasks(),最多9個任務(wù),添加到隊列,序號0~8;⑤最后通過調(diào)用SampleApp_Init()實現(xiàn)用戶自定義任務(wù)的初始化(用戶根據(jù)項目需要修改該函數(shù))。3.4OSAL運行機制28a3.4.1OSAL任務(wù)啟動和初始化任何OSAL任務(wù)的工作必須分為兩步:一是進(jìn)行任務(wù)初始化;二是處理任務(wù)事件。3.4OSAL運行機制開始系統(tǒng)初始化執(zhí)行操作系統(tǒng)29a3.4.1OSAL任務(wù)啟動和初始化任務(wù)初始化主要步驟如下。①初始化應(yīng)用服務(wù)變量constpTaskEventHandlerFntasksArr[]數(shù)組定義系統(tǒng)提供的應(yīng)用服務(wù)和用戶服務(wù)變量,如MAC層服務(wù)macEventLoop、用戶服務(wù)SampleApp_ProcessEvent等。②分配任務(wù)ID和分配堆棧內(nèi)存voidosalInitTasks(void)主要功能是通過調(diào)用osal_mem_alloc()函數(shù)給各個任務(wù)分配內(nèi)存空間,給各個已定義任務(wù)指定唯一的標(biāo)識號。③在AF層注冊應(yīng)用對象通過填入endPointDesc_t數(shù)據(jù)格式的EndPoint變量,調(diào)用afRegister()在AF層注冊EndPoint應(yīng)用對象。通過在AF層注冊應(yīng)用對象的信息,告知系統(tǒng)afAddrType_t地址類型數(shù)據(jù)包的路由端點,例如用于發(fā)送周期信息的SampleApp_Periodic_DstAddr和發(fā)送LED閃爍指令的SampleApp_Flash_DstAddr。④注冊相應(yīng)的OSAL或者HAL系統(tǒng)服務(wù)在協(xié)議棧中,Z-Stack提供鍵盤響應(yīng)和串口活動響應(yīng)兩種系統(tǒng)服務(wù),但是任何Z-Stask任務(wù)均不自行注冊系統(tǒng)服務(wù),兩者均需要由用戶應(yīng)用程序注冊。值得注意的是,有且僅有一個OSALTask可以注冊服務(wù)。例如注冊鍵盤活動響應(yīng)可調(diào)用RegisterForKeys()函數(shù)。⑤處理任務(wù)事件處理任務(wù)事件通過創(chuàng)建“ApplicationName”_ProcessEvent()函數(shù)處理。一個OSAL任務(wù)可以響應(yīng)16個事件,除了協(xié)議棧默認(rèn)的強制事件(MandatoryEvents)之外還可以再定義15個事件。3.4OSAL運行機制30a3.4.1OSAL任務(wù)啟動和初始化SYS_EVENT_MSG(0x8000)是強制事件。該事件主要用來發(fā)送全局的系統(tǒng)信息,包括以下信息。AF_DATA_CONFIRM_CMD:該信息用來指示通過喚醒AFDataRequest()函數(shù)發(fā)送的數(shù)據(jù)請求信息的情況。AF_INCOMING_MSG_CMD:用來指示接收到的AF信息。KEY_CHANGE:用來確認(rèn)按鍵動作。ZDO_NEW_DSTADDR:用來指示自動匹配請求。ZDO_STATE_CHANGE:用來指示網(wǎng)絡(luò)狀態(tài)的變化。3.4OSAL運行機制31a3.4.2OSAL任務(wù)的執(zhí)行osal_start_system();//運行系統(tǒng)[OSAL.c],進(jìn)入系統(tǒng)調(diào)度,無返回osal_start_system();//此函數(shù)是任務(wù)系統(tǒng)的主循環(huán)函數(shù),它將輪詢所有任務(wù)事件然后調(diào)用相關(guān)的任務(wù)處理函數(shù),沒有任務(wù)時將進(jìn)入休眠狀態(tài)。3.4OSAL運行機制32a事件表和函數(shù)表的關(guān)系3.4OSAL運行機制tasksEvents[0]macEventsLooptasksEvents[1]nwk_events_loopHal_ProcessEventtasksEvents[2]tasksEvents[3]tasksEvents[4]tasksEvents[5]tasksEvents[6]tasksEvents[7]tasksEvents[8]MT_ProcessEventAPS_event_loopAPSF_ProcessEventZDApp_event_loopZDNwkMgr_event_loopSampleApp_ProcessEventtasksEventtasksArr[0]tasksArr[1]tasksArr[2]tasksArr[3]tasksArr[4]tasksArr[5]tasksArr[6]tasksArr[7]tasksArr[8]33ataskArr這個數(shù)組里存放了所有任務(wù)的事件處理函數(shù)的地址,在這里事件處理函數(shù)就代表了任務(wù)本身,也就是說事件處理函數(shù)標(biāo)識了與其對應(yīng)的任務(wù)。

tasksCnt這個變量保存了當(dāng)前的任務(wù)個數(shù),最大任務(wù)數(shù)量為9。tasksEvents是一個指向數(shù)組的指針,此數(shù)組保存了當(dāng)前任務(wù)的狀態(tài)。OSAL每個任務(wù)可以有16個事件,其中SYS_EVENT_MSG定義為0x8000,為系統(tǒng)事件,用戶可以定義剩余的15個事件。3.4OSAL運行機制34a其中,任務(wù)處理函數(shù)具體如下。macEventLoop,//MAC層任務(wù)處理函數(shù)nwk_event_loop,//網(wǎng)絡(luò)層任務(wù)處理函數(shù)Hal_ProcessEvent,//硬件抽象層任務(wù)處理函數(shù)MT_ProcessEvent,//監(jiān)控任務(wù)處理函數(shù)可選(透過編譯選項MT_TASK來決定是否編譯該任務(wù)處理函數(shù),一般情況下該功能通過串行端口通信來交換實現(xiàn))APS_event_loop,//應(yīng)用支持子層任務(wù)處理函數(shù),用戶不用修改APSF_ProcessEvent,//應(yīng)用支持子層消息分割任務(wù)處理函數(shù)(用戶編譯選項ZIGBEE_FRAGMENTATION來決定是否啟動zigbee消息分割功能)ZDApp_event_loop,//設(shè)備應(yīng)用層任務(wù)處理函數(shù),用戶可以根據(jù)需要修改ZDNwkMgr_event_loop,//網(wǎng)絡(luò)管理層任務(wù)處理函數(shù)(用戶可透過編譯選項ZIGBEE_FREQ_AGILITY或ZIGBEE_PANID_CONFIG來實現(xiàn)該功能)SampleApp_ProcessEvent,//用戶應(yīng)用層任務(wù)處理函數(shù),用戶自己編寫。3.4OSAL運行機制35a3.4.3OSAL的事件傳遞機制

從天線接收到數(shù)據(jù)后,會產(chǎn)生AF_INCOMING_MSG_CMD消息,但是任務(wù)的事件處理函數(shù)在處理這個事件的時候,還需要得到所接收到的數(shù)據(jù)。因此,這就需要將事件和數(shù)據(jù)封裝成一個消息,將消息發(fā)送到消息隊列,然后在事件處理函數(shù)中就可以使用osal_msg_receive,從消息隊列中得到該消息,即MSGpkt=(afIncomingMSGPacket_t*)osal_msg_receive(SampleicApp_TaskID);3.4OSAL運行機制36a3.4.3OSAL的事件傳遞機制3.4OSAL運行機制用戶自定義的消息uint8dest_iduint16lenvoid*next用戶自定義的消息uint8dest_iduint16lenvoid*nextuint8dest_iduint16lenvoid*next用戶自定義的消息37a3.4.3OSAL的事件傳遞機制(1)協(xié)調(diào)器從沒有網(wǎng)絡(luò)到組建起網(wǎng)絡(luò),觸發(fā)網(wǎng)絡(luò)狀態(tài)變更事件ZDO_STATE_CHANGE。(2)路由/節(jié)點從沒有接入網(wǎng)絡(luò)到接入網(wǎng)絡(luò),觸發(fā)網(wǎng)絡(luò)狀態(tài)變更事件ZDO_STATE_CHANGE。3.4OSAL運行機制38a3.4.3OSAL的事件傳遞機制caseZDO_STATE_CHANGE:SampleApp_NwkState=(devStates_t)(MSGpkt->hdr.status);if((SampleApp_NwkState==DEV_ZB_COORD)||(SampleApp_NwkState==DEV_ROUTER)||(SampleApp_NwkState==DEV_END_DEVICE)){

//Startsendingtheperiodicmessageinaregularinterval.3.4OSAL運行機制39a3.4.3OSAL的事件傳遞機制這個表示默認(rèn)啟動第2個事件SAMPLEAPP_SEND_PERIODIC_MSG_EVT。osal_start_timerEx(SampleApp_TaskID,SAMPLEAPP_SEND_PERIODIC_MSG_EVT,SAMPLEAPP_SEND_PERIODIC_MSG_TIMEOUT);//5s定時事件}else{//Deviceisnolongerinthenetwork}break;3.4OSAL運行機制40a3.4.4OSAL添加新任務(wù)在Z-Stack中,對于每個用戶自己新建立的任務(wù)通常需要2個相關(guān)的處理函數(shù),具體如下。(1)新任務(wù)的初始化函數(shù)例如:SampleApp_Init(),這個函數(shù)是在osalInitTasks()這個OSAL(Z-Stack中自帶的小操作系統(tǒng))中去調(diào)用的,其目的就是把一些用戶自己寫的任務(wù)中的一些變量、網(wǎng)絡(luò)模式、網(wǎng)絡(luò)終端類型等進(jìn)行初始化,并且自動給每個任務(wù)分配一個ID。(2)新任務(wù)的事件處理函數(shù)例如:SampleApp_ProcessEvent(),這個函數(shù)是首先在constpTaskEventHandlerFntasksArr[]中進(jìn)行設(shè)置,然后在osalInitTasks()中如果發(fā)生事件進(jìn)行調(diào)用綁定的事件處理函數(shù)。3.4OSAL運行機制41a3.4.4OSAL添加新任務(wù)1.用戶自己設(shè)計的任務(wù)代碼在Z-Stack中的調(diào)用過程①首先執(zhí)行main()(在ZMain.c文件中)主程序,接著執(zhí)行osal_init_system()。②接著在osal_init_system()調(diào)用osalInitTasks()(在OSAL.c文件中)。③最后在osalInitTasks()中調(diào)用SampleApp_Init()(在OSAL_SampleApp.c文件中)。在osalInitTasks()中實現(xiàn)了多個任務(wù)初始化的設(shè)置,其中macTaskInit(taskID++)到ZDApp_Init(taskID++)的幾行代碼表示對于幾個系統(tǒng)運行初始化任務(wù)的調(diào)用,而用戶自己實現(xiàn)的SampleApp_Init()在最后,這里taskID隨著任務(wù)的增加也隨之遞增。所以用戶自己實現(xiàn)的任務(wù)的初始化操作應(yīng)該在osalInitTasks()中增加。3.4OSAL運行機制42a3.4.4OSAL添加新任務(wù)

2.任務(wù)處理調(diào)用的重要數(shù)據(jù)結(jié)構(gòu)這里要解釋一下,在Z-Stack里,對于同一個任務(wù)可能有多種事件發(fā)生,那么需要執(zhí)行不同的事件處理,為了方便,對于每個任務(wù)的事件處理函數(shù)都統(tǒng)一在一個處理函數(shù)中實現(xiàn),然后根據(jù)任務(wù)的ID號(task_id)和該任務(wù)的具體事件(events)調(diào)用某個任務(wù)的總事件處理函數(shù),進(jìn)入了該任務(wù)的總事件處理函數(shù)之后,再根據(jù)events再來判別是該任務(wù)的哪一種事件發(fā)生,進(jìn)而執(zhí)行相應(yīng)的事件處理。3.4OSAL運行機制43a3.4.4OSAL添加新任務(wù)OSAL將硬件的管理也作為一個任務(wù)來處理。那么我們很自然地去尋找Hal_ProcessEvent這個事件處理函數(shù),看看它究竟是如何管理硬件資源的。3.4OSAL運行機制44a3.4.5事件的捕獲

3.對于不同事件發(fā)生后的任務(wù)處理函數(shù)的調(diào)用osal_start_system()很重要,決定了當(dāng)某個任務(wù)的事件發(fā)生后調(diào)用對應(yīng)的事件處理函數(shù)。對應(yīng)調(diào)用第idx個任務(wù)的事件處理函數(shù),用events說明是什么事件。events=(tasksArr[idx])(idx,events);用戶自定義功能在taskApp.c文件中利用AddTask_Event()函數(shù)實現(xiàn)3.4OSAL運行機制45a1.消息管理API

消息管理API主要用于處理任務(wù)間消息的交換,主要包括任務(wù)分配消息緩存、釋放消息緩存、接收消息和收送消息等API函數(shù)。①osal_msg_allocate()函數(shù)原型:uint8*osal_msg_allocate(uint16len)。功能描述:為消息分配緩存空間。②osal_msg_deallocate()函數(shù)原型:uint8*osal_msg_allocate(uint8*msg_ptr)。功能描述:釋放消息的緩存空間。③osal_msg_send()函數(shù)原型:uint8osal_msg_send(uint8destination_task,uint8*msg_ptr)。功能描述:一個任務(wù)發(fā)送消息到消息隊列。④osal_msg_receive()函數(shù)原型:uint8*osal_msg_receive(uint8task_id)。功能描述:一個任務(wù)從消息隊列接收屬于自己的消息。3.5OSAL應(yīng)用編程接口46a2.任務(wù)同步API

任務(wù)同步API主要用于任務(wù)間的同步,允許一個任務(wù)等待某個事件的發(fā)生。osal_set_event()函數(shù)原型:uint8osal_set_event(uint8task_id,uint16event_flag)。功能描述:運行一個任務(wù)時設(shè)置某一事件同時發(fā)生。3.5OSAL應(yīng)用編程接口47a3.時間管理API

時間管理API用于開啟和關(guān)閉定時器,定時時間一般為毫秒級定時,使用該API,用戶不必關(guān)心底層定時器是如何初始化的,只需要調(diào)用即可,在Zigbee協(xié)議棧物理層已經(jīng)將定時器初始化了。①osal_start_timerEx()函數(shù)原型:uint8osal_start_timerEx(uint8task_id,uint16event_id,uint16timeout_value)。功能描述:設(shè)置一個定時器時間,定時時間到后,相應(yīng)的事件被設(shè)置。②osal_stop_timerEx()函數(shù)原型:uint8osal_stop_timerEx(uint8task_id,uint16event_id)。功能描述:停止已經(jīng)啟動的定時器。3.4OSAL運行機制48a4.中斷管理API

中斷管理API主要用于控制中斷的開啟與關(guān)閉。一般很少使用。3.4OSAL運行機制49a5.任務(wù)管理API任務(wù)管理API主要是對OSAL進(jìn)行初始化和啟動。①osal_init_system()函數(shù)原型:uint8osal_start_system(void)。功能描述:初始化OSAL,該函數(shù)是第一個被調(diào)用的OSAL函數(shù)。②osal_start_system()函數(shù)原型:uint8osal_start_system(void)。功能描述:該函數(shù)包含一個無限函數(shù),它將查詢所有的任務(wù)事件,如果有事件發(fā)生,則調(diào)用相應(yīng)的事件處理函數(shù),處理完該事件后,返回主循環(huán)繼續(xù)檢測是否有事件發(fā)生,如果開啟了節(jié)能模式,則沒有事件發(fā)生時,該函數(shù)將使處理器進(jìn)入休眠模式,以降低系統(tǒng)功耗。3.4OSAL運行機制50a6.內(nèi)存管理API內(nèi)存管理API用于在堆棧上分配緩沖區(qū)。注意的是以下兩個API函數(shù)必須成對使用,防止產(chǎn)生內(nèi)存泄漏。①osal_mem_alloc()函數(shù)原型:uint8osal_mem_alloc(uint16size)。功能描述:在堆棧上分配指定大小的緩沖區(qū)。②osal_mem_free()函數(shù)原型:uint8osal_mem_free(void*ptr)。功能描述:釋放使用osal_mem_alloc()分配的緩沖區(qū)。3.4OSAL運行機制51a8.非易失性閃存管理API非易失性閃存(Non-VolatileMemory,NV)管理API主要添加了對非易失性閃存的管理函數(shù),一般這里的非易失性閃存指的是系統(tǒng)Flash存儲器(也可以是E2PROM),每個NV條目分配唯一的ID號。①osal_nv_item_init()函數(shù)原型:byteosal_nv_item_init(uint16id,uint16len,void*buf)。功能描述:初始化NV條目,該函數(shù)檢查是否存在NV條目,如果不存在,它將創(chuàng)建并初始化該條目。如果該條目存在,每次調(diào)用osal_nv_read()osal_nv_write()。②osal_nv_read()函數(shù)原型:byteosal_nv_read(uint16id,uint16offset,void*buf)。功能描述:從NV條目中讀取數(shù)據(jù);可以讀取整個條目的數(shù)據(jù),也可以讀取部分?jǐn)?shù)據(jù)。③osal_nv_write()函數(shù)原型:uint8osal_nv_write(uint16id,uint16offset,uint16len,void*buf)。功能描述:寫數(shù)據(jù)到NV條目。3.4OSAL運行機制52a1.組網(wǎng)成功測試?yán)肸DO_STATE_CHANGE實現(xiàn)組網(wǎng)成功點燈功能,程序代碼如下。int16SampleApp_ProcessEvent(uint8task_id,uint16events){……afIncomingMSGPacket_t*MSGpkt;caseZDO_STATE_CHANGE:SampleApp_NwkState=(devStates_t)(MSGpkt->hdr.status);if((SampleApp_NwkState==DEV_ZB_COORD)||(SampleApp_NwkState==DEV_ROUTER)||(SampleApp_NwkS

溫馨提示

  • 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)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論