基于Z-Stack的串口通信課件_第1頁
基于Z-Stack的串口通信課件_第2頁
基于Z-Stack的串口通信課件_第3頁
基于Z-Stack的串口通信課件_第4頁
基于Z-Stack的串口通信課件_第5頁
已閱讀5頁,還剩50頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

任務(wù)十一基于Z-Stack的串口通信目

錄一、實(shí)訓(xùn)目的二、實(shí)訓(xùn)內(nèi)容三、實(shí)訓(xùn)原理四、實(shí)訓(xùn)步驟戰(zhàn)略性信息產(chǎn)業(yè)教育服務(wù)提供商聯(lián)世界育未來——創(chuàng)新物聯(lián)教育實(shí)訓(xùn)目的戰(zhàn)略性信息產(chǎn)業(yè)教育服務(wù)提供商聯(lián)世界育未來——創(chuàng)新物聯(lián)教育通過實(shí)訓(xùn),掌握在IAR環(huán)境下Z-Stack的使用,了解Z-Stack的基本架構(gòu),學(xué)會在IAR環(huán)境下Z-Stack的應(yīng)用層的開發(fā),掌握在Z-Stack下的OSAL增加任務(wù)的方法,實(shí)現(xiàn)向串口發(fā)送數(shù)據(jù),控制LED燈的亮滅與閃爍。目

錄一、實(shí)訓(xùn)目的二、實(shí)訓(xùn)內(nèi)容三、實(shí)訓(xùn)原理四、實(shí)訓(xùn)步驟戰(zhàn)略性信息產(chǎn)業(yè)教育服務(wù)提供商聯(lián)世界育未來——創(chuàng)新物聯(lián)教育實(shí)訓(xùn)內(nèi)容戰(zhàn)略性信息產(chǎn)業(yè)教育服務(wù)提供商聯(lián)世界育未來——創(chuàng)新物聯(lián)教育在用戶應(yīng)用層任務(wù)處理函數(shù)SampleApp_ProcessEvent中實(shí)現(xiàn)每隔5秒向串口發(fā)送“Hello

NEWLab!”;并增加一個應(yīng)用層新任務(wù),實(shí)現(xiàn)由PC端發(fā)送字符“1”和“2”控制ZigBee模塊的LED2燈的開與關(guān)。目

錄一、實(shí)訓(xùn)目的二、實(shí)訓(xùn)內(nèi)容三、實(shí)訓(xùn)原理四、實(shí)訓(xùn)步驟戰(zhàn)略性信息產(chǎn)業(yè)教育服務(wù)提供商聯(lián)世界育未來——創(chuàng)新物聯(lián)教育實(shí)訓(xùn)原理戰(zhàn)略性信息產(chǎn)業(yè)教育服務(wù)提供商聯(lián)世界育未來——創(chuàng)新物聯(lián)教育Z-Stack采用基于一個輪轉(zhuǎn)查詢式操作系統(tǒng),該操作系統(tǒng)命名

為OSAL

Operating

System

Abstraction

Layer

),中文為“操作系統(tǒng)抽象層”。Z-Stack協(xié)議棧將底層、網(wǎng)絡(luò)層等復(fù)雜部分屏蔽掉,讓程序員通過API函數(shù)就可以輕松地開發(fā)一套ZigBee系統(tǒng)。11.1

OSAL術(shù)語介紹操作系統(tǒng)(

Operating System

,簡稱

OS)看似很復(fù)雜,其實(shí)只要做幾個實(shí)訓(xùn)項(xiàng)目,就會很快撐握整個OSAL的工作原理,首先了解一下幾個關(guān)鍵的操作系統(tǒng)術(shù)語。實(shí)訓(xùn)原理戰(zhàn)略性信息產(chǎn)業(yè)教育服務(wù)提供商聯(lián)世界育未來——創(chuàng)新物聯(lián)教育資源(Resource)任務(wù)任務(wù)所占用的實(shí)體都可以稱為資源,如一個變量、數(shù)組、結(jié)構(gòu)體等。共享資源(Shared

Resource)至少可以被兩個任務(wù)使用的資源稱為共享資源,為了防止共享資源被破壞,每個任務(wù)在操作共享資源時,必須保證是獨(dú)占該資源。任務(wù)(Task)任務(wù)又稱線程,是一個簡單的程序的執(zhí)行過程。在任務(wù)設(shè)計實(shí)訓(xùn)原理戰(zhàn)略性信息產(chǎn)業(yè)教育服務(wù)提供商聯(lián)世界育未來——創(chuàng)新物聯(lián)教育時,需要將問題盡可能地分為多個任務(wù),每個任務(wù)獨(dú)立完成某種功

