博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【DWM1000】 code 解密4一 ANCHOR 二进宫testapprun_s
阅读量:4591 次
发布时间:2019-06-09

本文共 2707 字,大约阅读时间需要 9 分钟。

上面我们的代码分析到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,高高兴兴的返回啦

 

转载于:https://www.cnblogs.com/tuzhuke/p/7707162.html

你可能感兴趣的文章
UMP系统功能 读写分离
查看>>
UMP系统功能 分库分表
查看>>
UMP系统功能 资源管理
查看>>
UMP系统功能 资源调度
查看>>
UMP系统功能 资源隔离
查看>>
UMP系统功能 数据安全
查看>>
Amazon AWS
查看>>
Amazon AWS EC2存储
查看>>
Amazon S3和EBS的区别
查看>>
AWS云管理平台
查看>>
NoSQL SimpleDB
查看>>
连接RDS数据库
查看>>
操作RDS数据库
查看>>
分布式并行编程
查看>>
将本地数据库迁移到云端RDS数据库
查看>>
Map和Reduce函数
查看>>
MapReduce模型简介
查看>>
MapReduce工作流程
查看>>
MapReduce的体系结构
查看>>
一个WordCount执行过程的实例
查看>>