LWIP手记【A】PUBF-1

来源:互联网 发布:淘宝发布宝贝数量 编辑:程序博客网 时间:2024/05/23 01:15

pubf是LIWP的一个很重要的部分。也是应该彻底理解的部分。花很多时间在这上面是值得的。和MEM、memp都有联系,所以比较难弄。现在觉得弄懂了这部分,那么LWIP基本上就真正入门了。打算自己编写些例子来理解PBUF。看看LWIP源码里面都用到哪些招数和所谓技巧。总之,对自己有信心最重要,坚持坚持再坚持。

在LWIP源代码文件目录说:

pbuf.c包含协议栈内核使用的数据包管理函数,用于协议栈层次间的数据传递,避免数据拷贝

数据考虑确实是比较花时间和内存的。我自己写程序也发现了这点,尤其是初上电那一把,基本把所有路径走一遍,花费的时间超出我的想象。LWIP想用在各种实时场合(包括adam当初弄得棒球传感器),速度要求快。因此pbuf.C的引入肯定是不得已而为之,带来的问题就是可读性比较差,程序的结构也会受到摧残,但是由于协议本身是固定不变的,所以可读性变得并不那么重要。这是我目前的理解。

(1)在memp.C里,作者展示各个奇技淫巧,as follows:

static const u16_t memp_num[MEMP_MAX] = {#define LWIP_MEMPOOL(name,num,size,desc)  (num),#include "lwip/memp_std.h"};

MEMP_MAX的值有点意思,在memp.h, 如下:

typedef enum {#define LWIP_MEMPOOL(name,num,size,desc)  MEMP_##name,#include "lwip/memp_std.h"  MEMP_MAX} memp_t;
这是利用C给enum的成员设置个默认值。比如写个代码,

typedef enum {  a1,  a2,  a3,  a4,  max} memp;memp a;int main(void){  a = max;
}
那么 a = 4.

当然,如果这样搞,给某些成员手动设置值

typedef enum {  a1,  a2,  a3=3,  a4=1,  max} memp;memp a;int main(void){  a = max;}
那么a = 2.

所以想LWIP源码中想用这个技巧,就得我们不手动设置值,而让编译器自动分配值。








0 0
原创粉丝点击