【Zigbee】进阶篇(2) Zigbee协议栈中OSAL的执行流程
大家好,我是皮皮貓吖!
每文一言:你可以拒絕學習的動力,但是你的競爭者不會!
本篇文章:
主要是講解協議棧OSAL操作系統的執行流程。
正文如下:
一、OSAL操作系統
1)應用層是一個任務,它有一個系統分配給的唯一數值編號叫任務ID。
① 任務ID初始化
2)任務可以處理事件,處理事件的這些代碼都保存在一個函數里,這個函數叫任務事件處理函數。每一個任務都有一個對應的任務事件處理函數。
① 應用層的任務事件處理函數:
//應用層需要處理的事件 //幾個if就是幾個事件,默認是兩個事件(系統事件和其他事件) //下述事件是CC2530的事件處理函數 UINT16 PPMApp_ProcessEvent( byte task_id, UINT16 events )3)應用層任務還有一個2個字節的變量:任務事件變量。
① 任務事件變量
4)任務事件變量和事件號之間的關系【應用層任務事件變量、應用層事件號】
應用層任務事件變量和應用層定義的事件的關系,如果任務事件變量和某個事件的宏值進行與操作為1,那么表示應用層任務將要處理這個事件。
| 0x0003 | 0x0001 |
| 0x0002 | |
| 0x0003 |
該0x0003任務事件變量與0x0001事件、0x0003事件進行與操作都是1,所以,該任務會觸發0x0001事件和0x0003事件。
5)輪詢機制
① 輪詢機制
② 系統在運行的時候會不斷的去讀應用層任務事件變量
當它發現這個變量為0。就認為應用層任務當前沒有事件需要去處理。
如果發現這個變量不為0,它就認為應用層任務有事件將要去處理,它就會去調用應用層任務事件處理函數UINT16 SDApp_ProcessEvent( byte task_id, UINT16 events ),并且把任務事件變量的值傳給events;在這個事件處理函數里,events會分別和應用層定義的所有事件宏值進行與操作,如果與操作之后的結果為1,那么就去執行這個事件處理的相應代碼。
③ 應用層任務事件處理函數
5)設置任務事件函數
① 設置任務事件函數
② 調用任務事件函數osal_set_event(SDApp_TaskID, SDApp_SEND_MSG_EVT),SDApp_TaskID就會去執行SDApp_SEND_MSG_EVT事件相應的處理代碼?
- 解釋一:
在osal_set_event函數中,任務事件變量和需要觸發事件的宏先進行或操作,此時任務事件變量在要觸發事件的對應位就被置為1,此時系統檢測任務事件變量是否為0,不為0,任務事件變量與事件進行與操作,結果為1,執行該事件。
- 解釋二:
把SDApp_TaskID(應用層任務)的任務事件變量中對應于SDApp_SEND_MSG_EVT宏值為1的那一位變成1(相當于SDApp_TaskID和SDApp_SEND_MSG_EVT進行與操作必為1)。這樣話,這個任務事件變量就變成了非0,系統檢測到任務事件變量為非0時,就會去調用任務事件處理函數SDApp_ProcessEvent,在這個函數里,任務事件變量和SDApp_SEND_MSG_EVT宏值進行與操作為1,所以必定會執行這個事件(SDApp_SEND_MSG_EVT事件)相關的代碼。
6)每個層都有各自的任務
每一個層都是一個任務,那么每一個層都有1個任務ID、任務事件處理函數、任務事件變量。
① 任務事件處理函數
FUN函數數組 = {任務事件處理A, 任務事件處理B, 任務事件處理C…}
② 任務事件變量
Arr變量數組={任務事件變量a, 任務事件變量b, 任務事件變量c…}【保存著各層任務事件變量】
③ 任務ID
任務ID系統不是隨便分配,我們可以通過這個值立即找到這個任務自己的任務事件處理函數和任務事件變量。
④ 任務ID和任務事件處理函數、任務事件變量的關系:
- 任務事件處理函數0:Arr[0]
- 任務事件變量0:Event[0]
⑤ 注意【應用層任務ID】
- 應用層任務的任務ID是8
⑥ 應用層任務事件處理函數、應用層任務事件變量
應用層任務處理函數: tasksArr[8]
應用層任務事件變量: tasksEvents[8]
7)在協議棧中要關注兩個函數
① Zmain.c中的osal_init_system()函數
osal_init_system();//在Zmain中,初始化操作系統② osal_init_system中的osalInitTasks()函數
osalInitTasks();//操作系統給所有的任務分配IDosalInitTasks中的tasksCnt
- tasksCnt表示當前系統的任務數
8)關注osal_start_system()函數
所有ZSTACK協議棧在穩定工作的時候,它的行為是在for(; ; ){}死循環中。
不斷地去讀取所有任務的任務事件變量,如果發現所有任務的任務事件變量都為0,說明所有任務都沒有事件將要去處理;再次重復這個過程,直到發現某個任務事件變量不為0,就會通過不為0的這個任務ID找到這個任務事件處理函數,去處理相應的事件。
當設置了要調用任務事件函數的時候(osal_set_event()),任務事件變量的值會被修改為原任務事件變量和任務事件進行或操作之后的值,此時執行osal_start_system()函數,在此函數中不斷的檢測任務事件變量的值,存在某任務事件變量值不為0。
觸發任務事件函數(觸發應用層任務事件函數),在應用層事件函數中,判斷哪個事件和任務事件變量進行與操作為1,為1的即為要進行的事件操作
希望本篇文章對大家有所幫助,后續會繼續分享Zigbee相關學習知識…
如果文章內容有錯誤的地方,請在留言處留下你的見解,方便大家共同學習。謝謝!
如有侵權或其他任何問題請聯系:QQ1370922071,本文主要用于學習交流,轉載請聲明!
作者:皮皮貓吖
總結
以上是生活随笔為你收集整理的【Zigbee】进阶篇(2) Zigbee协议栈中OSAL的执行流程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 8.总线设备驱动模型
- 下一篇: libiec61850探究【1】-第一个