首页 > LwIP Application Developers Manual12---Configuring lwIP

LwIP Application Developers Manual12---Configuring lwIP

1.前言

 

2.LwIP makefiles

  • With minimal features
C_SOURCES = 
src/api/err.c 
src/core/init.c 
src/core/mem.c 
src/core/memp.c 
src/core/netif.c 
src/core/pbuf.c 
src/core/stats.c 
src/core/udp.c 
src/core/ipv4/icmp.c 
src/core/ipv4/inet.c 
src/core/ipv4/ip.c 
src/core/ipv4/ip_addr.c 
src/core/ipv4/ip_frag.c 
src/netif/etharp.c 

 

  • With all other features (with any Sequential API)
C_SOURCES = 
src/api/netifapi.c 
src/api/err.c 
src/core/dhcp.c 
src/core/init.c 
src/core/mem.c 
src/core/memp.c 
src/core/netif.c 
src/core/pbuf.c 
src/core/raw.c 
src/core/stats.c 
src/core/udp.c 
src/core/ipv4/autoip.c 
src/core/ipv4/icmp.c 
src/core/ipv4/igmp.c 
src/core/ipv4/inet.c 
src/core/ipv4/ip.c 
src/core/ipv4/ip_addr.c 
src/core/ipv4/ip_frag.c 
src/core/snmp/asn1_dec.c 
src/core/snmp/asn1_enc.c 
src/core/snmp/mib2.c 
src/core/snmp/mib_structs.c 
src/core/snmp/msg_in.c 
src/core/snmp/msg_out.c 
src/netif/etharp.c 
  • With all other features (with Socket API)
C_SOURCES = 
src/api/api_lib.c 
src/api/api_msg.c 
src/api/err.c 
src/api/netbuf.c 
src/api/netifapi.c 
src/api/sockets.c 
src/api/tcpip.c 
src/core/dhcp.c 
src/core/init.c 
src/core/mem.c 
src/core/memp.c 
src/core/netif.c 
src/core/pbuf.c 
src/core/raw.c 
src/core/stats.c 
src/core/udp.c 
src/core/ipv4/autoip.c 
src/core/ipv4/icmp.c 
src/core/ipv4/igmp.c 
src/core/ipv4/inet.c 
src/core/ipv4/ip.c 
src/core/ipv4/ip_addr.c 
src/core/ipv4/ip_frag.c 
src/core/snmp/asn1_dec.c 
src/core/snmp/asn1_enc.c 
src/core/snmp/mib2.c 
src/core/snmp/mib_structs.c 
src/core/snmp/msg_in.c 
src/core/snmp/msg_out.c 
src/netif/etharp.c 

3. Lwipopts.h

lwipopts.h是一个用户文件,你可以使用它来配置lwIP和它的所有模块。你可以不需要定义每一个lwIP的选项,如果你没有定义该选项,一个默认的选项将会被使用。因此,你的lwipopts.h可以重定义许多lwIP的行为

3.1 Module support (Code size)

你可以调整代码的大小通过只编译你想要的特性。如下列表给出了原装lwIP编译时支持的特性:

1. 默认包含

  • ARP (LWIP_ARP)
  • IP and fragmentation (IP_FRAG) and reassembly (IP_REASSEMBLY)
  • Raw IP PCB support (LWIP_RAW)
  • UDP (LWIP_UDP) and UDP-Lite (LWIP_UDPLITE)
  • TCP (LWIP_TCP) -- this is a big one!
  • Statistics (LWIP_STATS)

2.默认不包含的

  • DHCP (LWIP_DHCP)
  • AUTOIP (LWIP_AUTOIP)
  • SNMP (LWIP_SNMP)
  • IGMP (LWIP_IGMP)
  • PPP (PPP_SUPPORT)

如果你想要改变这些特性,你只需要设置其相关的选项。举例,如果你想要失能UDP并且使能DHCP,那么你可以在lwipopts.h文件中加入如下代码:

// Disable UDP#define LWIP_UDP 0// Enable DHCP#define LWIP_DHCP 1

 

3.2 Memory management (RAM usage)

3.2.1.内存池

在一个嵌入式环境中,内存池(memory pools)使内存的分配更加快速和高效。

lwIP提供一个灵活的方法来管理和组织内存池。lwIP在数据段中保留了一个固定大小的静态内存,该内存被分成各种池来保存各种数据结构。

比如,一个内存池专门为存放结构体tcp_pcb,另一个内存池专门为存放结构体udp_pcb。

每个池可以被配置用来保存固定数目的数据结构,该数目的大小可以通过改变lwipopts.h文件里面定义的MEMP_NUM_*数值,比如,MEMP_NUM_TCP_PCB(控制tcp_pcb的数目)和MEMP_NUM_UDP_PCB(控制udp_pcb的数目)。

除了lwIP提供的标准内存池,用户还可以自定义内存池。

3.2.2.Dynamic allocation: mem_malloc

lwIP使用mem_malloc自定义函数来动态分配内存,因此,改变lwIP如何使用RAM是方便的。如下提供了3种解决方案:

1).(默认)lwIP自定义基于堆的函数mem_malloc。默认,lwIP使用一个已分配的静态内存块,像堆,来进行内存处理。使用MEM_SIZE可以改变lwIP堆的大小。

2).C标准库中的malloc和free。如果你希望lwIP使用标准函数库(由编译器/架构提供)来进行内存管理,那么你就要定义选项MEM_LIBC_MALLOC。