能,同時被賦予一定的優(yōu)先級,擁有自己的CPU寄存器和堆??臻g。一般將任務(wù)設(shè)計為一個無限循環(huán)。4.多任務(wù)運(yùn)行(Muti-task

Running)CPU采用任務(wù)調(diào)度的方法運(yùn)行多個任務(wù),例如:有10個任務(wù)

需要運(yùn)行,每隔10ms運(yùn)行一個任務(wù),由于每個任務(wù)運(yùn)行的時間很短,任務(wù)切換很頻繁,這就造成了多任務(wù)同時運(yùn)行的“假象”。實(shí)際上,一個時間點(diǎn)只有一個任務(wù)在運(yùn)行。實(shí)訓(xùn)原理戰(zhàn)略性信息產(chǎn)業(yè)教育服務(wù)提供商聯(lián)世界育未來——創(chuàng)新物聯(lián)教育內(nèi)核(Kernel)在多任務(wù)系統(tǒng)中,內(nèi)核負(fù)責(zé)為每個任務(wù)分配CPU時間、切換任務(wù)、任務(wù)間的通信等。內(nèi)核可以大大簡化應(yīng)用系統(tǒng)的程序設(shè)計,可以將應(yīng)用程序分為若干個任務(wù),通過任務(wù)切換來實(shí)現(xiàn)程序運(yùn)行?;コ猓∕utual

Exclusion)多任務(wù)間通信的最簡單方法是使用共享數(shù)據(jù)結(jié)構(gòu),對于單片

機(jī)系統(tǒng)來說,所有任務(wù)共用同一地址的數(shù)據(jù),具體表現(xiàn)為全局變量、指針、緩沖區(qū)等數(shù)據(jù)結(jié)構(gòu)。雖然共享數(shù)據(jù)結(jié)構(gòu)的方法簡單,但是必

須保證對共享數(shù)據(jù)結(jié)構(gòu)的寫操作具有唯一性。實(shí)訓(xùn)原理戰(zhàn)略性信息產(chǎn)業(yè)教育服務(wù)提供商聯(lián)世界育未來——創(chuàng)新物聯(lián)教育保護(hù)共享資源最常用的方法是:關(guān)中斷、使用測試并置位指令(T&S指令)、禁止任務(wù)切換和使用信號量。其中,在ZigBee協(xié)議棧操作系統(tǒng)中,經(jīng)常使用的方法是關(guān)中斷。7.消息隊列(Message

Queue)消息是收到的事件和數(shù)據(jù)的一個封裝,比如發(fā)生了一個事件(收到別的節(jié)點(diǎn)發(fā)的消息),這時就會把這個事件所對應(yīng)的事件號及收到的數(shù)據(jù)封裝成消息,放入消息隊列中。實(shí)訓(xùn)原理戰(zhàn)略性信息產(chǎn)業(yè)教育服務(wù)提供商聯(lián)世界育未來——創(chuàng)新物聯(lián)教育8.事件(Events)ZigBee協(xié)議棧是由各個層組成的,每一層都要處理各種事件,所以就為每一層定義了一個事件處理函數(shù),可以把這個處理函數(shù)理解為任務(wù),任務(wù)從消息隊列中提取消息,從消息中提取所發(fā)生的具體事件,調(diào)用相應(yīng)的具體事件處理函數(shù),比如按鍵處理函數(shù)等等。11.2

OSAL運(yùn)行機(jī)制OSAL就是以實(shí)現(xiàn)多任務(wù)為核心的系統(tǒng)資源分配機(jī)制,主要提供任務(wù)注冊、初始化和啟動,任務(wù)間的同步、互斥,中斷處理,存儲器分配與管理等功能。實(shí)訓(xùn)原理圖11.1

