Contiki packetbuf原理

摘要

本文介绍了contiki netstack中在framer,rdc,mac层中b欧诺个uffer数据的packetbuf的构造和原理。缓存

正文

packetbuf做用

contilki netstack发送和接收数据先经过packetbuf缓冲,再进行处理。函数

packetbuf构成

packetbuf由header部分和data部分组成ui

 

image

 

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的操做

发送数据时,才会使用到header部分的内存

 

image

 

data从低地址向高地址分配.

  • 将发送数据装载到packetbuf使用packetbuf_copyfrom. 会自动设置buflen.
  • 取走发送数据使用packetbuf_copyto, 取走发送数据后,若是再也不使用数据,使用packetbuf_set_datalen将buflen复位。
  • header的分配从高地址向低地址分配。hdrptr在初始化时赋值为PACKETBUF_HDR_SIZE
  • 使用packetbuf_hdralloc分配一个header,hdrptr就减去对应的长度.
  • 使用packetbuf_hdr_remove释放一个heade, hdrptr就加上对应的长度。
  • 使用packetbuf_copyto_hdr将header写入到packetbuf中
  • 使用packetbuf_hdrptr获得header的起始地址
  • 使用packetbuf_hdrlen获得header的长度
  • 使用packetbuf_clear_hdr清除全部的header空间内的header

接收数据不会使用header部分的内存,接收数据的Header放在data的内存区内

 

image

将含有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缓存的数据包。

相关文章
相关标签/搜索