我是靠谱客的博主 紧张口红,最近开发中收集的这篇文章主要介绍Tinyos 采集noise floor,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

update 2018-6-4:

更新了可以用的tinyos noise 采集的代码,非常简单的从tinyos 本身提取出来的。

https://download.csdn.net/download/ls1160/10457438

==========================


最近在搞Tinyos,苦于网络上资料实在太少,而且bbs等问答平台已经没有人在更新了,因此主要根据前人留下的代码,以及相关文档,自己摸索,以实现自己的需求。 就目前来看,利用现有的资源,基本能够满足的需求,只是需要多花时间。说实话,自己做之前那个项目的老毛病还是没有改掉:太着急。

总是急于想要一步能够跨到结果,想要敏捷开发,但是却常常扇着腰。


在预估工作量的时候,切记一定将某些必须花长时间才能搞定的东西考虑进去,不能认为任何事情自己都能迅速弄懂,花上一天,两天,研究一个东西的运行机制是非常有可能,也是很有必要的。特别对于系统的关键环节,它可能都是会对系统最终的性能产生直接的影响的。
之前的项目,在做的时候,一直都是利用机器学习算法,然而并不曾深入了解这个算法,然而对于我的系统而言,了解算法的推导与计算,对于系统的性能是非常必要的。现在同样的,了解RSSI采样的机制,SFD,CCA运行的机制,非常有必要,而且不能少。  之后一定对需要长时间完成的工作进行提前预估,并且按部就班进行。好的,进入正题:


本节主要根据已有的代码,解释如何直接采集信道的RSSI,而不是提取MAC pkg中的RSSI。
Tinyos官方教程里面的Demo是提取包里面的(http://tinyos.stanford.edu/tinyos-wiki/index.php/Rssi_Demo),对于直接采,如noise floor,只是说自己看module的实现,这个感觉有点坑了,不过还好,有以前实现的代码。


# 坑1
1. 这个位置,我其实入了一个坑,曾经尝试自己找找,在接受pkg的时候,tinyos是如何提取RSSI,并且将它append到包尾。
就找到了这么一个command,看起来超级合理,超级像。


在tos/chips/cc2420/control/CC2420ControlP 中,有个command。



/***************** ReadRssi Commands ****************/
command error_t ReadRssi.read() {
return call RssiResource.request();
}






# 坑2
2. 结果发现采集到的数据很奇怪,在换算之前是76上下,换算之后76-304= -228dBm,这是不科学的。此方法,卒。
所以直接翻看之前的代码,之前的代码修改了driver,从buffer里面去rssi的速度变快了,但是我并不需要。因此,照葫芦画瓢的修改了一下。


最终整理下来,应当有如下修改:


2.1 XAppC.nc 中。


components new CC2420RssiC() as RssiC;
App.RssiResource -> RssiC;
App.Rssi -> RssiC;




2.2 XC.nc中,接口调用。

interface Resource as RssiResource;
interface CC2420Register as Rssi;


2.3 Rssi从buffer读取的代码。这段不是太懂,
/******************* rssi related functions ***************/
static inline void split_write(uint8_t val) {
U0TXBUF = val;
}
static inline uint8_t split_read() {
while ( !(IFG1 & URXIFG0) ){}
return U0RXBUF;
}
static inline uint8_t split_read_write(uint8_t val) {
uint8_t tmp;
while ( !(IFG1 & URXIFG0) ){ }
tmp = U0RXBUF;
while ( !(IFG1 & UTXIFG0) ){}
U0TXBUF = val;
return tmp;
}
uint16_t Rssi;
uint16_t readRSSI() {
uint8_t addr = 0x13 | 0x40;
P4OUT |= (1 << 2);
P4OUT &= ~(1 << 2);
split_write( addr );
split_read_write( 0 );
//reading the return value of split_write(addr)
split_read_write( 0 );
//reading the high 8 bits
Rssi = split_read_write( addr );
//reading the low 8 bits and write addr to bus.
P4OUT |= (1 << 2);
return Rssi;
}




2.4 Rssi采样的请求,以及释放这个请求。
    

if (call RssiResource.immediateRequest() == SUCCESS ){ //first calling the rssi sampling.
eint(); // not know, may be in the standard head files.
rssi= readRSSI();
printf("-%u.n", ((~ ((uint8_t) (rssi&0xff))) + 45 )&0xff);
call RssiResource.release();
dint();
}else{
call RssiResource.request();
}




2.5 在调用RssiResource.request函数的时候,会调用的callback。


event void RssiResource.granted(){
rssi= readRSSI();
printf("-%u.n",
((~ ((uint8_t) (rssi&0xff))) + 45 )&0xff);
call RssiResource.release(); //release the resource.
}



2.6 RssiC.nc
/******************************************************************
CC2420RssiC.nc created by HyungJune Lee (abbado@stanford.edu)
******************************************************************/
generic configuration CC2420RssiC()
{
provides interface Resource;
provides interface CC2420Register as RSSI;
}
implementation
{
enum
{
SPI_ID = unique("CC2420Spi.Resource")
};
components CC2420SpiP as Spi;
Resource = Spi.Resource[SPI_ID];
RSSI = Spi.Reg[CC2420_RSSI];
}




2.7 至此,这个Rssi数据应当是正常获取了。实际使用的时候,主要是2.4 和2.5 两个部分。





















最后

以上就是紧张口红为你收集整理的Tinyos 采集noise floor的全部内容,希望文章能够帮你解决Tinyos 采集noise floor所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(35)

评论列表共有 0 条评论

立即
投稿
返回
顶部