OSAL運(yùn)行機(jī)制戰(zhàn)略性信息產(chǎn)業(yè)教育服務(wù)提供商聯(lián)世界育未來——創(chuàng)新物聯(lián)教育實(shí)訓(xùn)原理戰(zhàn)略性信息產(chǎn)業(yè)教育服務(wù)提供商聯(lián)世界育未來——創(chuàng)新物聯(lián)教育在ZigBee協(xié)議棧中,OSAL負(fù)責(zé)調(diào)度各個任務(wù)運(yùn)行,如果有事件發(fā)生時,則會調(diào)用相應(yīng)的事件處理函數(shù)進(jìn)行處理。OSAL運(yùn)行機(jī)制如圖3.2.1所示。那么,事件和任務(wù)的事件處理函數(shù)是如何建立關(guān)系呢?首先,建立一個事件表,保存各個任務(wù)的對應(yīng)的事件。其次,建立一個函數(shù)表,保存各個任務(wù)事件處理函數(shù)的地址。最后,將這兩個表建立某種對應(yīng)關(guān)系,當(dāng)某一事件發(fā)生時,則查找函數(shù)表找到對應(yīng)的事件處理函數(shù)。事件表與函數(shù)的關(guān)系如圖11.2所示。實(shí)訓(xùn)原理圖11.2

事件表和函數(shù)表的關(guān)系戰(zhàn)略性信息產(chǎn)業(yè)教育服務(wù)提供商聯(lián)世界育未來——創(chuàng)新物聯(lián)教育實(shí)訓(xùn)原理戰(zhàn)略性信息產(chǎn)業(yè)教育服務(wù)提供商聯(lián)世界育未來——創(chuàng)新物聯(lián)教育在ZigBee協(xié)議棧中,tasksCnt、tasksEvents和tasksArr三個變量非常重要,讀者必須搞清楚它們的作用。tasksCnt:該變量保存了任務(wù)的總數(shù)量。在

OSAL_SampleApp.c中定義為:const

uint8

tasksCnt

=

sizeof(

tasksArr

)

/

sizeof(

tasksArr[0]

);說明:①const

是一個C

語言的關(guān)鍵字,它限定一個變量不允許被改變,產(chǎn)生靜態(tài)作用。使用const在一定程度上可以提高程序的安全性和可靠性。實(shí)訓(xùn)原理戰(zhàn)略性信息產(chǎn)業(yè)教育服務(wù)提供商聯(lián)世界育未來——創(chuàng)新物聯(lián)教育②

sizeof(

tasksArr

)

/

sizeof(

tasksArr[0]

)

是計算數(shù)組tasksArr[]的長度,即任務(wù)總個數(shù)。例如:char

a1[]="abc";int

a2[3];sizeof(a1);結(jié)果為4,因字符末尾還存在一個NULL終止符。sizeof(a2);結(jié)果為3*4=12(依賴于int)。所以,用sizeof來求數(shù)組元素的個數(shù),通常有下面兩種寫法:int

c1=sizeof(a1)/sizeof(char); //總長度/單個元素的長度char型int

c2=sizeof(a2)/sizeof(a2[0]);//總長度/第一個元素的長度int型實(shí)訓(xùn)原理戰(zhàn)略性信息產(chǎn)業(yè)教育服務(wù)提供商聯(lián)世界育未來——創(chuàng)新物聯(lián)教育tasksEvent:這是一個指針,指向了事件表的首地址。在

OSAL_SampleApp.c中聲明為:uint16

*tasksEvents;tasksArr:這是一個數(shù)組,該數(shù)組的每個元素都是一個函數(shù)指針(函數(shù)的地址),指向了事件函數(shù)。該數(shù)組在OSAL_SampleApp.c中定義為:實(shí)訓(xùn)原理戰(zhàn)略性信息產(chǎn)業(yè)教育服務(wù)提供商聯(lián)世界育未來——創(chuàng)新物聯(lián)教育const

pTaskEventHandlerFn

tasksArr[]

=

