zoukankan      html  css  js  c++  java
  • 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确实将事件添加到任务中去了。

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

  • 相关阅读:
    Windows Server 2003下ASP.NET无法识别IE11的解决方法
    SQL Server2005中使用XML-数据类型、查询与修改
    连接SQLServer时提示“但是在登录前的握手期间发生错误。 (provider: SSL Provider, error: 0
    无法将类型为 excel.applicationclass 的 com 强制转换为接口类型 的解决方法。
    C# WinForm使用Aspose.Cells.dll 导出导入Excel/Doc 完整实例教程
    技巧 获取电脑硬件信息 -转发
    浏览器无需下载插件 解决网页长截图的小技巧 -转发
    note 9 列表、时间复杂度、排序
    note 8 字符串
    note 7 递归函数
  • 原文地址:https://www.cnblogs.com/farbeyond/p/5204596.html
Copyright © 2011-2022 走看看