【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】 code 解密4一 ANCHOR 二进宫testapprun_s的更多相关文章
- 【DWM1000】 code 解密7一ANCHOR接收到BLINK
接着之前ANCHOR的代码分析,但接收到无线数据,应该执行如下代码 case TA_RX_WAIT_DATA : //already recive a message ...
- 【DWM1000】 code 解密9一 ANCHOR response poll message
根据上面TAG发送的代码,我直接找到如下代码 case RTLS_DEMO_MSG_TAG_POLL: { if(inst->mode == LISTENER) ...
- 【DWM1000】 code 解密3一ANCHOR RUN起来
int done = INST_NOT_DONE_YET; #define INST_DONE_WAIT_FOR_NEXT_EVENT 1 //this signifies that the curr ...
- 【DWM1000】 code 解密2一 工程初始化代码分析
instance_init 函数追下去,绝大多数的代码都在初始化如下结构体 typedef struct { INST_MODE mode; instance_init -ANCHOR //insta ...
- 【DWM1000】 code 解密8一 TAG接收blink response 信号
在分析这个部分前,目前我看到DWM1000 的资料,data可以分为blink和一般无线数据,后面有内容我们再扩充, 上面我们已经看到接收到blink触发的事件为 case SIG_RX_BLINK ...
- 【DWM1000】 code 解密6一TAG 状态机第一步
我们前面分析过,不论ANCHOR 还是TAG,前面变量的初始化基本都是一样的,只是状态机必须明确区分不同的设备类型.我们从开始看TAG.由于初始化TAG的 testAppState一样初始化为TA_I ...
- 【DWM1000】 code 解密5一ACHOR 第一次回家Main 函数
instance_run(); if((instance_data[0].monitor == 1) && ((portGetTickCnt() - instance_data[0]. ...
- 【DWM1000】 code 解密1一 去掉Main 函数多余内容
蓝点DWM1000 模块已经打样测试完毕,有兴趣的可以申请购买了,更多信息参见 蓝点论坛 正文: 室内定位兴起,DWM1000 作为超宽带UWB的代表,在国内用的越来越多,但是可见资料非常少. 一方面 ...
- 【DWM1000】 code 解密10 一 TAG 发送最后一个消息
更上面ANCHOR发送信息时的RTLS_DEMO_MSG_ANCH_RESP, 我们很快就可以找到如下代码 case RTLS_DEMO_MSG_ANCH_RESP: { 这里面一部分是设置重要变量, ...
随机推荐
- Nginx详解九:Nginx基础篇之Nginx的访问控制
基于IP的访问控制:http_access_module 不允许指定网段的用户访问:配置语法:deny address | CIDR | unix: | all;默认状态:-配置方法:http.ser ...
- mysql 语句的使用清库数据转移
mysql清空数据库表 方法1:重建库和表用mysqldump --no-data把建表SQL导出来,然后drop database再create database,执行一下导出的SQL文件: 方法2 ...
- jdk的卸载及安装+环境变量的配置
一.卸载:在控制面板中删除.这是最基本的方式.2. 采用360安全卫士的软件卸载工具,记得将有关的注册表信息全部删除.3. 在“运行”中输入Regedit,打开注册表编辑器,找到HKEY_LOCAL_ ...
- 一个kubeadm.config文件--定义了token,扩展了默认端口,外部ETCD集群,自定义docker仓库,基于ipvs的kubeproxy
这个版本是基于kubeadm.k8s.io/v1alpha3的,如果到了beta1,可能还要变动呢. apiVersion: kubeadm.k8s.io/v1alpha3 kind: InitCon ...
- .net core 使用NPOI填充Word模板导出Word
最近工作用到在Word模板插入数据库数据,导出一个带数据的Word文件,想起来之前操作Word都是用微软提供的Microsoft.Office.Interop.Word,而在最新的..NET CORE ...
- Codeforces 609F Frogs and mosquitoes 线段树
Frogs and mosquitoes 用线段树维护每个点覆盖的最小id, 用multiset维护没有吃的蚊子. #include<bits/stdc++.h> #define LL l ...
- HTML自定义滚动条(仿网易邮箱滚动条)转载
它是使用CSS中的伪元素来实现的,主要由以下三个来完成: 1. -webkit-scrollbar:定义滚动条的样式,如长宽. 2. -webkit-scrollbar-thumb:定义滚动条上滑块的 ...
- BZOJ3295 [Cqoi2011]动态逆序对 分治 树状数组
原文链接http://www.cnblogs.com/zhouzhendong/p/8678185.html 题目传送门 - BZOJ3295 题意 对于序列$A$,它的逆序对数定义为满足$i< ...
- js将时间戳转为时间格式
时间戳转时间格式 //分钟 let timeM= parseInt(msg/1000/60%60); if(timeM<10){ timeM="0"+timeM; } //秒 ...
- 解析eBay BASE模式、去哪儿及蘑菇街分布式架构
目录:问题分析概念解读Most Simple原理解读eBey.去哪儿.蘑菇街分布式事务案例分析 参考资料 1.问题解析 要想做架构,必须识别出问题,即是谁的问题,什么问题.明显的,分布式架构解决 ...