【Zigbee】任务初始化函数(部分)和系统开始函数(部分)

/* 任务事件处理函数数组 */
const pTaskEventHandlerFn tasksArr[] = {
  macEventLoop,
  nwk_event_loop,
  Hal_ProcessEvent,
#if defined( MT_TASK )
  MT_ProcessEvent,
#endif
  APS_event_loop,
#if defined ( ZIGBEE_FRAGMENTATION )
  APSF_ProcessEvent,
#endif
  ZDApp_event_loop,
#if defined ( ZIGBEE_FREQ_AGILITY ) || defined ( ZIGBEE_PANID_CONFLICT )
  ZDNwkMgr_event_loop,
#endif
  TestApp_ProcessEvent
};


const uint8 tasksCnt = sizeof( tasksArr ) / sizeof( tasksArr[0] ); // 任务个数 
uint16 *tasksEvents; // 任务事件

/* 任务初始化函数 */
void osalInitTasks( void )
{
  uint8 taskID = 0;

  /* 任务事件的初始化,使每一个任务的事件都为0 */
  tasksEvents = (uint16 *)osal_mem_alloc( sizeof( uint16 ) * tasksCnt);
  osal_memset( tasksEvents, 0, (sizeof( uint16 ) * tasksCnt));

  /* 任务初始化函数,给每一层一个任务ID */
  macTaskInit( taskID++ );
  nwk_init( taskID++ );
  Hal_Init( taskID++ );
#if defined( MT_TASK )
  MT_TaskInit( taskID++ );
#endif
  APS_Init( taskID++ );
#if defined ( ZIGBEE_FRAGMENTATION )
  APSF_Init( taskID++ );
#endif
  ZDApp_Init( taskID++ );
#if defined ( ZIGBEE_FREQ_AGILITY ) || defined ( ZIGBEE_PANID_CONFLICT )
  ZDNwkMgr_Init( taskID++ );
#endif
  TestApp_Init( taskID );
}
void osal_start_system( void )
{
#if !defined ( ZBIT ) && !defined ( UBIT )
    
  /* 任务轮询,每一次循环,执行一次某个任务 */
  for(;;)  // Forever Loop
#endif
  {
    uint8 idx = 0;

    osalTimeUpdate();
    Hal_ProcessPoll();  // This replaces MT_SerialPoll() and osal_check_timer().
    
    /* 
    	判断哪一层(即哪一个任务)有事件发生。 
    	
    	因为do{}while()循环是从0-8的,
    	所以可看出任务处理时的优先级为:
    	任务ID为0的最高,任务ID为8的最低。
    	哪一层的任务ID是多少,可由osalInitTasks()函数中得到
    */
    do {
      if (tasksEvents[idx])  // Task is highest priority that is ready.
      {
        /* 
            如果有事件发生,即tasksEvents[idx] != 0,退出循环,
            此时,idx记录的是有事件发生的任务ID 
        */ 
        break; 
      }
    } while (++idx < tasksCnt);

    /* 确认本次有任务需要处理 */
    if (idx < tasksCnt)
    {
      uint16 events;
      halIntState_t intState;

      HAL_ENTER_CRITICAL_SECTION(intState); // 进入临界区
      events = tasksEvents[idx]; // 提取出需要处理的任务中的事件,将任务事件赋值给events
      tasksEvents[idx] = 0;  // 清除此任务的事件
      HAL_EXIT_CRITICAL_SECTION(intState); // 退出临界区

      events = (tasksArr[idx])( idx, events ); // 调用相对应的任务事件处理函数,返回未处理的事件

      HAL_ENTER_CRITICAL_SECTION(intState); // 进入临界区
      /* 
      	Add back unprocessed events to the current task(保存尚未处理的事件) 
      	然后在下一次的for(;;)中继续执行
      */
      tasksEvents[idx] |= events;  
      HAL_EXIT_CRITICAL_SECTION(intState); // 退出临界区
    }
#if defined( POWER_SAVING )
    else  // Complete pass through all task events with no activity?
    {
      osal_pwrmgr_powerconserve();  // Put the processor/system into sleep
    }
#endif
  }
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值