ZigBee协议栈浅显解读(二)

上一篇笔记我们介绍ZigBee这样几个片段
第一熟悉了ZigBee协议栈的main()函数,里面包含各种各样的初始化函数
第二在main()函数中我们重点熟悉了osal_init_system(); //初始化操作系统
在osal_init_system()的初始化操作系统函数中我们重点介绍了osalInitTasks(); //初始化系统任务
第三在osalInitTasks(); //初始化系统任务中我们了解任务初始化

今天我介绍在main()函数中另一重要的函数
osal_start_system( void )//开始进入轮转查询式操作系统事件处理的死循环
下面我们来开下osal_start_system( void )//进入轮转查询式操作系统事件处理的死循环

void osal_start_system( void )
{
#if !defined ( ZBIT ) && !defined ( UBIT )
  for(;;)  // Forever Loop
#endif
{
osal_run_system();
}
//代码分析:osal_start_system()的主要功能是一个无限次的循环,不停调
//用osal_run_system();

下面是osal_run_system();的程序流程图
这里写图片描述
下面我们来分析一下osal_run_system()

void osal_run_system(void)
{
    uint8 idx = 0;

    osalTimeUpdate();   //扫描哪个事件被触发了,然后置相应的标志位
//触发事件主要有三种情况:外部中断,定时器和对设备进行轮询。外部中断,定时
//器不需要进行干预,所以系统
//主循环时需要调用函数Hal_ProcessPoll()对例如串口这样的设备进行轮询,如
//果这些设备需要处理,则在数组
//tasksEvents[]中设置相应的事件
    Hal_ProcessPoll();  //轮询TIMER与UART This replaces
    //MT_SerialPoll() and osal_check_timer().

    do {
      if (tasksEvents[idx])  // 查询任务事件列表 这是一个数组,如果找
      //到任务优先级最高的就退出
      {
        break;               //得到待处理的最高优先级任务索引号 idx
      }
    } while (++idx < tasksCnt);//idx的最大值是任务的数
//遍历数组tasksEvents[],如果某个taskID对应的数组元素不为零,则说明相应
//层有事件发生,跳出循环。如果
//不同层同时发生了事件,则taskID值小层的事件处理优先级高

    if (idx < tasksCnt)
    {
      uint16 events;
      halIntState_t intState;

      HAL_ENTER_CRITICAL_SECTION(intState);// 进入临界区,保护关中
      //断
      events = tasksEvents[idx];           //提取需要处理的任务中的
      //事件,找到任务优先级最高的
//根据taskID调用相应层的事件处理函数,对事件进行处理。如果events中的事件
//完全处理完,
//否则没有处理完的事件保存在返回值中

     tasksEvents[idx] = 0;                //清除本次任务的事件以备/
     //下面继续查询
      HAL_EXIT_CRITICAL_SECTION(intState); // 退出临界区 开中断

      events = (tasksArr[idx])( idx, events );//任务事件建立表格

      HAL_ENTER_CRITICAL_SECTION(intState);   //进入临界区
      tasksEvents[idx] |= events;  // 将我们带要处理的事件添加任务事
      //件列表里面
      HAL_EXIT_CRITICAL_SECTION(intState);    // 退出临界区
//将没有处理完的事件保存在tasksEvents[]数组中,在主循坏中继续处理。
    }
#if defined( POWER_SAVING )
    else  // Complete pass through all task events with no activity?
    {
      osal_pwrmgr_powerconserve();  // Put the processor/system into sleep
    }
#endif
}
//操作系统启动只有两件事需要去做,一是找到需要处理的任务事件。二是建立任务
//事件表,将需要处理的事件添加到任务事件表中并执行优先级最高的任务事件
//将没有执行任务事件添加入任务事件列表,在下一次主循环中查询执行

下面的代码就是任务事件列表的建立。

//建立的任务事件列表是一个数组,里面包含的是任务事件处理函数
const pTaskEventHandlerFn tasksArr[] = {
  macEventLoop, //mac层任务事件处理函数
  nwk_event_loop, //网络层任务事件处理函数
  Hal_ProcessEvent, //硬件抽象层任务处理函数
#if defined( MT_TASK ) 
//如果定义了MT_TASK,c串口任务事件处理函数也会
//加入tasksArr[]这个数组中
  MT_ProcessEvent,
#endif
  APS_event_loop, //应用支持子层任务处理函数
#if defined ( ZIGBEE_FRAGMENTATION ) //
  APSF_ProcessEvent,
#endif
  ZDApp_event_loop, //ZDO任务处理函数
#if defined ( ZIGBEE_FREQ_AGILITY ) || defined ( ZIGBEE_PANID_CONFLICT )
  ZDNwkMgr_event_loop,
#endif
  SampleApp_ProcessEvent //应用程序处理函数
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值