关于任务的初始化和处理 函数,前面的文章已经讲述的很清楚了,这里就不再啰嗦了。

        在zstack的协议栈中一个任务下最多可以15个事件(除去系统的强制事件),那么这些事件是如何添加到任务中的呢?在这里我仅仅探讨一些用户自己的任务下的事件是如何添加的,至于APS层和网络层,这里暂不做过多的讲解。

       先给出实现的两种方式,我仅仅知道两种方式,至于其他的方式暂且不知道,欢迎大家进行补充和指教。

    1、 osal_set_event();使用这个函数,至于如何调用,大家看看介绍就知道了。这个函数在用户的任务初始化程序中添加。当所有的基本参数(端点,任务id,描述符等等)配置完毕后,调用这个函数。一般会放在最后一句。

   2、在用户处理函数中添加。且看如下代码:

 

  if ( events & SYS_EVENT_MSG )

  {

    MSGpkt = (afIncomingMSGPacket_t *)osal_msg_receive( SampleApp_TaskID );

    while ( MSGpkt )

    {

      switch ( MSGpkt->hdr.event )

      {

        // Received when a key is pressed

        case KEY_CHANGE:

          SampleApp_HandleKeys( ((keyChange_t *)MSGpkt)->state, ((keyChange_t *)MSGpkt)->keys );

          break;

 

        // Received when a messages is received (OTA) for this endpoint

        case AF_INCOMING_MSG_CMD:

          SampleApp_MessageMSGCB( MSGpkt );

          break;

 

        // Received whenever the device changes state in the network

       case ZDO_STATE_CHANGE:

          SampleApp_NwkState = (devStates_t)(MSGpkt->hdr.status);

          if ( (SampleApp_NwkState == DEV_ZB_COORD)

           //   || (SampleApp_NwkState == DEV_ROUTER)

              || (SampleApp_NwkState == DEV_END_DEVICE) )

          {

           // Start sending the periodic message in a regular interval.

            osal_start_timerEx( SampleApp_TaskID,

                              SAMPLEAPP_SEND_PERIODIC_MSG_EVT,

                              SAMPLEAPP_SEND_PERIODIC_MSG_TIMEOUT );

          }

          else

          {

            // Device is no longer in the network

          }

          break;

 

        default:

          break;

      }

         在我的工程文件中,我的任务处理事件函数为uint16 SampleApp_ProcessEvent( uint8 task_id, uint16 events );

       在这个函数里面可以看到上面的代码。注意看彩色的部分,可以看到当取出事件的消息后,消息中有一个为ZDO_STATE_CHANGE的消息,当节点加入网络后,节点的状态将会发生变化,这个时候这个消息就会被加入到系统消息事件的队列中,当执行用户事件的时候,这个消息就会被处理,然后就执行下面的

osal_start_timerEx( SampleApp_TaskID,

                              SAMPLEAPP_SEND_PERIODIC_MSG_EVT,

                              SAMPLEAPP_SEND_PERIODIC_MSG_TIMEOUT );

       这个函数执行后,相应的事件就会加入到任务中。大家看看这个函数的定义就清楚了。第一个参数是对应任务的id,第二个参数是对应的事件id,第三个是对应事件的查询时间。

       在原始程序中,并没有用到osal_set_event函数,而是用状态消息改变来处理的。

       后来我修改了很虚,在初始化任务的函数中,我加入了osal_set_event这个函数,而将消息处理的处理路由器的那个位置可屏蔽掉,实验结果时一样的,路由器和协调器之间正常通信。

       当我不加入osal_set_event这个函数的时候,并且将路由器那个判断语句给屏蔽掉,结果无法正常通信。因此,实验结果证明,osal_set_event确实将事件添加到任务中去了。

      图片以后又机会再加上了。

 

posted on 2016-02-21 11:15  farbeyond  阅读(2032)  评论(0编辑  收藏  举报