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.默认不包含的

如果你想要改变这些特性,你只需要设置其相关的选项。举例,如果你想要失能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

LwIP Application Developers Manual12---Configuring lwIP的更多相关文章

  1. LwIP Application Developers Manual2---Protocols概览

    1.前言 本文是对LwIP Application Developers Manual的翻译 lwIP是模块化的并支持广泛的协议,这些大部分协议可以被裁减从而减小代码的尺寸 2.协议概览 链路层和网络 ...

  2. LwIP Application Developers Manual1---介绍

    1.前言 本文主要是对LwIP Application Developers Manual的翻译 2.读者(应用开发手册的读者) 谁适合读这份手册 网络应用的开发者 想了解lwIP的网络应用开发者 阅 ...

  3. LwIP Application Developers Manual7---lwIP with or without an operating system

    1.前言 最近有一些讨论关于lwIP如何在单机的环境(比如,没有一个多线程的操作系统)使用. 本文的目的就是描述lwIP如何在无多线程操作系统或有多线程操作系统环境中运行 2.lwIP单线程内核 2. ...

  4. LwIP Application Developers Manual9---LwIP and multithreading

    1.前言 lwIP的内核并不是线程安全的.如果我们必须在多线程环境里使用lwIP,那么我们必须使用“upper”API层的函数(netconn或sockets).当使用raw API时,你需要自己保护 ...

  5. LwIP Application Developers Manual8---Sample lwIP applications

    1.前言 你已经编译lwIP协议栈在你的目标平台上,并且网络驱动正常工作.你可以ping你的设备. 干得好,为你感到骄傲.虽然一个设备可以响应ping,但并不能算一个完整的应用. 现在你可以通过网络接 ...

  6. LwIP Application Developers Manual5---高层协议之DNS

    1.前言 lwIP提供一个基本的DNS客户端(1.3.0后引进),通过使用DNS(Domain Name System)协议来允许应用程序解决主机名到地址的转换. 在文件lwipopts.h里面定义L ...

  7. LwIP Application Developers Manual5---高层协议之DHCP,AUTOIP,SNMP,PPP

    1.前言 本文主要讲述高层协议,包括DHCP 2.DHCP 2.1 从应用的角度看DHCP 你必须确保在编译和链接时使能DHCP,可通过在文件lwipopts.h里面定义LWIP_DHCP选项,该选项 ...

  8. LwIP Application Developers Manual4---传输层之UDP、TCP

    1.前言 本文主要讲解传输层协议UDP TCP 2.UDP 2.1 UDP from an application perspective 2.2 UDP support history in lwI ...

  9. LwIP Application Developers Manual3---链路层和网络层协议之IPV6,ICMP,IGMP

    1.前言 本文主要讲述链路层和网络层的协议IPV6,ICMP 2.IPV6 2.1 IPV6特性 IPv6是IPv4的更新.其最显著的差别在于地址空间由32位转换成128位 2.2 从应用的角度看IP ...

随机推荐

  1. go 定时器

    go 定时器 package main import ( "fmt" "time" ) func main() { t := time.NewTicker(ti ...

  2. Hadoop生态圈-Knox网关的应用案例

    Hadoop生态圈-Knox网关的应用案例 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Knox网关简介 据Knox官网所述(http://knox.apache.org/) ...

  3. Shell中变量扩展操作

    假设我们定义了一个变量为:file=/dir1/dir2/dir3/my.file.txt 可以用${ }分别替换得到不同的值:${file#*/}:删掉第一个 / 及其左边的字符串:dir1/dir ...

  4. cookies、sessionStorage和localStorage解释及区别

    在浏览器查看 HTML4的本地存储 cookie 浏览器的缓存机制提供了可以将用户数据存储在客户端上的方式,可以利用cookie,session等跟服务端进行数据交互. 一.cookie和sessio ...

  5. 设计模式---数据结构模式之组合模式(Composite)

    前提:数据结构模式 常常有一些组建在内部具有特定的数据结构,如果让客户程序依赖这些特定的数据结构,将极大的破坏组件的复用.这时候,将这些数据结构封装在内部,在外部提供统一的接口,来实现与特定数据结构无 ...

  6. layui(三)——laypage组件常见用法总结

    laypage 的使用非常简单,指向一个用于存放分页的容器,通过服务端得到一些初始值,即可完成分页渲染.核心方法: laypage.render(options)  来设置基础参数. 一.laypag ...

  7. HDU 1017(** **)

    题意是给定 n,m,问有多少组(a,b)满足 0 < a < b < n 而且 (a ^ 2 + b ^ 2 + m) / ( a * b ) 是整数. 直接模拟即可. 代码如下: ...

  8. Linux命令(十四)gdb调试

    1. gdb调试 fun.c #include <stdio.h> #include "head.h" int sum(int a, int b) { printf(& ...

  9. ArcMap登录和ArcGIS online都是灰色,无法连接网络的解决方法

    此问题可能由多种原因造成,表现为系统托盘中的 ArcGIS Online 地球图标断开连接(显示红色×). 解决方法: 方法一: 在系统托盘中的 ArcGIS Online 地球图标右键单击此图标 & ...

  10. jsp 起航 和Servlet通过attribute通信

    @WebServlet(name = "ticketServlet",urlPatterns = {"/tickets"},loadOnStartup = 1) ...