{macEventLoop,nwk_event_loop,Hal_ProcessEvent,#if

defined(

MT_TASK

)MT_ProcessEvent,#endifAPS_event_loop,#if

defined

(

ZigBee_FRAGMENTATION

)APSF_ProcessEvent,實(shí)訓(xùn)原理戰(zhàn)略性信息產(chǎn)業(yè)教育服務(wù)提供商聯(lián)世界育未來——創(chuàng)新物聯(lián)教育#endifZDApp_event_loop,#if

defined

(

ZigBee_FREQ_AGILITY)

||

defined

(ZigBee_PANID_CONFLICT

)ZDNwkMgr_event_loop,#endifSampleApp_ProcessEvent};實(shí)訓(xùn)原理戰(zhàn)略性信息產(chǎn)業(yè)教育服務(wù)提供商聯(lián)世界育未來——創(chuàng)新物聯(lián)教育其中,在OSAL_Tasks.h文件中對pTaskEventHandlerFn類型聲明如下:typedef

unsigned

short

(*pTaskEventHandlerFn)(

unsignedchar

task_id,

unsigned

short

event

);數(shù)組tasksArr[]的每個元素都是函數(shù)的地址(用函數(shù)名表示函數(shù)的地址),即該數(shù)組的元素都是事件處理函數(shù)的函數(shù)名,如第16行,

SampleApp_ProcessEvent就是“通用應(yīng)用任務(wù)事件處理函數(shù)名”,該

函數(shù)在SampleApp.c文件中被定義了。戰(zhàn)略性信息產(chǎn)業(yè)教育服務(wù)提供商聯(lián)世界育未來——創(chuàng)新物聯(lián)教育實(shí)訓(xùn)原理到此,大家可能對OSAL有一種朦朧的認(rèn)識,但是要徹底弄清楚OSAL運(yùn)行機(jī)理,必須要深入探究osal_run_system()和SampleApp_ProcessEvent()函數(shù)是如何被調(diào)動起來的。1.分析osal_run_system()函數(shù)在main()函數(shù)中,可以找到void

osal_start_system(void)函數(shù),進(jìn)入該函數(shù),可以發(fā)現(xiàn)osal_run_system()函數(shù)。程序分析:①

分析第HAL_ENTER_CRITICAL_SECTION(intState)函數(shù)和第16行和第22行HAL_EXIT_CRITICAL_SECTION(intState)函數(shù)。在hal_mcu.h中可以查到如下代碼:實(shí)訓(xùn)原理戰(zhàn)略性信息產(chǎn)業(yè)教育服務(wù)提供商聯(lián)世界育未來——創(chuàng)新物聯(lián)教育#define

HAL_ENABLE_INTERRUPTS()#define

HAL_DISABLE_INTERRUPTS()st(

EA

=

1;

)st(

EA

=

0;

)(EA)st(

x=#define

HAL_INTERRUPTS_ARE_ENABLED()typedef

unsigned

char

halIntState_t;#define

HAL_ENTER_CRITICAL_SECTION(x)EA; HAL_DISABLE_INTERRUPTS();

)#define

HAL_EXIT_CRITICAL_SECTION(x) st(

EA

=

x;

)實(shí)訓(xùn)原理戰(zhàn)略性信息產(chǎn)業(yè)教育服務(wù)提供商聯(lián)世界育未來——創(chuàng)新物聯(lián)教育(

1HAL_ENTER_CRITICAL_SECTION(intState)函數(shù)的作用是把原先中斷狀態(tài)EA賦給X,然后關(guān)中斷;以便后面可以恢復(fù)原先的中斷狀態(tài)。目的是為了在訪問共享變量時,保證變量不被其它任務(wù)同時訪問。(

2

)第6)行代碼HAL_EXIT_CRITICAL_SECTION(intState)函數(shù)的作用是跳出上面的中斷臨界狀態(tài),恢復(fù)先前的中斷狀態(tài),相當(dāng)于開中斷。實(shí)訓(xùn)原理戰(zhàn)略性信息產(chǎn)業(yè)教育服務(wù)提供商聯(lián)世界育未來——創(chuàng)新物聯(lián)教育②

14

行代碼events

=

tasksEvents[OSAL_SampleApp.c

文件中進(jìn)行了聲明uint16

*tasksEvents

。一定要搞清楚“*tasksEvents”與tasksEvents[idx]之間的關(guān)系,在C語言中,指向數(shù)組的指針變量是可以帶下標(biāo),所以tasksEvents[idx]等價于*(tasksEvents+idex

)。因此,tasksEvents[idx]中存的是數(shù)據(jù)而不是地址(指針)。需要注意的是如何表示一個事件呢?實(shí)訓(xùn)原理戰(zhàn)略性信息產(chǎn)業(yè)教育服務(wù)提供商聯(lián)世界育未來——創(chuàng)新物聯(lián)教育在第11

行代碼uint16 events

定義了事件變量,該變量是16

位的二進(jìn)制變量(uint16占2個字節(jié))。如:在ZComDef.h文件中,定義無線新數(shù)據(jù)接收事件AF_INCOMING_MSG_CMD

為0x1A

;

MT.h文件中,定義串口接收事件CMD_SERIAL_MSG為0x01;不同的任務(wù),事件值可以相同,例如:tasksEvents[0]=0x01,tasksEvents[1]=0x01,這都是可行的,但表示的意義不同,前者表示第1個任務(wù)的事件為0x01,后者表示第2個任務(wù)的事件為0x01。實(shí)訓(xùn)原理戰(zhàn)略性信息產(chǎn)業(yè)教育服務(wù)提供商聯(lián)世界育未來——創(chuàng)新物聯(lián)教育在系統(tǒng)初始化時,系統(tǒng)將所有任務(wù)的事件初始化為0。第6行通過tasksEvents[idx]是否為0來判斷是否有事件發(fā)生,若發(fā)生了,則跳出循環(huán)。③

15

行代碼

tasksEvents[idx]

=

0

是清除任務(wù)

idx

的事件tasksEvents[idx]=0,(指針變量值為NULL)。④第18行代碼events=(tasksArr[idx])(idx,events),調(diào)用相對應(yīng)的任務(wù)事件處理函數(shù),每個任務(wù)都有一個事件處理函數(shù),這個函數(shù)需要處理若干個事件。實(shí)訓(xùn)原理戰(zhàn)略性信息產(chǎn)業(yè)教育服務(wù)提供商聯(lián)世界育未來——創(chuàng)新物聯(lián)教育⑤

21

行代碼tasksEvents[idx]

|= events

。每次調(diào)用

18

行代碼,只處理一個事件,若一個任務(wù)有多個事件響應(yīng),則把返回未處理的任務(wù)事件添加到當(dāng)前任務(wù)中再進(jìn)行處理。2.分析SampleApp_ProcessEvent()函數(shù)通過分析

osal_run_system()

函數(shù)可知:

events(tasksArr[idx])(

idx,

events

)代碼是調(diào)用相對應(yīng)的任務(wù)事件處理函數(shù),并返回未處理的事件給變量events。是怎樣返回未處理的事件?下面深入分析SampleApp_ProcessEvent()函數(shù)。實(shí)訓(xùn)原理戰(zhàn)略性信息產(chǎn)業(yè)教育服務(wù)提供商聯(lián)世界育未來——創(chuàng)新物聯(lián)教育分析程序:①函數(shù)的總體功能是:使用osal_msg_receive(SampleApp_TaskID)函數(shù)從消息隊列中接收一個消息(消息包括事件和相關(guān)數(shù)據(jù)的),然后使用switch-case語句或if語句來判斷事件類型,然后調(diào)用相應(yīng)的事件處理函數(shù)。語句,用②

3

行和第

18

行兩個

ifSYS_EVENT_MSG包含了很多事件,所以采用switch-case語句再次判斷不同的事件。實(shí)訓(xùn)原理戰(zhàn)略性信息產(chǎn)業(yè)教育服務(wù)提供商聯(lián)世界育未來——創(chuàng)新物聯(lián)教育③第7行,判斷AF_INCOMING_MSG_CMD

,SampleApp_MessageMSGCB(MSGpkt)事件處理函數(shù)。④

14

行,再從消息隊列中接收有效消息(與第

4

行代碼功能相同),然后再返回while

(

MSGpkt

)重新處理事件,直到?jīng)]有等待消息為止。實(shí)訓(xùn)原理戰(zhàn)略性信息產(chǎn)業(yè)教育服務(wù)提供商聯(lián)世界育未來——創(chuàng)新物聯(lián)教育⑤第16

