当前位置: 首页 > 编程日记 > 正文

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

相关文章:

仿斗鱼聊天:基于CoreText的面向对象图文排版工具AWRichText

AWRichText 基于CoreText,面向对象,极简,易用,高效,支持精确点击,UIView混排,GIF动图,并不仅仅局限于图文混排的富文本排版神器。 代码地址:https://github.com/hardman/…

搭建nexus后,进入首页的时候出现warning: Could not connect to Nexus.错误

nexus出现这种问题,一般是版本太旧,换一个高版本的nexus就能解决了。 转载于:https://www.cnblogs.com/tietazhan/p/5459393.html

微软hackathon_武汉Hackathon的黑客之路–开发人员如何抗击COVID-19

微软hackathonThe Chinese New Year in 2020 was one of the saddest Chinese New Years in recent memory. After the sudden outbreak of the COVID-19 virus, the city pressed pause on all celebrations.2020年的农历新年是最近记忆中最可悲的农历新年之一。 在COVID-19病…

SVN版本控制系统使用

一.版本控制系统安装: 软件下载地址:https://www.visualsvn.com/downloads/ 二.安装版本控制系统以后,在window下,设置环境变量。 三.在命令提示符控制台查看服务器版本:svn --version 四.创建仓库:F:\DevR…

iOS的KVO实现剖析

KVO原理 对于KVO的原理,很多人都比较清楚了。大概是这样子的: 假定我们自己的类是Object和它的对象 obj, 当obj发送addObserverForKeypath:keypath消息后,系统会做3件事情: 动态创建一个Object的子类,名…

你真的以为了解java.io吗 呕心沥血 绝对干货 别把我移出首页了

