看来学习也是一种坚持,本来昨天打算写的,可是太晚了一懒就拖到今天了。今天动笔想必也是会忘了很多。
1、lwip 的 pbuf 是数据链,它的首位没有相连,如果,你在头一个pbuf里面想要寻到下一个pbuf那么直接找寻p->next.如果要找下一个的下一个呢?可以用p->next->next。
至于p->ref是什么作用,相关文档上面说,当ref=0的时候,pbuf就自动解除掉。
2、相关文档上面说,pbuf可以申请RAM,ROM和POOL三种类型的pbuf。我申请过RAM和ROM的,但是,当我申请POOL类型的时候,我把我要发送数据的指针指过去p->payload的时候,发现程序是出错的。具体原因,我还不清楚,但是网上有一句话,就是POOL类型的PBUF经常用来接受数据包,而且,经常用在底层驱动程序或者中断程序这些要求分配快速得地方。(如果知道里面为什么出错的原因的朋友,欢迎交流交流)
我发现申请RAM类型的pbuf,然后,把它连接成链的时候,它是把RAM复制过去。成链之后还可以pbuf_free原来你alloc的pbuf。
3关于函数说明:
3.1 pbuf_alloc,该函数顾名思义就是分配一个pbuf
3.2 pbuf_realloc,这个函数很诡异,它的函数说明的意思说,可以把一条pbuf链里面的最后一个pbuf的大小缩小成你设定的长度,其它的pbuf将会消失掉。
但是,我在别人翻译的document上面看到,它说是重新把你填进去的那个pbuf缩小到你设定的长度。
然后,我用了多种方法,在程序中试验,都发现,这两种说法都不正确。(这里知道的朋友,也欢迎跟我交流交流)
3.3 pbuf_header,这个函数很好,就是重新分配p->payload指针,和增长新的pbuf的长度
3.4 pbuf_free,free掉ram里面的pbuf结构,如果pbuf->type是RAM类型的话,就连数据也一起free掉
3.5 pbuf_clen,计算pbuf链当中的pbuf个数
3.6 pbuf_ref,增加pbuf->ref这个数,但是具体ref有什么作用暂时还不清楚
3.7 pbuf_cat,把两个pbuf链成链。然后,把第二个参数的pbuf,自动free掉
3.8 pbuf_chain,作用同上面,但是第二个pbuf没有free
3.9 pbuf_dechain,解开pbuf链中的第一个pbuf
3.10 pbuf_copy(struct pbuf *p_to, struct pbuf *p_from),这个函数,就是把from这个pbuf拷贝到to这个pbuf注意,to这个pbuf应该比from这个空间要大。注意这里面的拷贝,就是全部拷贝了。拷贝后原来to这个pbuf所有数据都会清除
3.11 pbuf_copy_partial(struct pbuf *buf, void *dataptr, u16_t len, u16_t offset)这里面就是部分拷贝外部数据到pbuf。这里面就没有把pbuf格式化掉了,只是将部分数据替换了而已
3.12 pbuf_take(struct pbuf *buf, const void *dataptr, u16_t len)这个就是拷贝数据到pbuf了,没有偏移而已。
3.13 pbuf_coalesce(struct pbuf *p, pbuf_layer layer)创建一个队列外的pbuf,具体怎么用,还不知道。