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

扫描二维码关注公众号,回复: 3942970 查看本文章

(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调用时才会正确执行。

猜你喜欢

转载自blog.csdn.net/qq_21353001/article/details/82738265
今日推荐