本文介紹了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緩存的數據包。