本文介绍了contiki netstack中在framer,rdc,mac层中b欧诺个uffer数据的packetbuf的构造和原理。缓存
contilki netstack发送和接收数据先经过packetbuf缓冲,再进行处理。函数
packetbuf由header部分和data部分组成ui
data的长度为PACKETBUF_SIZE,可在contiki-conf.h中由PACKETBUF_CONF_SIZE定义.net
header的长度为PACKETBUF_HDR_SIZE,可在contiki-conf.h中由PACKETBUF_CONF_HDR_SIZE定义内存
所以packetbuf定义为rem
static uint16_t packetbuf_aligned[(PACKETBUF_SIZE + PACKETBUF_HDR_SIZE) / 2 + 1];get
static uint8_t *packetbuf = (uint8_t *)packetbuf_aligned;it
以上的作法是针对某些芯片特殊的对齐要求。原理
经过packetbuf_reference, packetbuf的数据区能够指向其它内存地址。im
发送数据时,才会使用到header部分的内存
data从低地址向高地址分配.
接收数据不会使用header部分的内存,接收数据的Header放在data的内存区内
将含有header接收数据装载到packetbuf使用packetbuf_copyfrom. 会自动设置buflen
使用packetbuf_hdrreduce移除接收到数据的header
取走发送数据使用packetbuf_copyto, 取走发送数据后,若是再也不使用数据,使用packetbuf_set_datalen将buflen复位。
综上可见contiki的backbuf管理并不给出固定的格式,按照数据header+payload的模式来处理,提供的函数只是完成对header和payload的move, copy, get length操做。 packetbuf模块提供packet缓存,也提供修改payload缓存地址的机制,这样数据发送的实现方式能够更加灵活,同时也可发送大于packetbuf缓存的数据包。