ZigBee协议栈工作原理
??ZigBee的任務輪詢如下圖:
??打開協議棧文件夾Texas Instruments\Projects\zstack,里面包含了TI公司的例程和工具。再打開Samples文件夾:
??Samples文件夾里面有三個例子,即GenericApp、SampleApp、SimpleApp。在這里我們選擇SampleApp對協議棧的工作流程進行講解。打開SampleApp\CC2530DB下的工程文件SampleApp.eww,留意左邊的工程目錄,我們暫時只需要關注Zmain文件夾和App文件夾。
??任何程序都在main函數開始運行,Z-STACK也不例外。打開Zmain.C,找到main函數。大概瀏覽一下main函數的代碼:
??我們重點了解2個函數:初始化操作系統osal_init_system,運行操作系統osal_start_system。先來看osal_init_system系統初始化函數。進入該函數,發現里面有6個初始化函數,這里只關心osalInitTasks任務初始化函數:
void osalInitTasks ( void ) {uint8 taskID = 0;tasksEvents = ( uint16 * ) osal_mem_alloc ( sizeof ( uint16 ) * tasksCnt ); /* 分配內存,返回指向緩沖區的指針 */osal_memset ( tasksEvents, 0, ( sizeof ( uint16 ) * tasksCnt ) ); /* 設置所分配的內存空間單元值為0 *//* 任務優先級由高向低依次排列,高優先級對應taskID的值反而小 */macTaskInit ( taskID++ ); /* macTaskInit(0),用戶不需考慮 */nwk_init ( taskID++ ); /* nwk_init(1),用戶不需考慮 */Hal_Init ( taskID++ ); /* Hal_Init(2),用戶需考慮 */ #if defined( MT_TASK )MT_TaskInit ( taskID++ ); #endifAPS_Init ( taskID++ ); /* APS_Init(3),用戶不需考慮 */ #if defined ( ZIGBEE_FRAGMENTATION )APSF_Init ( taskID++ ); #endifZDApp_Init ( taskID++ ); /* ZDApp_Init(4),用戶需考慮 */ #if defined ( ZIGBEE_FREQ_AGILITY ) || defined ( ZIGBEE_PANID_CONFLICT )ZDNwkMgr_Init ( taskID ++ ); #endifSampleApp_Init ( taskID ); /* SampleApp_Init(5),用戶需考慮 */ }??我們可以這樣理解,函數對taskID這個東西進行初始化,每初始化一個任務,taskID加一。大家看到了注釋后面有些寫著用戶需要考慮,有些則寫著用戶不需考慮。寫著需要考慮的,用戶可以根據自己的硬件平臺進行設置;寫著不需考慮的,則是不能修改的。
??我們再來看第二個函數osal_start_system運行操作系統。TI對該函數的描述為This function is the main loop function of the task system. It will look through all task events and call the task_event_processor() function for the task with the event. If there are no events (for all tasks), this function puts the processor into Sleep. This Function doesn't return.,翻譯成中文是這個是任務系統輪詢的主要函數,它會查找發生的事件,然后調用相應的事件執行函數。如果沒有事件登記要發生,那么就進入睡眠模式。這個函數是永遠不會返回的。
總結
以上是生活随笔為你收集整理的ZigBee协议栈工作原理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 别闹了,费曼先生! --纪念费曼百年诞辰
- 下一篇: LCD12864图形点阵液晶显示模块中文