lwIP 多线程注意事项
关于 lwIP 多线程的总结:
- lwIP 内核不是线程安全的。如果在多线程环境中使用 lwIP,必须使用高层次的
Sequential或socketAPI。使用rawAPI 时,需要自己保护好应用程序和协议栈核心代码。 - 在无操作系统环境中使用
rawAPI:- 使用轮询接收数据,因为不会在中断中使用 lwIP 函数,不需要任何保护
- 使用中断接收数据,需要定义宏
SYS_LIGHTWEIGHT_PROT来保护pbuf和内存分配相关代码。
- 套接字通常不能被多个应用线程使用,因为
UDP或TCP控制块不能在多个线程之间共享。(目前在 udp 、netconn 上可以执行sendto、recv操作。)
可以从 rawapi.txt 文档中看一下关于多线程描述的演进过程。
2002 年 10 月 19:
lwIP 提供 2 种应用编程接口(API),用于与 TCP/IP 代码通讯:Sequential API 和 RAW API。
对于 Sequential API,它提供了一种普通的、顺序的使用 lwIP 协议栈方法。它与 BSD 套接字 API非常相似。执行模型是基于 open - read - write - close 范式(注:顺序的由来)。由于 lwIP 协议栈本质上是基于事件的,因此 TCP/IP 内核代码和应用程序必须位于不同的线程中。
注:lwIP 版本大于等于 V0.5 才有 Sequential API。
注:
初始版本。
这是 lwIP 的洪荒年代,版本大概是 lwip-0.6,没有找到具体的版本日期,只能从已知的版本日期推测这个时候,还没有关于多线程的描述。
2004 年 10 月 18:
lwIP 提供 2 种 应用编程接口(API),用于与 TCP/IP 代码通讯:
- 低层次的
core、回调或rawAPI - 高层次的
SequentialAPI
对于 Sequential API,它提供了一种普通的、顺序的使用 lwIP 协议栈方法。它与 BSD 套接字 API非常相似。执行模型是基于阻塞 open - read - write - close 范式。由于 lwIP 协议栈本质上是基于事件的,因此 TCP/IP 内核代码和应用程序必须位于不同的线程中。
注:
本次更改的版本最早可以在 lwIP-1.1.0 中看到 。与初始版本相比,本质上没有改动,只是描述更加准确。
2009 年 5 月 7:
lwIP 提供 3 种 应用编程接口(API),用于与 TCP/IP 代码通讯:
- 低层次的
core、回调或rawAPI - 高层次的
SequentialAPI - BSD 风格的
socketAPI
对于 Sequential API,它提供了一种普通的、顺序的使用 lwIP 协议栈方法。它与 BSD 套接字 API非常相似。执行模型是基于阻塞 open - read - write - close 范式。由于 lwIP 协议栈本质上是基于事件的,因此 TCP/IP 内核代码和应用程序必须位于不同的线程中。
socket API 是一种与现有应用程序(指使用 BSD 标准 socket 编写的代码)兼容的 API,目前它是建立在 Sequential API之上的。socket API 提供在其它平台(比如 unix / windows)运行 socket API 所需的所有功能。但是,由于 Sequential API 的限制,可能存在与标准 BSD socket 不兼容问题,需要对现有程序进行少量修改。
线程
lwIP 最初仅针对单线程环境。在增加多线程功能时,并没有使内核线程安全,而是采用了另一种方法:用一个主线程(称为 tcpip_thread )运行 lwIP 内核。raw API 只能在此线程中使用。使用 Sequential 或 socket API 的应用程序线程通过 消息机制 与主线程通讯。
因此,可以从其它线程或 ISR(中断) 调用的函数列表非常有限!只有使用以下头文件中的 API 函数才是线程安全的:
- api.h
- netbuf.h
- netdb.h
- netifapi.h
- sockets.h
- sys.h
此外,在使用操作系统的情况下(NO_SYS=0),可以从多个线程(不是 ISR!)调用内存分配或释放函数,因为它们由 SYS_LIGHTWEIGHT_PROT 和信号量保护。
从 lwIP-1.3.0 开始,如果宏 SYS_LIGHTWEIGHT_PROT 和 LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT 都设置为 1,则可以从另一个线程或 ISR 调用 pbuf_free()。
注:
lwIP-1.3.0 发布于 2008 年 3 月 23,。
本次更改的版本最早可以在 lwIP-1.3.1 中看到。与 lwip-1.1.0 相比,最大的更新是
支持BSD 风格的socketAPI,以及对哪些文件是多线程安全的进行了文档化描述。关于文档化
lwIP 线程安全要求, 这是Kieran Mansley提出的一个任务(见task #6683),起始于 2007 年 3 月 26,直到 2009 年 5 月 7 ,由Simon Goldschmid在 rawapi.txt 中添加相关描述才结束。
2015 年 9 月 22
lwIP 提供 3 种 应用编程接口(API),用于与 TCP/IP 代码通讯:
- 低层次的
core、回调或rawAPI - 高层次的
SequentialAPI - BSD 风格的
socketAPI
对于 raw API(有时也称为 原生 API)是一种事件驱动的 API,在无操作系统的情况下,可以实现零拷贝发送和接收。
对于 Sequential API,它提供了一种普通的、顺序的使用 lwIP 协议栈方法。它与 BSD 套接字 API非常相似。执行模型是基于阻塞 open - read - write - close 范式。由于 lwIP 协议栈本质上是基于事件的,因此 TCP/IP 内核代码和应用程序必须位于不同的线程中。
socket API 是一种与现有应用程序(指使用 BSD 标准 socket 编写的代码)兼容的 API,目前它是建立在 Sequential API之上的。socket API 提供在其它平台(比如 unix / windows)运行 socket API 所需的所有功能。但是,由于 Sequential API 的限制,可能存在与标准 BSD socket 不兼容问题,需要对现有程序进行少量修改。
多线程
lwIP 最初仅针对单线程环境。在增加多线程功能时,并没有使内核线程安全,而是采用了另一种方法:用一个主线程(称为 tcpip_thread )运行 lwIP 内核。如果在多线程环境下使用 lwIP 协议栈,raw API 只能在 tcpip_thread 线程中使用,因为没有对 raw API 函数做并发访问保护(除了 pbuf 和内存管理之外)。使用 Sequential 或 socket API 的应用程序线程通过 消息机制 与主线程通讯。
因此,可以从其它线程或 ISR(中断) 调用的函数列表非常有限!只有使用以下头文件中的 API 函数才是线程安全的:
- api.h
- netbuf.h
- netdb.h
- netifapi.h
- pppapi.h
- sockets.h
- sys.h
此外,在使用操作系统的情况下(NO_SYS=0),可以从多个线程(不是 ISR!)调用内存分配或释放函数,因为它们由 SYS_LIGHTWEIGHT_PROT 和信号量保护。
Sequential 或 socket API 函数针对核心线程(tcpip_thread)是线程安全的,但是在控制块(control block)粒度上是不可重入的。也就是说,在没有适当锁定的情况下, UDP 或 TCP 控制块不能在多个线程之间共享。
如果宏 SYS_LIGHTWEIGHT_PROT 和 LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT 都设置为 1,则可以从另一个线程或 ISR 调用 pbuf_free()。
注:
本次更改的版本最早可以在 lwIP-2.0.0 中看到。
这是对 lwIP-1.3.1 相关文档的改进,描述更加准确。关于
多线程的注意事项也已经完备。后续关于多线程的描述被移动到了doxygen docs文档中,直到 lwIP-2.1.3 版本,也没有什么实质性更新。
相关文章:
lwIP 多线程注意事项
关于 lwIP 多线程的总结: lwIP 内核不是线程安全的。如果在多线程环境中使用 lwIP,必须使用高层次的 Sequential 或 socket API。使用 raw API 时,需要自己保护好应用程序和协议栈核心代码。在无操作系统环境中使用 raw API: 使用…...
工业革命的本质是动力革命:人类使用能量的水平得到了飞跃(蒸汽动力取代畜力和水力,机械代替人工。)【工业革命的诞生是能量富余的结果】
文章目录 引言I 用能量守恒方式看工业革命的影响1.1 中学物理能量守恒1.2 看清历史事件的影响1.3 工业革命的意义1.4 透过现象看本质的方法II 工业革命的本质2.1 动力革命2.2 多余的能量造就了工业革命引言 人类文明进步的目的是改善人们的生活,任何文明都以养活更多的人口为…...
【Kubernetes】Windows安装kubectl
准备开始 kubectl版本和集群版本之间的差异必须在一个小版本号内。 例如:v1.27版本的客户端能与 v1.26、 v1.27 和 v1.28 版本的控制面通信。 用最新兼容版的 kubectl 有助于避免不可预见的问题。 下载 官方安装文档: https://kubernetes.io/zh/docs/tasks/tools…...
菜鸟健身-新手使用哑铃锻炼手臂的动作与注意事项
目录 一、前言 二、哑铃锻炼手臂的好处 三、哑铃锻炼手臂的注意事项 四、哑铃锻炼手臂的基本动作 1. 哑铃弯举 2. 哑铃推举 3. 哑铃飞鸟 五、哑铃锻炼手臂的进阶动作 1. 哑铃侧平举 2. 哑铃俯身划船 六、哑铃锻炼手臂的训练计划 七、总结 一、前言 哑铃是一种非常…...
二、LLC 谐振变换器
半桥 LLC 谐振变换器主电路结构 如图所示,半桥 LLC 谐振变换器主电路可以分为四个部分,即:逆变网络、谐振网络、变压器及整流滤波网络。两个 MOSFET(S1、S2)以及它们的体二极管(D1、D2)和寄生电…...
JWT 入门
1.介绍 JSON Web Token(JWT)是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准。这个规范允许我们使用JWT在用户和服务器之间传递安全可靠的信息。该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO…...
理解HttpSession
什么是session 在我刚刚从事后端开发的时候,有一个问题困扰了我很久。 就有个玩意叫session。 PostMapping("login")public Result login(RequestParam("id") String id,RequestParam("password") String password, HttpSession se…...
SolVES 模型生态系统服务功能社会价值评估(基于多源环境QGIS、PostgreSQL、ArcGIS、Maxent、R语言)
查看原文>>>SolVES 模型生态系统服务功能社会价值评估(基于多源环境QGIS、PostgreSQL、ArcGIS、Maxent、R语言) 目录 第一章、理论基础与研究热点 第二章、SolVES 4.0 模型运行环境配置 第三章、SolVES 4.0 模型运行 第四章、数据获取与入…...
雷鸟Air Plus体验:视觉大幅升级,影视/办公/游戏全能胜任
雷鸟BirdBath系列XR眼镜一直保持着较快的迭代频率,如今迎来该系列第三款产品:雷鸟Air Plus,新品在视觉体验上得到大幅升级,不仅FOV达到49,边缘成像质量更高,搭配索尼旗舰级Micro OLED屏实现最高120Hz刷新率…...
【Android笔记101】Android之实现搜索界面(搜索弹出框)
这篇文章,主要介绍Android之实现搜索界面(搜索弹出框)。 目录 一、搜索弹出框 1.1、运行效果 1.2、搜索弹出框介绍 1.3、实现搜索弹出框功能...
架构中如何消除语义的分歧?
1、发现不同的语境 每一个交互场景其实都存在着多个角色,每个角色都有自己的独立语境。比如商家从供应商那里采购实体商品这个场景,就有它的独立语境。而商家给供应商打款,虽然交互双方没有变化,但是新的场景又会带来的语境。 我…...
「免费版Axure」原型设计工具!
Axure 是一款经典的原型设计工具,但需要下载电脑端软件使用,对新手要求较高,且在线协作效率低,使用成本较高。即时设计是一款免费在线原型设计工具,支持导入 Axure 文件进行二次布局、评审、演示和分享,让用…...
OPNET Modeler 例程——ALOHA和CSMA的性能对比
文章目录 概述一、创建 ALOHA 协议模型二、创建 CSMA 协议模型三、创建收信机进程和节点模型四、创建总线型链路模型五、创建网络模型六、查看仿真结果总结 概述 本例程以以太网为例论述总线型网络的建模方法,对数据链路层的 MAC 技术进行建模分析,并进…...
kali整体版本更新方法,为啥更新?
玩过kali都知道,如果不更新版本,那么安装某个软件总是有很多依赖版本问题,解决起来的确麻烦,这篇文章彻底解决这些问题。 1,更新源 国外源与国内源的选择 kali默认配置的是国外源,但国外源的下载速度非常慢…...
微服务之服务容错
Informal Essay By English Share a sentence that I think is very reasonable, as long as you can know the underlying logic of anything, you can hold it without fear 参考书籍: “凤凰架构” 引言 在 Martin Fowler 与 James Lewis合写的文章《Micros…...
js 计算日期加减、某某天后的日期、星期几、几月、闰年
需要引入jquery.js. Date.prototype.DateAdd function (strInterval, Number) { var dtTmp this; switch (strInterval) { case s: return new Date(Date.parse(dtTmp) (1000 * Number));// 秒 case n: return new Date(Date.pars…...
Vue3迎来升级,助力企业数字化转型
近年来,随着“互联网”的推进与应用普及,数字化转型已经成为企业发展的必备选项。低代码开发平台的迅速普及和广泛应用,也为企业数字化的转型提供了支撑技术。 JNPF快速开发平台深度集成java.net 6 双技术引擎,具备易维护、便部署…...
Java面试知识点(全)- Java并发- Java并发基础一
Java面试知识点(全) 导航: https://nanxiang.blog.csdn.net/article/details/130640392 注:随时更新 多线程解决什么问题 CPU、内存、I/O 设备的速度是有极大差异的,为了合理利用 CPU 的高性能,平衡这三者的速度差异,…...
淘宝商品详情数据采集,支持高并发请求
一、如何通过手动方式查看阿里巴巴商品详情页面的数据 1.淘宝天猫商品详情 API 接口(item_get - 获得淘宝商品详情接口),淘宝API 接口代码对接可以获取到宝贝 ID,宝贝标题,价格,优惠价,掌…...
Java版spring cloud 本工程项目管理系统源码-全面的工程项目管理
工程项目管理系统是指从事工程项目管理的企业(以下简称工程项目管理企业)受业主委托,按照合同约定,代表业主对工程项目的组织实施进行全过程或若干阶段的管理和服务。 如今建筑行业竞争激烈,内卷严重,…...
KubeSphere 容器平台高可用:环境搭建与可视化操作指南
Linux_k8s篇 欢迎来到Linux的世界,看笔记好好学多敲多打,每个人都是大神! 题目:KubeSphere 容器平台高可用:环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...
vue3 字体颜色设置的多种方式
在Vue 3中设置字体颜色可以通过多种方式实现,这取决于你是想在组件内部直接设置,还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法: 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...
页面渲染流程与性能优化
页面渲染流程与性能优化详解(完整版) 一、现代浏览器渲染流程(详细说明) 1. 构建DOM树 浏览器接收到HTML文档后,会逐步解析并构建DOM(Document Object Model)树。具体过程如下: (…...
【单片机期末】单片机系统设计
主要内容:系统状态机,系统时基,系统需求分析,系统构建,系统状态流图 一、题目要求 二、绘制系统状态流图 题目:根据上述描述绘制系统状态流图,注明状态转移条件及方向。 三、利用定时器产生时…...
Java入门学习详细版(一)
大家好,Java 学习是一个系统学习的过程,核心原则就是“理论 实践 坚持”,并且需循序渐进,不可过于着急,本篇文章推出的这份详细入门学习资料将带大家从零基础开始,逐步掌握 Java 的核心概念和编程技能。 …...
Element Plus 表单(el-form)中关于正整数输入的校验规则
目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入(联动)2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...
有限自动机到正规文法转换器v1.0
1 项目简介 这是一个功能强大的有限自动机(Finite Automaton, FA)到正规文法(Regular Grammar)转换器,它配备了一个直观且完整的图形用户界面,使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...
网站指纹识别
网站指纹识别 网站的最基本组成:服务器(操作系统)、中间件(web容器)、脚本语言、数据厍 为什么要了解这些?举个例子:发现了一个文件读取漏洞,我们需要读/etc/passwd,如…...
Python基于历史模拟方法实现投资组合风险管理的VaR与ES模型项目实战
说明:这是一个机器学习实战项目(附带数据代码文档),如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 在金融市场日益复杂和波动加剧的背景下,风险管理成为金融机构和个人投资者关注的核心议题之一。VaR&…...
七、数据库的完整性
七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...