行和20

行都是使用異或運(yùn)算,返回未處理的事件。例如:此時events=0x0005,則進(jìn)入SampleApp_ProcessEvent()函數(shù)后,第3行if語句無效,則會跳到第18行if語句,SAMPLEAPP_SEND_PERIODIC_MSG_EVT的值為0x0001,則events^0x0001=0x00004。即第20行會返回0x0004??梢姰惢蜻\(yùn)算可以將處理完的事件清除掉,僅留下未處理的事件。?SYS_EVENT_MSG

與AF_INCOMING_MSG_CMD

有什么內(nèi)在關(guān)系?實(shí)訓(xùn)原理戰(zhàn)略性信息產(chǎn)業(yè)教育服務(wù)提供商聯(lián)世界育未來——創(chuàng)新物聯(lián)教育在ZigBee協(xié)議棧中,事件可以是用戶定義的事件,也可以是協(xié)議棧內(nèi)部已經(jīng)定義的事件,SYS_EVENT_MSG就是協(xié)議棧內(nèi)部定義的事件之一,SYS_EVENT_MSG定義如下:#define

SYS_EVENT_MSG

0x8000由于協(xié)議棧定的事件為系統(tǒng)強(qiáng)制事件(Mandatory

Events),SYS_EVENT_MSG是一個事件集合,主要包括以下幾個事件:(1)AF_INCOMING_MSG_CMD:表示收到了一個新的無線數(shù)據(jù)事件。實(shí)訓(xùn)原理戰(zhàn)略性信息產(chǎn)業(yè)教育服務(wù)提供商聯(lián)世界育未來——創(chuàng)新物聯(lián)教育ZDO_STATE_CHANGE:表示當(dāng)網(wǎng)絡(luò)狀態(tài)發(fā)生變化時,會產(chǎn)生該事件。如節(jié)點(diǎn)加入網(wǎng)絡(luò)時,該事件就有效,還可以進(jìn)一步

