搜索
bottom↓
回复: 1

网蜂zigbee提问

[复制链接]

出0入0汤圆

发表于 2013-3-11 18:59:58 | 显示全部楼层 |阅读模式
老师好 ,我想问如下问题
1.自定义事件在哪里定义?
2.消息结构在哪里定义及在哪里填充?
3.定义的事件如何触发?
hwapp_event()
{   osal_start_timerEx( SampleApp_TaskID, HWAPP_SEND_PERIODIC_MSG_EVT,   (SAMPLEAPP_SEND_PERIODIC_MSG_TIMEOUT + (osal_rand() & 0x00FF)) );    }
上面的osal_start_timerE何时运行?是在 hwapp_event()运行之后运行 还是一直在运行?

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2013-3-13 09:49:08 | 显示全部楼层
你好,就你的提问,曾经在网上看到觉得描述得比较全面的:
   
      在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确实将事件添加到任务中去了。

希望对你有帮助!
  
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 17:20

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表