原创 Contiki——Chameleon理解

2013-7-9 12:58 1180 17 17 分类: 消费电子

 

Chameleon结构的作用在Chameleon的pack_header()函数中体现了出来(这里的打包方式像以前自己讨论过的一个问题,是在组织数据时直接将数据写入发送缓冲区中,还是保存在一个结构体中到最后一起打包)。Chameleon的方式,属于将需要打包的数据先放在一个结构体中,在最后将要发送时,调用pack_header函数将数据写入发送缓冲区中。这样会浪费一些内存。但是,折中的结果是通过Chameleon我们可以同时兼容多种协议,也是Contiki的最大优势。有一利,有一弊。取舍之间,适合的就是最好的。
在Chameleon在进行pack_header时,将存放在packetbuf_attrs,packetbuf_addrs,数组中的数据提取出来,放在将要发送的packetbuf的报文头部。
应该说,这里packetbuf中使用的打包方式确实浪费了不少内存。
首先,是分配静态的
struct packetbuf_attr packetbuf_attrs[PACKETBUF_NUM_ATTRS];
struct packetbuf_addr packetbuf_addrs[PACKETBUF_NUM_ADDRS];
而它们需要消耗,48字节内存。
/*-------------------------------------------------------------------------------------------------------------------------------------*/
2013-5-2 19:31
Contiki中chameleon机制中,
有一个raw没有经过优化的.c文件,
有一个bitopt即位优化过的.c文件,
这两个文件可以配置选择。
对于channel机制中是通过一个list进行管理,
打开一个channel即是添加一个list node,其他的操作,是通过channel封装了list的各种操作;
这里边关于数据的组织,与解析(pack,unpack)都是通过packetbuf模块进行的数据操作;
 
在packetbuf中,
packetbufptr默认是指向&packetbuf[PACKETBUF_HDR_SIZE],
当指向其他地方时,packetbufptr不等于&packetbuf[PACKETBUF_HDR_SIZE]以此来判断是否,packetbufptr指向的是否为external_data;
packetbuf是由PACKETBUF_SIZE和PACKETBUF_HDR_SIZE两个值来组成的,即一个packetbuf包含了header和data;
这次对于packetbuf.c文件理解清楚了,这里边就是对于一个数组的封装操作;实现了各种便于pack与unpack的操作。

文章评论0条评论)

登录后参与讨论
我要评论
0
17
关闭 站长推荐上一条 /2 下一条