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緩存的數據包。

相關文章
相關標籤/搜索