3).内存池。lwIP可以仿真内存的动态分配,通过使用custom memory pools(详情请查看相关章节)。如果要使用该解决方案则要包含了MEM_USE_POOLS和MEMP_USE_CUSTOM_POOLS选项和一个新的定制文件lwippools.h。

3.2.3.Understanding/changing memory usage 

lwIP使用内存来:

  • n 存放代码(使用ROM还是RAM取决于你的系统)
  • n 静态分配变量(一些有初始化,一些则没有)
  • n 任务的堆栈
  • n 动态内存分配:堆和memp内存池

除非你使用C库堆的实现(通过定义MEM_LIBC_MALLOC=1),否则已分配的动态内存必须在其它地方静态分配。

这意味着你要保留一定大小的内存给堆(heap)或memp池使用,在运行时代码会动态分配内存。堆和memp池的大小可以被调整来减少RAM的使用:

  • 有3种类型的pbufs:REF/ROM,RAM和POOL。POOL的大小由PBUF_POOL_SIZE*PBUF_POOL_BUFSIZE来决定。(TODO)
  • RAM pbufs在内存中分配的大小由MEM_SIZE(该内存并不经常被使用,除了RAM pbufs)决定。它在mem_memory中被分配。(TODO)
  • REF/ROM pbufs和pcbs还有其他一些stuff通过专用的内存池并根据其结构类型来分配大小。结构体的数量由各种MEMP_NUM_*来定义。总的来说,这个内存被分配为memp_memory并且它包括了pbuf POOL.(TODO)

然而,如果你在lwipopts.h文件里定义了MEMP_MEM_MALLOC的值为1,那么每一个动态分配的内存都来自堆(heap)(该大小被MEM_SIZE定义)。如果你也定义了MEM_LIBC_MALLOC的值为1,则lwIP并不需要额外的内存来动态分配内存,使用C库的堆就够用了。然而,你还是要确保这个堆足够大来运行你的应用。为了调整各种MEMP_NUM_数值,你可以定义LWIP_STATS=1和LWIP_STATS_DISPLAY=1并且调用stats_display来查看每个池使用的具体情况(或者查看全局变量lwip_stats)。

3.3 Fine-tuning even more 

你可以打开lwip/src/include/lwip/opt.h文件来查看你可设置哪些选项。该文件注释完整并且解释了多少选项可以被使用。

 4. lwIP code size

todo 

5. Maximizing throughput

todo

6. Tuning TCP

todo 

7. Custom memory pools

 todo

 

转载于:https://www.cnblogs.com/smartjourneys/p/8214613.html

更多相关:

  • 文章目录core文件判读是否为core文件打开系统 core dump修改core文件的保存路径gdb调试core文件 最近初步了解了一下core 文件,已经如何将gdb工具与core文件结合调试出现段错误的程序 core文件 core是指操作系的程序统核心。当我们的程序在操作系统上运行异常崩溃时,操作系统会将此时系统内存...

  •   .net core已经出来很长一段时间了,没有很好的学习过,现在工作不那么忙了,参考官方文档,在这里记录自己的学习过程!   ASP.NET Core 是一个跨平台的高性能开源框架,用于生成基于云且连接 Internet 的新式应用程序。 使用ASP.NET Core,可以:创建 Web 应用程序和服务、IoT 应用和移动后端。在...

  • 更多内容,欢迎关注微信公众号:全菜工程师小辉~前言在笔者上一篇博客,详解了NIO,并总结NIO相比BIO的效率要高的三个原因,彻底搞懂NIO效率高的原理。这篇博客将针对第三个原因,进行更详细的讲解。首先澄清,零拷贝与内存直接映射并不是Java中独有的概念,并且这两个技术并不是等价的。零拷贝零拷贝是指避免在用户态(User-space)...

  • 一、预备知识—程序的内存分配  一个由c/C++编译的程序占用的内存分为以下几个部分  1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈,如果还不清楚,那么就把它想成数组,它的内存分配是连续分配的,即,所分配的内存是在一块连续的内存区域内.当我们声明变量时,那么编译器...

  • 我的爱机是一台ThinkPad T420,原装三星DDR 1333 4G内存一根,还剩一根内存位置,最近趁京东6.18促销,准备增加一根物理内存。为了确保兼容性,觉得仍然选购DDR 1333 4G内存,于是购买了金士顿这款,比如DDR3 1600的还贵。 这个安装过程完全参照该内存的网页提示进行 这里简单记录一下,以备...

  • 陪伴我多年的老本ThinkPad T420渐渐垂垂老矣, 我想更新一下可以更新的部分, 比如将2.5寸HDD更换为SSD, 将单条4G内存再增加一根, 凡此种种想法, 可能最后归结为如何获取该笔记本的硬件配置信息, 在windows下面使用鲁大师之类的检测软件, 也许很好搞定,但是在Ubuntu 14.04平台上如果办到呢? 很简单...

  • 一.内存错误出现的场景 这几天在重构ATS插件代码的过程中遇到了烦人的内存泄露问题, 周五周六连续两天通过走查代码的方法,未能看出明显的导致内存错误的代码, 同时也觉得C和C++混合编程得到一个动态库, 在一个.cpp主文件中,即用new又用malloc来动态分配内存, 可能会导致内存错误.后来网上调研和查资料发现, new和mal...