LWIP手记【A】PUBF-1

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
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值