文章结构1 flush的使用场景2 一个java字节流,inputstream 和 outputstream的简单例子3 分别测试了可能抛出java.io.FileNotFoundException,java.io.FileNotFoundException: test (拒绝访问。),java.io.FileNotFoundException: test.txt (系统…

GitHub为所有人免费提供了所有核心功能-这就是您应该关心的原因

Just a couple of days ago, GitHub wrote a blog article stating that it is now free for teams. Heres the official blog article if youre interested. 就在几天前,GitHub写了一篇博客文章,指出它现在对团队免费。 如果您有兴趣,这是官…

什么是ObjCTypes?

先看一下消息转发流程: 在forwardInvocation这一步,你必须要实现一个方法: - (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector OBJC_SWIFT_UNAVAILABLE(""); 该方法用于说明消息的返回值和参数类型。NSMethodSignature是方法签名&#x…

0基础JavaScript入门教程(一)认识代码

1. 环境: JavaScript简称js,后续我们将使用js来代替JavaScript。 认识代码前,需要安装js代码运行环境。 安装nodejs:在https://nodejs.org/zh-cn/ 下载LTS版本,然后安装安装visual studio code:https://…

junit、hamcrest、eclemma的安装与使用

1、junit的安装与使用 1.1 安装步骤 1)从http://www.junit.org/ 下载junit相应的jar包; 2) 在CLASSPATH中加入JAR包所在的路径,如E:\Java\jar\junit\junit-4.10.jar; 3) 将junit-4.10.jar加入到项目的lib文…

如何撰写将赢得客户青睐的自由职业者提案和免费模板

Your prospective client asks you to provide them with a quote. So you just send them the quote, right?您的潜在客户要求您提供报价。 所以您只给他们发送报价吧? Wrong.错误。 If you did, you would be missing out on a massive opportunity here.如果这…

2. 把一幅图像进行平移。

实验二 #include "cv.h" #include<stdio.h> #include "highgui.h" IplImage *PingYi(IplImage *src, int h0, int w0); int main(int argc, char** argv) {IplImage* pImg; //声明IplImage指针IplImage* pImgAfterMove;pImg cvLoadImage("601…

后台的代理nginx部署方法

软件包如下&#xff1a;nginx-1.10.0.tar.gznginx-http-concat-master.zipngx_cache_purge-2.3.tar.gzopenssl-1.0.2h.tar.gzpcre-8.39.tar.gzzlib-1.2.8.tar.gz ngin部署方法&#xff1a;上面的安装包都存放在/apps/svr/soft目录下:cd /apps/svr/softtar -zxf nginx-1.10.0.ta…

iOS中你可能没有完全弄清楚的(一)synthesize

1. 什么是synthesize synthesize中文意思是合成&#xff0c;代码中我们经常这样用。 interface Test: NSObject property (nonatomic, unsafe_unretained) int i; endimplementation Test synthesize i; end 复制代码 使用synthesize的2个步骤&#xff1a; 首先你要有在类声…

framer x使用教程_如何使用Framer Motion将交互式动画和页面过渡添加到Next.js Web应用程序

framer x使用教程The web is vast and its full of static websites and apps. But just because those apps are static, it doesnt mean they have to be boring. 网络非常庞大&#xff0c;到处都是静态的网站和应用。 但是&#xff0c;仅仅因为这些应用程序是静态的&#xf…

POJ 2429

思路&#xff1a;a/n*b/nlcm/gcd 所以这道题就是分解ans.dfs枚举每种素数情况。套Miller_Rabin和pollard_rho模板 1 //#pragma comment(linker, "/STACK:167772160")//手动扩栈~~~~hdu 用c交2 #include<cstdio>3 #include<cstring>4 #include<cstdlib…

iOS中你可能没有完全弄清楚的(二)自己实现一个KVO源码及解析

前几天写了一篇blog&#xff08;点这里&#xff09;&#xff0c;分析了系统KVO可能的实现方式。并添加了简单代码验证。 既然系统KVO不好用&#xff0c;我们完全可以根据之前的思路&#xff0c;再造一个可以在项目中使用的KVO的轮子。 代码已经上传到github: https://github.…

js中的preventDefault与stopPropagation详解

1. preventDefault: 比如<a href"http://www.baidu.com">百度</a>,这是html中最基础的东西&#xff0c;起的作用就是点击百度链接到http://www.baidu.com,这是属于<a>标签的默认行为;preventDefault方法就是可以阻止它的默认行为的发生而发生其他…

angular过滤字符_如何使用Angular和Azure计算机视觉创建光学字符读取器

angular过滤字符介绍 (Introduction) In this article, we will create an optical character recognition (OCR) application using Angular and the Azure Computer Vision Cognitive Service. 在本文中&#xff0c;我们将使用Angular和Azure计算机视觉认知服务创建一个光学字…

javascript函数全解

0.0 概述 本文总结了js中函数相关的大部分用法&#xff0c;对函数用法不是特别清晰的同学可以了解一下。 1.0 简介 同其他语言不同的是&#xff0c;js中的函数有2种含义。 普通函数&#xff1a;同其他语言的函数一样&#xff0c;是用于封装语句块&#xff0c;执行多行语句的…

MYSQL explain详解[转载]

explain显示了mysql如何使用索引来处理select语句以及连接表。可以帮助选择更好的索引和写出更优化的查询语句。 虽然这篇文章我写的很长&#xff0c;但看起来真的不会困啊&#xff0c;真的都是干货啊&#xff01;&#xff01;&#xff01;&#xff01; 先解析一条sql语句&…

CodeForces 157A Game Outcome

A. Game Outcometime limit per test2 secondsmemory limit per test256 megabytesinputstandard inputoutputstandard outputSherlock Holmes and Dr. Watson played some game on a checkered board n  n in size. During the game they put numbers on the boards squares…

我使用Python和Django在自己的网站上建立了一个会员专区。 这是我学到的东西。

I decided it was time to upgrade my personal website in order to allow visitors to buy and access my courses through a new portal. 我认为是时候升级我的个人网站了&#xff0c;以允许访问者通过新的门户购买和访问我的课程 。 Specifically, I wanted a place for v…

详解AFNetworking的HTTPS模块

0.0 简述 文章内容包括&#xff1a; AFNetworking简介ATS和HTTPS介绍AF中的证书验证介绍如何创建服务端和客户端自签名证书如何创建简单的https服务器对CA正式证书和自签名证书的各种情况进行代码验证 文中所涉及的文件和脚本代码请看这里。 1.0 AFNetworking简介 AFNetwo…

字符串专题:map POJ 1002

第一次用到是在‘校内赛总结’扫地那道题里面&#xff0c;大同小异 map<string,int>str 可以专用做做字符串的匹配之类的处理 string donser; str [donser] 自动存donser到map并且值加一&#xff0c;如果发现重复元素不新建直接加一&#xff0c; map第一个参数是key&…

【洛谷P1508】吃吃吃

题目背景 问世间&#xff0c;青春期为何物&#xff1f; 答曰&#xff1a;“甲亢&#xff0c;甲亢&#xff0c;再甲亢&#xff1b;挨饿&#xff0c;挨饿&#xff0c;再挨饿&#xff01;” 题目描述 正处在某一特定时期之中的李大水牛由于消化系统比较发达&#xff0c;最近一直处…

前端和后端开发人员比例_前端开发人员vs后端开发人员–实践中的定义和含义

前端和后端开发人员比例Websites and applications are complex! Buttons and images are just the tip of the iceberg. With this kind of complexity, you need people to manage it, but which parts are the front end developers and back end developers responsible fo…

Linux 创建子进程执行任务

Linux 操作系统紧紧依赖进程创建来满足用户的需求。例如&#xff0c;只要用户输入一条命令&#xff0c;shell 进程就创建一个新进程&#xff0c;新进程运行 shell 的另一个拷贝并执行用户输入的命令。Linux 系统中通过 fork/vfork 系统调用来创建新进程。本文将介绍如何使用 fo…

metasploit-smb扫描获取系统信息

1.msfconsle 2.use auxiliary/scanner/smb/smb_version 3. msf auxiliary(smb_version) > set RHOSTS 172.16.62.1-200RHOSTS > 172.16.62.1-200msf auxiliary(smb_version) > set THREADS 100THREADS > 100msf auxiliary(smb_version) > run 4.扫描结果&#x…

算法(1)斐波那契数列

1.0 问题描述 实现斐波那契数列&#xff0c;求第N项的值 2.0 问题分析 斐波那契数列最简单的方法是使用递归&#xff0c;递归和查表法同时使用&#xff0c;可以降低复杂度。根据数列特点&#xff0c;同时进行计算的数值其实只有3个&#xff0c;所以可以使用3个变量循环递进计…