判斷加入的設(shè)備是協(xié)調(diào)器、路由器或終端。KEY_CHANGE:表示按鍵事件。ZDO_CB_MSG:表示每一個注冊的ZDO響應(yīng)消息。AF_DATA_CONFIRM_CMD:調(diào)用AF_DataRequest()發(fā)送數(shù)據(jù)時,有時需要確認(rèn)信息,該事件與此有關(guān)。到此,將OSAL的運(yùn)行機(jī)制總結(jié)以下幾點(diǎn):實(shí)訓(xùn)原理戰(zhàn)略性信息產(chǎn)業(yè)教育服務(wù)提供商聯(lián)世界育未來——創(chuàng)新物聯(lián)教育OSAL

是一種基于事件驅(qū)動的任務(wù)輪詢式操作系統(tǒng),事件有效才調(diào)用相應(yīng)任務(wù)的事件處理函數(shù)。通過不斷地查詢事件表(

tasksEvents[idx]

),判斷是否有事件發(fā)生,如果有則查找函數(shù)表(tasksArr[idx]),調(diào)用本應(yīng)事件處理函數(shù)。事件表是用數(shù)組來表示,數(shù)組的每個元素對應(yīng)用一個任務(wù)的事件,一般用戶定義的事件最好是每一位二進(jìn)制數(shù)表示一個事件,uint16那么一個任務(wù)最多可以有

16

個事件(因?yàn)?/p>

events

是例如:0x01表示串口接收新數(shù)據(jù),0x02表示讀取溫度數(shù)據(jù),0x04表示讀取濕度數(shù)據(jù)等,但是不用0x03、0xFE等數(shù)值表示事件。實(shí)訓(xùn)原理戰(zhàn)略性信息產(chǎn)業(yè)教育服務(wù)提供商聯(lián)世界育未來——創(chuàng)新物聯(lián)教育函數(shù)表是用指針數(shù)組來表示,數(shù)組的每個元素是相應(yīng)任務(wù)的事件處理函數(shù)的首地址(函數(shù)指針)。11.3

OSAL消息隊列通常某些事件的發(fā)生,雙伴隨著一些附加數(shù)據(jù)的產(chǎn)生,這就需要將事件和數(shù)據(jù)封裝成一個消息,將消息發(fā)送到消息隊列中,然后使用osal_msg_receive(SampleApp_TaskID)函數(shù)從消息隊列中得到消息。OSAL維護(hù)一個消息隊列,每個消息都會被放入該消息隊列中,每個消息都包括一個消息頭osal_msg_hdr_t和用戶自定義的消息。

在OSAL.h中osal_msg_hdr_t結(jié)構(gòu)體的定義為:實(shí)訓(xùn)原理戰(zhàn)略性信息產(chǎn)業(yè)教育服務(wù)提供商聯(lián)世界育未來——創(chuàng)新物聯(lián)教育typedefstruct{

void

*next;uint16

len;uint8

dest_id;}

osal_msg_hdr_t;11.4

