• zstack中事件加入到任务的方式


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

            在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确实将事件添加到任务中去了。

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

  • 相关阅读:
    第二天第三课:03-reques_header_two
    第二天第二节:02-request_header
    爬虫第二天第一课:01-get_params2
    爬虫第三天第二课:02-auth-use用户密码认证
    爬虫第三天:01-money-proxy-handler代理池
    设计模式(C#)——07装饰者模式
    设计模式(C#)——06桥接模式
    设计模式(C#)——05适配器模式
    设计模式(C#)——04原型模式
    设计模式(C#)——03建造者模式
  • 原文地址:https://www.cnblogs.com/farbeyond/p/5204596.html
Copyright © 2020-2023  润新知