Contiki——Rime Stack分析

2024-04-08 09:08
文章标签 分析 stack contiki rime

本文主要是介绍Contiki——Rime Stack分析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一 分析Rime的大概思路

在Rime中,理解Rime Stack的工作原理,首先要理解整体框架;
之后要理解这里边的list,memb,packetbuf,channel,等几个部分;
之后要明白chameleon的结构,以及一些具体实现;
这几个部分中,以packetbuf和chameleon最为重要。

像packetbuf.c,packetqueue.c是最基本的几个函数(当然list.c,memb.c,ctimer.c也是)。在此之上,形成了Rime的各个primitive,即广播帧,单播帧,级跳等的发送。同时,Chameleon结构的设计,使得Rime Stack能够打包任意协议类型的帧数据。这也是Rime Stack的优势所在。故,Chameleon结构在Rime Stack中占有很重要的地位。最后的发送帧打包都是借助于Chameleon实现的。
当然,Rime Stack只是一个帧发送与接收的stack,自身无法进行数据采集,组网等应用。如果要这些应用,需要在Rime之上实现router,实现collect,实现Trickle,实现mesh。
理解好Rime有两个文件必须理解,chameleon.c,packetbuf.c这两个文件的源代码以及Adam关于它们的论文。
如果只是分析Rime Stack,则再继续将abc,ibc,ubc等各种发送帧的文件理解了,明白里边的回调函数调用,基本上可以从大体上理解Rime的结构,此时根据Contiki中的Rime例程,可以垂直追踪并分析代码。根据作者的实际使用,会对这些理解更深入。
当然,这些只是Rime Stack+Chameleon,如果深入看MAC结构,就需要分析以下几个:

#define NETSTACK_CONF_MAC                       csma_driver
#define NETSTACK_CONF_RDC                       contikimac_driver
#define NETSTACK_CONF_FRAMER                    framer_802154
#define NETSTACK_CONF_RADIO                     stm32w_radio_driver

二 追踪Rime中的几个帧发送文件
  1. Rime中的各个primitive最终都是在abc中打开channel,建立一个channel;
  2. 同时,设置这个channel的头长度;
  3. 不同的层,设置不同的hdrsize;
  4. channel_set_attributes must be after the open.
  5. 每一层继承了上一层的hdrsize并根据自己的需要添加了额外的hdrsize;
  6. 计算最后的hdrsize,由chameleon的header_size完成。
  7. 而这些最基本的attribute定义在packetbuf.h中。由此,chameleon结构的作用体现出来。根据不同层的attribute设置相应的attribute值,最后根据hdrsize将所有有关的attribute,pack在buf中。由此,完成pack。最后packetbuf完成数据的整理工作。至此,从Rime到Chameleon完成了,他们的工作。
  8. 每一层的callback,是为了下一层收到或者发送时,用来实现上一层需要的功能。
关于Contiki中Memb内存的使用,采用了预分配的方式:
  1. 在memb内存分配使用中,使用了预先分配内存的方式来管理内存;
  2. 首先,通过memb()宏静态分配一个二维较大的内存;
  3. 之后,根据需要一次内存,并记录本次使用的内存;
  4. 最后,当释放内存后,将内存使用记录清楚;

三 实例代码追踪(example-mesh.c)

Rime and Chameleon
Chameleon结构中,packetbuf的操作也是基础。所以无论对于Rime,还是Chameleon,甚至于后来的MAC层的数据打包发送与接收,都与packetbuf有着莫大的联系。所以彻底弄明白packetbuf在理解好Contiki中的协议有很大的帮助。

在数据离开Rime后,进入Chameleon,离开Chameleon后进入CSMA,离开CSMA后进入RDC(contikimac),离开RDC后进入Frame802154打包为802154协议的帧数据,最后进入Radio的driver准备发送。

而这里边,发送是通过一层层调用下一级发送函数进行发送,而接收是通过回调函数,在底层实现上层需要的动作。
/---------------------------------Rime+Chameleon---------------------------------------/
mesh_send(mesh.c)----multihop_send(multihop.c)----unicast_send(unicast.c)
----broadcast_send(broadcast.c)----abc_send(abc.c)----rime_output(rime.c)
----chameleon_create+packetbuf_compact(chameleon.c)
/----------------------------------MAC--------------------------------------------/
----NETSTACK_MAC.send(packet_sent, c)(here the NETSTACK_MAC macro is csma. Therefore, the send is send_packet(csma.c))
----NETSTACK_RDC.send(sent, ptr);(here the NETSTACK_RDC macro is contikimac. In a result, the send is qsend_packet(contikimac.c))
----NETSTACK_FRAMER.create();(the function is create() in framer-802154.c)
----NETSTACK_RADIO.prepare(packetbuf_hdrptr(), transmit_len);(send the frame through the NETSTACK_RADIO)
/---------------------------------------------------------------------------------/