OSAL添加新任務(wù)和事件在ZigBee協(xié)議棧應(yīng)用程序開發(fā)時,經(jīng)常添加新的任務(wù)及其對應(yīng)的事件,方法如下:在任務(wù)的函數(shù)表中添加新任務(wù)。編寫新任務(wù)的初始化函數(shù)。實(shí)訓(xùn)原理戰(zhàn)略性信息產(chǎn)業(yè)教育服務(wù)提供商聯(lián)世界育未來——創(chuàng)新物聯(lián)教育定義新任務(wù)全局變量和事件。編寫新任務(wù)的事件處理函數(shù)。在任務(wù)的函數(shù)表中添加新任務(wù)在OSAL_SampleApp.c文件中,找到任務(wù)的函數(shù)表代碼。說明:在數(shù)組tasksArr[]的最后添加第16行代碼,這是新任務(wù)的事件處理函數(shù)名。編寫新任務(wù)的初始化函數(shù)在OSAL_SampleApp.c文件中,找到任務(wù)初始化函數(shù)。實(shí)訓(xùn)原理戰(zhàn)略性信息產(chǎn)業(yè)教育服務(wù)提供商聯(lián)世界育未來——創(chuàng)新物聯(lián)教育說明:將新任務(wù)的初始化函數(shù)添加在

osalInitTasks(

void )

函數(shù)的最后,如第19行代碼。值得注意的是任務(wù)的函數(shù)表tasksArr[]中的元素(事件處理函數(shù)名)排列順序與任務(wù)的初始化函數(shù)osalInitTasks(

void

)中的任務(wù)初始化子函數(shù)排列順序是一一對應(yīng)的,不允許錯位。變量taskID是任務(wù)編號,有非常嚴(yán)格的自上到下的遞增,最后的一個任務(wù)的taskID值不需要++,因?yàn)榻酉聸]有任務(wù)。實(shí)訓(xùn)原理戰(zhàn)略性信息產(chǎn)業(yè)教育服務(wù)提供商聯(lián)世界育未來——創(chuàng)新物聯(lián)教育3.

定義新任務(wù)全局變量和事件為了保證

osalInitTasks(

void)函數(shù)能分配到任務(wù)ID

,必須給每個任務(wù)定義一個全局變量。所以在SampleApp.c文件中,定義了uint8 SampleApp_TaskID變量,并在void

SampleApp_Init(taskID)函數(shù)中被賦值,即:SampleApp_TaskID=task_id。在SampleApp.h文件中定義事件,格式如下:#define

SAMPLEAPP_SEND_PERIODIC_MSG_EVT0x0001實(shí)訓(xùn)原理戰(zhàn)略性信息產(chǎn)業(yè)教育服務(wù)提供商聯(lián)世界育未來——創(chuàng)新物聯(lián)教育3.編寫新任務(wù)的事件處理函數(shù)在SampleApp_ProcessEvent()函數(shù)中編寫事件處理代碼,詳見之前對該函數(shù)的分析。11.5

OSAL的API函數(shù)ZigBee協(xié)議棧支持多任務(wù)運(yùn)行,那任務(wù)間同步、互斥等都需要相應(yīng)的API(應(yīng)用編程接口,Application

Programming

Interface)來支持??傮w來說,OSAL提供了8個方面的API,它們分別是消息管理、任務(wù)同步、時間管理、中斷管理、任務(wù)管理、內(nèi)存管理、電源管理和非易失性閃存管理。由于API函數(shù)很多,下面只選取部分經(jīng)典的API進(jìn)行介紹。實(shí)訓(xùn)原理戰(zhàn)略性信息產(chǎn)業(yè)教育服務(wù)提供商聯(lián)世界育未來——創(chuàng)新物聯(lián)教育1.消息管理API消息管理有關(guān)的API主要用于處理任務(wù)間消息的交換,主要包括為任務(wù)分配消息緩存、釋放消息緩存、發(fā)送消息和接收消息等API函數(shù)。①為任務(wù)分配消息緩存函數(shù)原型:uint8 *osal_msg_allocat(

uint16

len)功能描述:為消息分配緩存空間,函數(shù)中的形參len表示需要分配存儲空間的大小。實(shí)訓(xùn)原理戰(zhàn)略性信息產(chǎn)業(yè)教育服務(wù)提供商聯(lián)世界育未來——創(chuàng)新物聯(lián)教育②釋放消息緩存函數(shù)原型:uint8 osal_msg_deallocate(

uint8 *msg_ptr

)功能描述:為消息釋放空間,函數(shù)中的形參msg_ptr表示消息的指針。③發(fā)送消息函數(shù)原型:

