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的選項,如果你沒有定義該選項,一個默認(rèn)的選項將會被使用。因此,你的lwipopts.h可以重定義許多l(xiāng)wIP的行為
3.1 Module support (Code size)
你可以調(diào)整代碼的大小通過只編譯你想要的特性。如下列表給出了原裝lwIP編譯時支持的特性:
1. 默認(rèn)包含
- 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.默認(rèn)不包含的
- DHCP?(LWIP_DHCP)
- AUTOIP?(LWIP_AUTOIP)
- SNMP?(LWIP_SNMP)
- IGMP?(LWIP_IGMP)
- PPP?(PPP_SUPPORT)
如果你想要改變這些特性,你只需要設(shè)置其相關(guān)的選項。舉例,如果你想要失能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.內(nèi)存池
在一個嵌入式環(huán)境中,內(nèi)存池(memory?pools)使內(nèi)存的分配更加快速和高效。
lwIP提供一個靈活的方法來管理和組織內(nèi)存池。lwIP在數(shù)據(jù)段中保留了一個固定大小的靜態(tài)內(nèi)存,該內(nèi)存被分成各種池來保存各種數(shù)據(jù)結(jié)構(gòu)。
比如,一個內(nèi)存池專門為存放結(jié)構(gòu)體tcp_pcb,另一個內(nèi)存池專門為存放結(jié)構(gòu)體udp_pcb。
每個池可以被配置用來保存固定數(shù)目的數(shù)據(jù)結(jié)構(gòu),該數(shù)目的大小可以通過改變lwipopts.h文件里面定義的MEMP_NUM_*數(shù)值,比如,MEMP_NUM_TCP_PCB(控制tcp_pcb的數(shù)目)和MEMP_NUM_UDP_PCB(控制udp_pcb的數(shù)目)。
除了lwIP提供的標(biāo)準(zhǔn)內(nèi)存池,用戶還可以自定義內(nèi)存池。
3.2.2.Dynamic allocation:?mem_malloc
lwIP使用mem_malloc自定義函數(shù)來動態(tài)分配內(nèi)存,因此,改變lwIP如何使用RAM是方便的。如下提供了3種解決方案:
1).(默認(rèn))lwIP自定義基于堆的函數(shù)mem_malloc。默認(rèn),lwIP使用一個已分配的靜態(tài)內(nèi)存塊,像堆,來進(jìn)行內(nèi)存處理。使用MEM_SIZE可以改變lwIP堆的大小。
2).C標(biāo)準(zhǔn)庫中的malloc和free。如果你希望lwIP使用標(biāo)準(zhǔn)函數(shù)庫(由編譯器/架構(gòu)提供)來進(jìn)行內(nèi)存管理,那么你就要定義選項MEM_LIBC_MALLOC。
3).內(nèi)存池。lwIP可以仿真內(nèi)存的動態(tài)分配,通過使用custom?memory?pools(詳情請查看相關(guān)章節(jié))。如果要使用該解決方案則要包含了MEM_USE_POOLS和MEMP_USE_CUSTOM_POOLS選項和一個新的定制文件lwippools.h。
3.2.3.Understanding/changing memory usage?
lwIP使用內(nèi)存來:
- n?存放代碼(使用ROM還是RAM取決于你的系統(tǒng))
- n?靜態(tài)分配變量(一些有初始化,一些則沒有)
- n?任務(wù)的堆棧
- n?動態(tài)內(nèi)存分配:堆和memp內(nèi)存池
除非你使用C庫堆的實現(xiàn)(通過定義MEM_LIBC_MALLOC=1),否則已分配的動態(tài)內(nèi)存必須在其它地方靜態(tài)分配。
這意味著你要保留一定大小的內(nèi)存給堆(heap)或memp池使用,在運行時代碼會動態(tài)分配內(nèi)存。堆和memp池的大小可以被調(diào)整來減少RAM的使用:
- 有3種類型的pbufs:REF/ROM,RAM和POOL。POOL的大小由PBUF_POOL_SIZE*PBUF_POOL_BUFSIZE來決定。(TODO)
- RAM?pbufs在內(nèi)存中分配的大小由MEM_SIZE(該內(nèi)存并不經(jīng)常被使用,除了RAM?pbufs)決定。它在mem_memory中被分配。(TODO)
- REF/ROM?pbufs和pcbs還有其他一些stuff通過專用的內(nèi)存池并根據(jù)其結(jié)構(gòu)類型來分配大小。結(jié)構(gòu)體的數(shù)量由各種MEMP_NUM_*來定義??偟膩碚f,這個內(nèi)存被分配為memp_memory并且它包括了pbuf?POOL.(TODO)
然而,如果你在lwipopts.h文件里定義了MEMP_MEM_MALLOC的值為1,那么每一個動態(tài)分配的內(nèi)存都來自堆(heap)(該大小被MEM_SIZE定義)。如果你也定義了MEM_LIBC_MALLOC的值為1,則lwIP并不需要額外的內(nèi)存來動態(tài)分配內(nèi)存,使用C庫的堆就夠用了。然而,你還是要確保這個堆足夠大來運行你的應(yīng)用。為了調(diào)整各種MEMP_NUM_數(shù)值,你可以定義LWIP_STATS=1和LWIP_STATS_DISPLAY=1并且調(diào)用stats_display來查看每個池使用的具體情況(或者查看全局變量lwip_stats)。
3.3?Fine-tuning even more?
你可以打開lwip/src/include/lwip/opt.h文件來查看你可設(shè)置哪些選項。該文件注釋完整并且解釋了多少選項可以被使用。
?4.?lwIP code size
todo?
5.?Maximizing throughput
todo
6. Tuning TCP
todo?
7.?Custom memory pools
?todo
?
轉(zhuǎn)載于:https://www.cnblogs.com/smartjourneys/p/8214613.html
總結(jié)
以上是生活随笔為你收集整理的LwIP Application Developers Manual12---Configuring lwIP的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 求一个好听的召唤师名字
- 下一篇: SVN版本控制系统使用