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源码中想用这个技巧,就得我们不手动设置值,而让编译器自动分配值。