热度 17
2013-7-9 12:58
1192 次阅读|
0 个评论
Chameleon结构的作用在Chameleon的pack_header()函数中体现了出来(这里的打包方式像以前自己讨论过的一个问题,是在组织数据时直接将数据写入发送缓冲区中,还是保存在一个结构体中到最后一起打包)。Chameleon的方式,属于将需要打包的数据先放在一个结构体中,在最后将要发送时,调用pack_header函数将数据写入发送缓冲区中。这样会浪费一些内存。但是,折中的结果是通过Chameleon我们可以同时兼容多种协议,也是Contiki的最大优势。有一利,有一弊。取舍之间,适合的就是最好的。 在Chameleon在进行pack_header时,将存放在packetbuf_attrs,packetbuf_addrs,数组中的数据提取出来,放在将要发送的packetbuf的报文头部。 应该说,这里packetbuf中使用的打包方式确实浪费了不少内存。 首先,是分配静态的 struct packetbuf_attr packetbuf_attrs ; struct packetbuf_addr packetbuf_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 , 当指向其他地方时,packetbufptr不等于packetbuf 以此来判断是否,packetbufptr指向的是否为external_data; packetbuf是由PACKETBUF_SIZE和PACKETBUF_HDR_SIZE两个值来组成的,即一个packetbuf包含了header和data; 这次对于packetbuf.c文件理解清楚了,这里边就是对于一个数组的封装操作;实现了各种便于pack与unpack的操作。