zigbee 之ZStack-2.5.1a原始碼分析(一)
阿新 • • 發佈:2018-11-05
先看main, 在檔案Zmain.c裡面
main
osal_init_system();
osalInitTasks();
... ...
SampleApp_Init( taskID ); // 使用者定義的任務
osal_start_system();
步驟如下:
(1) 關掉中斷 , osal_int_disable( INTS_ALL ); 其實就是EA = 0
(2)板級初始化 , HAL_BOARD_INIT(), 這裡面首先把時鐘從16M變為32MHz, 然後開啟指令prefetch 模式,LED初始化
(3)zmain_vdd_check();檢測電壓
(4)InitBoard( OB_COLD ); Brown-Out reset
(5) HalDriverInit();初始化ADC, TIMER, LCD,UART等
(6)osal_nv_init( NULL ); 初始化flash相關
(7)ZMacInit();初始化mac , TI的mac相關原始碼並沒有開放,而是提供庫的形式
。。。
(8)osal_init_system();初始化作業系統OSAL
(9)osal_int_enable( INTS_ALL );開啟中斷
(10) zmain_dev_info();基本版本資訊輸出
(11)osal_start_system(); // No Return from here 系統執行
osal_start_system
osal_start_system是一個死迴圈,不會再返回。其主要程式碼如下
HAL_ENTER_CRITICAL_SECTION(intState); // 進入臨界區 events = tasksEvents[idx]; // 優先順序最高的events tasksEvents[idx] = 0; // Clear the Events for this task. HAL_EXIT_CRITICAL_SECTION(intState); // 退出臨界區 activeTaskID = idx; events = (tasksArr[idx])( idx, events ); // 執行 activeTaskID = TASK_NO_TASK;
上面tasksArr 定義如下 :
const pTaskEventHandlerFn tasksArr[] = {
macEventLoop, // mac 相關的event, 使用者不要修改
nwk_event_loop, // nwk相關,使用者不要修改
Hal_ProcessEvent,
#if defined( MT_TASK )
MT_ProcessEvent,
#endif
APS_event_loop, // APS 相關,使用者不要修改
#if defined ( ZIGBEE_FRAGMENTATION )
APSF_ProcessEvent,
#endif
ZDApp_event_loop,
#if defined ( ZIGBEE_FREQ_AGILITY ) || defined ( ZIGBEE_PANID_CONFLICT )
ZDNwkMgr_event_loop,
#endif
SampleApp_ProcessEvent // 使用者自定義的
};
注意:
osalInitTasks 和 tasksArr 定義的順序是一致的, 比如使用者定義的SampleApp_Init , 其任務SampleApp_ProcessEvent需要對應的唯一, 在osal_start_system呼叫時才會正確執行。