zigbee協議棧OSAL執行原理-----個人理解

ytcjzk發表於2020-04-24

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執行的。那麼指示燈怎麼亮起來的,我們也叫事件的捕獲

相關文章