uint8 osal_msg_send(

uint8

destination_task,uint8 *msg_ptr

)功能描述:把一個任務(wù)的消息發(fā)送到消息隊列。。實(shí)訓(xùn)原理戰(zhàn)略性信息產(chǎn)業(yè)教育服務(wù)提供商聯(lián)世界育未來——創(chuàng)新物聯(lián)教育④接收消息函數(shù)原型:uint8 *osal_msg_receive(

uint8 task_id

)功能描述:一個任務(wù)從消息隊列中接收屬于自己的消息。2.任務(wù)同步API任務(wù)同步API主要用于任務(wù)間的同步,允許一個任務(wù)等待某個事件的發(fā)生。函數(shù)原型:

uint8

osal_set_event(

uint8

task_id,

uint16event_flag)功能描述:運(yùn)行一個任務(wù)設(shè)置某一事件。實(shí)訓(xùn)原理戰(zhàn)略性信息產(chǎn)業(yè)教育服務(wù)提供商聯(lián)世界育未來——創(chuàng)新物聯(lián)教育3.時間管理API時間管理API用于開啟和關(guān)閉定時器,定時時間一般為毫秒級定時,使用該API,用戶不必關(guān)心底層定時器是如何初始化的,只需要調(diào)用即可,在ZigBee協(xié)議棧物理層已經(jīng)將定時器初始化了。①設(shè)置時間函數(shù)原型:

uint8

osal_start_timerEx(

uint8

taskID,

uint16event_id,

uint16

timeout_value

)功能描述:設(shè)置一個定時時間,定時到后相應(yīng)的事件被設(shè)置。注意:定時是一次有效,不會周期性定時。實(shí)訓(xùn)原理戰(zhàn)略性信息產(chǎn)業(yè)教育服務(wù)提供商聯(lián)世界育未來——創(chuàng)新物聯(lián)教育osal_stop_timerEx(

uint8

task_id,

uint16②停止定時函數(shù)原型:uint8event_id)功能描述:停止已經(jīng)啟動的定時器。4.中斷管理API這些API是外部中斷和任務(wù)的接口。這些API函數(shù)允許一個任務(wù)為每個中斷分配指定服務(wù)程序。這些中斷能被允許或禁止。在服務(wù)程序內(nèi),可為其他的任務(wù)設(shè)置事件。實(shí)訓(xùn)原理戰(zhàn)略性信息產(chǎn)業(yè)教育服務(wù)提供商聯(lián)世界育未來——創(chuàng)新物聯(lián)教育任務(wù)管理API該API用在管理OSAL中的任務(wù),包括系統(tǒng)任務(wù)和用戶自定義任務(wù)的創(chuàng)建、管理和信息處理等。內(nèi)存管理API該API描繪了簡單的存儲分配系統(tǒng)。這些函數(shù)允許動態(tài)存儲分配。電源管理API這里描寫了OSAL的電源管理系統(tǒng)。當(dāng)OSAL安全地關(guān)閉接收器與外部硬件并使處理器進(jìn)入休眠模式時,該系統(tǒng)提供向應(yīng)用/任務(wù)通告該事務(wù)的方式。目

錄一、實(shí)訓(xùn)目的二、實(shí)訓(xùn)內(nèi)容三、實(shí)訓(xùn)原理四、實(shí)訓(xùn)步驟戰(zhàn)略性信息產(chǎn)業(yè)教育服務(wù)提供商聯(lián)世界育未來——創(chuàng)新物聯(lián)教育實(shí)訓(xùn)步驟戰(zhàn)略性信息產(chǎn)業(yè)教育服務(wù)提供商聯(lián)世界育未來——創(chuàng)新物聯(lián)教育第一步,打開Z-Stack的SampleApp.eww工程。具體參考實(shí)訓(xùn)10的操作。第二步,編寫協(xié)調(diào)器程序。復(fù)制實(shí)訓(xùn)10中的協(xié)調(diào)器程序,在此基礎(chǔ)上進(jìn)行修改,由于代碼較多,在此只對關(guān)鍵部分代碼進(jìn)行分析。1.向串口發(fā)送“Hello

NEWLab!”在void

SampleApp_Init(uint8task_id)函數(shù)中增加以下代碼:實(shí)訓(xùn)步驟戰(zhàn)略性信息產(chǎn)業(yè)教育服務(wù)提供商聯(lián)世界育未來——創(chuàng)新物聯(lián)教育halUARTCfg_t

uartConfig;uar

溫馨提示

  • 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

提交評論