簡述Z-Stack的基本工作原理與流程(OSAL操作系統)

首先上圖,跟着圖中的函數順序來感受Z-Stack的工作流程:
在這裏插入圖片描述
Z-Stack協議棧總的來說做了兩件事,系統的初始化和啓動OSAL操作系統。
系統初始化:從main函數看,首先是調用了osal_init_system()函數,它的主要功能是初始化操作系統所有的任務,通過IAR的跟蹤功能,得到它的函數體如下圖:
在這裏插入圖片描述
其中最主要的函數是osalInitTasks(),它初始化了系統的任務,跟蹤到其函數體如下如圖:
在這裏插入圖片描述
首先爲事件任務數組申請了內存空間,可以看到有個變量taskID,這是用於事件處理的任務號,這裏初始化好任務號後,緊接着開始OSAL,在main函數中調用osal_start_system()函數。跟蹤到函數體中發現是一個死循環:
在這裏插入圖片描述
在osal_run_system()函數中會循環遍歷系統所有任務的事件,不爲0則有事件發生,然後再去處理相應的事件。跟蹤到函數中可以看到其使用一個do while語句實現循環遍歷:
在這裏插入圖片描述
如果有任務事件產生,則調用相應的事件處理進程,
在這裏插入圖片描述
事件處理使用的是函數指針處理,tasksArr數組中存放的都是函數指針,如下圖:
在這裏插入圖片描述
爲了使其能夠準確的調用相應的任務事件處理函數,tasksEvents[]與tasksArr[]的元素必須相對應。
在這裏插入圖片描述
根據元素的排列順序就可知他們的優先級,排在前面的優先級更高。
對於用戶事件的處理函數在APP應用層下的MyApp.c(每個人的文件名可能不一樣)文件中的MyApp_ProcessEvent函數:
在這裏插入圖片描述
MyApp_ProcessEvent函數是我們用戶自定義的函數,比如我們定義的按鍵事件等都需要在該函數下實現,首先利用(afIncomingMSGPacket_t
*)osal_msg_receive( MyApp_TaskID )從消息隊列中獲取消息,如果有消息則用switch結構根據消息的子事件,判斷是什麼事件的發生,處理完事件後需要釋放空間,然後接着從消息隊列接收消息,最後返回處理後的events(events ^ SYS_EVENT_MSG)。將events重新賦值到tasksEvents中,繼續輪詢。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章