1. 程式人生 > >zigbee 之ZStack-2.5.1a原始碼分析(一)

zigbee 之ZStack-2.5.1a原始碼分析(一)

先看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呼叫時才會正確執行。