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
總結
以上是生活随笔為你收集整理的LwIP Application Developers Manual12---Configuring lwIP的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 求一个好听的召唤师名字
- 下一篇: SVN版本控制系统使用