zoukankan      html  css  js  c++  java
  • 【DWM1000】 code 解密4一 ANCHOR 二进宫testapprun_s

    上面我们的代码分析到ANCHOR 调用了一次testapprun_s,但是后面退出后发现还是满足while 条件,逼不得已还得再次调用testapprun_s。testapprun_s 也就是这样一点一点被消磨殆尽(分析完)(大部分代码也是本人第一次看,分析的不妥的地方大家多担待,后续发现问题我会及时更新)

    好了,我们再看run 部分的代码

    while(done == INST_NOT_DONE_YET)
    {
        //int state = instance_data[instance].testAppState;
         done = instance_localdata[instance].testapprun_fn(&instance_data[instance], message) ;     // run the communications application
        //we've processed message
         message = 0;
    }
    

    其实这个就是DWM1000 定位代码的core(加上上下几句),此时调用testapprun_s 传入的参数A 依然是结构体instace, B message, 此时message为0,我猜测估计还是用不到message。

    我们再次进入testapprun_s 看看吧。

    int testapprun_s(instance_data_t *inst, int message)
    {
        switch (inst->testAppState)
        {
    

    ANCHOR在上次进入testapprun_s 的最后设定了testAppState

    inst->testAppState = TA_RXE_WAIT ;
    

    那我们直接找到这部分代码

    case TA_RXE_WAIT :  //enable rx,and  wait to recive a message
      // printf("TA_RXE_WAIT") ;
      {
           if(inst->wait4ack == 0) //if this is set the RX will turn on automatically after TX
           {
                 //turn RX on
                 instancerxon(inst, 0, 0) ;   // turn RX on, with/without delay
           }
           else
           {
                inst->wait4ack = 0 ; //clear the flag, the next time we want to turn the RX on it might not be auto
           }
           if (inst->mode != LISTENER)
           {
                //we are going to use anchor/tag timeout
                 inst->done = INST_DONE_WAIT_FOR_NEXT_EVENT; //using RX FWTO
    } inst->testAppState = TA_RX_WAIT_DATA; // let this state handle it // end case TA_RXE_WAIT, don't break, but fall through into the TA_RX_WAIT_DATA state to process it immediately. if(message == 0) break; }

    看标注为蓝色的代码,我们在初始化的时候有动过这个家伙

      uint8         wait4ack ;         instance_init 0                                      // if this is set to
    

    那么就是打开接受器,具体代码我们不看了,也是寄存器级别的代码。

    后面接着判断

      if (inst->mode != LISTENER)
    

    是的,我们目前分析的流程是ANCHOR,满足这个情况,那么接着执行

    inst->done = INST_DONE_WAIT_FOR_NEXT_EVENT; //using RX FWTO
    

    上一次最后遇到done这个变量打的我们措手不及,最后我们假定他是初始化值0,现在终于有个新值了,我记住你了!

    if(message == 0) break;
    

    失策了,以为message还不会用,但是这里用到了,我们传入的确实是0, break了。 由上一节分析,后面return done,这次返回的是INST_DONE_WAIT_FOR_NEXT_EVENT;。

    总结一下ANCHOR 二进宫的工作: 开启接受器,没错,就这一件事。

    这也就意味着等待其它设备发送数据了,我们估计后面要分析TAG了。 不过我们先返回去看看情况吧。 返回到int instance_run(void),可以知道不满足while 条件了,我们可以往后执行了。

     if(done == INST_DONE_WAIT_FOR_NEXT_EVENT_TO)
     //we are in RX and need to timeout (Tag needs to send another poll if no Rx frame)
     {
        ……
     }
    

    不满足条件,接着后面的代码,有种int instance_run也能执行完的感觉

    if((instance_data[instance].instancetimer_en == 1) && (instance_data[instance].stoptimer == 0))
      {
      }
    

    我们在看看这两个家伙初始化是否有赋值,我们从刚才代码分析中可以知道,至少在testapprun_s没有修改过这两个家伙

    搜索初始化代码,没有发现修改过这两个家伙,或者漏掉了,我们暂且认为初始化没有修改过,那么两个值应该都是0,所以不满足,直接执行int instance_run(void)最后的return 0,高高兴兴的返回啦

    博客讨论一些室内定位(DWM1000/CC2431/CC2530) 以及一些随性的技术。博文可以转载,但需要注明出处!
  • 相关阅读:
    MS CRM 2011 RC中的新特性(4)——活动方面之批量编辑、自定义活动
    最近的一些有关MS CRM 2011的更新
    MS CRM 2011 RC中的新特性(6)——连接
    MS CRM 2011 RC中的新特性(7)—仪表板
    参加MS CRM2011深度培训课程——第一天
    MS CRM 2011插件调试工具
    MS CRM2011实体介绍(四)——目标管理方面的实体
    MS CRM 2011 RC中的新特性(3)——客户服务管理方面
    MS CRM 2011 RC中的新特性(8)—数据管理
    ExtAspNet 登陆
  • 原文地址:https://www.cnblogs.com/tuzhuke/p/7707162.html
Copyright © 2011-2022 走看看