zigbee協議棧OSAL執行原理-----個人理解
OSAL執行原理:
前提:OSAL是按照不同層執行的。分別是應用層(App)、硬體層(HAL)、mac層(MAC).......等多個層。我們現在把每一層可以當成一個任務。也可以比喻每一層是一個房間。
開始執行:程式從main函式開始執行,一開始是初始化各個模組。然後初始化osal_init_system(),在這個函式裡主要給各個層(各個房間)定義任務ID號。從0開始 假設應用層被分到的任務號是8。開始執行OSAL也就是這個函式osal_start_system();在這個函式裡用了一個for迴圈這條語句for(;;),for迴圈就是來觀察哪一層(哪個房間)有事件發生就去處理哪個層(房間)。這就是像高中老師查宿舍一下,如果哪個房間有聲音、不熄燈等, 老師就去處理,否則一直在走廊來回檢查。
重點內容:我們人很複雜可以通過眼睛、耳朵等知道房間有事情發生,但是程式不知道。它是怎麼處理的呢?
先來介紹 每一層(房間)可能發生的事情或者處理的事情怎麼表示。
其中tasksArr[]是函式指標。每個層(房間)會發生或者處理各種事情,比如應用層(應用房間)會處理模組型別,還有其他的事情。所有應用層能處理的事情用一個函式a來執行,所有硬體層處理的事物也用一個函式b表示,其它層分別是函式c、函式d等等那麼我們把函式a,函式b,函式c。。。他們的地址放到tasksArr[]中。假設函式a的地址是100,函式b的地址是101,函式c的地址是102。。。。。等等 只要呼叫使用100 就會執行函式a,以此類推只要呼叫108就會執行函式h。
實際程式碼如下:
const pTaskEventHandlerFn tasksArr[] = {
macEventLoop, // tasksArr[0] 對應房間100號
nwk_event_loop, // tasksArr[1] 對應房間101號
Hal_ProcessEvent, // tasksArr[2] 對應房間102號
#if defined( MT_TASK )
MT_ProcessEvent,
#endif
APS_event_loop,
#if defined ( ZIGBEE_FRAGMENTATION )
APSF_ProcessEvent,
#endif
ZDApp_event_loop,
#if defined ( ZIGBEE_FREQ_AGILITY ) || defined ( ZIGBEE_PANID_CONFLICT )
ZDNwkMgr_event_loop,
#endif
GenericApp_ProcessEvent // tasksArr[8] 對應房間108號
};
現在我們來解決剛才提出的問題,檢查老師眼耳並用可以知道房間情況。OSAL它怎麼知道去各個層執行相應事件的呢,
這需要用到另一個變數tasksEvents[],這個變數也是一個陣列,並且與剛才的tasksArr[ ] 陣列一一對應。即
tasksEvents[0]--------------對應tasksArr[0]
tasksEvents[1]--------------對應tasksArr[1]
tasksEvents[2]--------------對應tasksArr[2]
tasksEvents[3]--------------對應tasksArr[3]
也就是說tasksEvents正常為0,當不為0時說明對應層有事件發生。比如 tasksEvents[8]不為0,程式就到tasksArr[8] 也就是108去執行了。
在for迴圈裡面有一個do。。。。while迴圈,就是檢測tasksEvents[]陣列變數不為零,拿到ID號去對應房間處理事件。
比喻:老師不在去房間走廊檢查,每個房間都有一個特殊的指示燈(這個指示燈是2個位元組,也就是說可以亮16種顏色)放在老師辦公室,老師只需要在辦公室檢查這些指示燈。如果 tasksEvents[8]指示燈亮就知道108房間有事件處理。
以上是個人理解OSAL執行的。那麼指示燈怎麼亮起來的,我們也叫事件的捕獲
相關文章
- CC2530 ZigBee協議棧 學習心得協議
- ZigBee ZStack 協議棧學習--架構分析篇協議架構
- 【無線通訊篇 | Zstack協議棧】CC2530 Zigbee Zstack協議棧組網專案及詳細講解篇協議
- zigbee協議的缺點 zigbee的主要應用領域協議
- zstack協議棧協議
- TCP/IP協議棧在Linux核心中的執行時序分析TCP協議Linux
- 【譯】理解 Javascript 執行上下文和執行棧JavaScript
- JavaScript執行原理解析JavaScript
- 基於應用理解的協議棧最佳化協議
- HTTP協議是如何執行的?海外代理IP原理介紹HTTP協議
- 1、zstack協議棧協議
- 深入理解 JavaScript 執行上下文和執行棧JavaScript
- 深入理解JavaScript執行上下文和執行棧JavaScript
- 【Zigbee精華教程02】一圖讀懂ZStack協議棧的核心思想與工作機理協議
- 【雲隱】TI CC2530 Zigbee協議棧開發的七大深坑,歡迎來跨~協議
- View Animation 執行原理解析View
- [譯] 理解 JavaScript 中的執行上下文和執行棧JavaScript
- Python——程式、執行緒、協程、多程式、多執行緒(個人向)Python執行緒
- BGP - 不同 AS 間執行的協議協議
- 理解http協議HTTP協議
- 結合執行棧、執行上下文,理解this的指向問題
- 在Linux中,TCP/IP協議棧的工作原理是什麼?LinuxTCP協議
- 深度理解C# 的執行原理C#
- python協程asyncio的個人理解Python
- 如何知道協議在哪個OSI層上執行?—Vecloud微雲協議Cloud
- https協議的理解HTTP協議
- 多執行緒下載原理解析執行緒
- ARP地址解析協議-個人總結協議
- 淺談WebSocket協議、WS協議和WSS協議原理及關係Web協議
- 五層因特網協議棧協議
- [計算機網路]協議棧計算機網路協議
- 目前對程式、執行緒、協程的理解執行緒
- 深入理解 HTTP 協議HTTP協議
- 如何理解TCP/IP協議?TCP協議
- 深入理解OSPF協議協議
- 理解 OAuth2 協議OAuth協議
- 以 DEBUG 方式深入理解執行緒的底層執行原理執行緒
- 深入Java原始碼理解執行緒池原理Java原始碼執行緒