四 应用
Rime仅仅是帮助我们将数据发送出去,具体的应用就需要熟悉mesh,router,collect等算法了。如果要做低功耗,还要熟悉Contiki的RDC机制及应用层还有Coap协议。

注:
以前关于Rime的笔记
http://blog.csdn.net/tietao/article/details/8543133
http://blog.csdn.net/tietao/article/details/8590942

这篇关于Contiki——Rime Stack分析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/885153

相关文章

[职场] 公务员的利弊分析 #知识分享#经验分享#其他

公务员的利弊分析     公务员作为一种稳定的职业选择,一直备受人们的关注。然而,就像任何其他职业一样,公务员职位也有其利与弊。本文将对公务员的利弊进行分析,帮助读者更好地了解这一职业的特点。 利: 1. 稳定的职业:公务员职位通常具有较高的稳定性,一旦进入公务员队伍,往往可以享受到稳定的工作环境和薪资待遇。这对于那些追求稳定的人来说,是一个很大的优势。 2. 薪资福利优厚:公务员的薪资和

高度内卷下,企业如何通过VOC(客户之声)做好竞争分析?

VOC,即客户之声,是一种通过收集和分析客户反馈、需求和期望,来洞察市场趋势和竞争对手动态的方法。在高度内卷的市场环境下,VOC不仅能够帮助企业了解客户的真实需求,还能为企业提供宝贵的竞争情报,助力企业在竞争中占据有利地位。 那么,企业该如何通过VOC(客户之声)做好竞争分析呢?深圳天行健企业管理咨询公司解析如下: 首先,要建立完善的VOC收集机制。这包括通过线上渠道(如社交媒体、官网留言

打包体积分析和优化

webpack分析工具:webpack-bundle-analyzer 1. 通过<script src="./vue.js"></script>方式引入vue、vuex、vue-router等包(CDN) // webpack.config.jsif(process.env.NODE_ENV==='production') {module.exports = {devtool: 'none

Java中的大数据处理与分析架构

Java中的大数据处理与分析架构 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!今天我们来讨论Java中的大数据处理与分析架构。随着大数据时代的到来,海量数据的存储、处理和分析变得至关重要。Java作为一门广泛使用的编程语言,在大数据领域有着广泛的应用。本文将介绍Java在大数据处理和分析中的关键技术和架构设计。 大数据处理与

段,页,段页,三种内存(RAM)管理机制分析

段,页,段页         是为实现虚拟内存而产生的技术。直接使用物理内存弊端:地址空间不隔离,内存使用效率低。 段 段:就是按照二进制文件的格式,在内存给进程分段(包括堆栈、数据段、代码段)。通过段寄存器中的段表来进行虚拟地址和物理地址的转换。 段实现的虚拟地址 = 段号+offset 物理地址:被分为很多个有编号的段,每个进程的虚拟地址都有段号,这样可以实现虚实地址之间的转换。其实所谓的地

mediasoup 源码分析 (八)分析PlainTransport

mediasoup 源码分析 (六)分析PlainTransport 一、接收裸RTP流二、mediasoup 中udp建立过程 tips 一、接收裸RTP流 PlainTransport 可以接收裸RTP流,也可以接收AES加密的RTP流。源码中提供了一个通过ffmpeg发送裸RTP流到mediasoup的脚本,具体地址为:mediasoup-demo/broadcaste

Java并发编程—阻塞队列源码分析

在前面几篇文章中,我们讨论了同步容器(Hashtable、Vector),也讨论了并发容器(ConcurrentHashMap、CopyOnWriteArrayList),这些工具都为我们编写多线程程序提供了很大的方便。今天我们来讨论另外一类容器:阻塞队列。   在前面我们接触的队列都是非阻塞队列,比如PriorityQueue、LinkedList(LinkedList是双向链表,它实现了D

线程池ThreadPoolExecutor类源码分析

Java并发编程:线程池的使用   在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题:   如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,因为频繁创建线程和销毁线程需要时间。   那么有没有一种办法使得线程可以复用,就是执行完一个任务,并不被销毁,而是可以继续执行其他的任务?

ConcurrentHashMap之源码分析

集合是编程中最常用的数据结构。而谈到并发,几乎总是离不开集合这类高级数据结构的支持。比如两个线程需要同时访问一个中间临界区(Queue),比如常会用缓存作为外部文件的副本(HashMap)。这篇文章主要分析jdk1.5的3种并发集合类型(concurrent,copyonright,queue)中的ConcurrentHashMap,让我们从原理上细致的了解它们,能够让我们在深度项目开发中获益非浅

Hashtable的源码分析

Hashtable简介     Hashtable同样是基于哈希表实现的,同样每个元素是一个key-value对,其内部也是通过单链表解决冲突问题,容量不足(超过了阀值)时,同样会自动增长。     Hashtable也是JDK1.0引入的类,是线程安全的,能用于多线程环境中。     Hashtable同样实现了Serializable接口,它支持序列化,实现了Cloneable接