lwIP 多线程注意事项
关于 lwIP
多线程的总结:
- lwIP 内核不是线程安全的。如果在多线程环境中使用 lwIP,必须使用高层次的
Sequential
或socket
API。使用raw
API 时,需要自己保护好应用程序和协议栈核心代码。 - 在无操作系统环境中使用
raw
API:- 使用轮询接收数据,因为不会在中断中使用 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
、回调
或raw
API - 高层次的
Sequential
API
对于 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
、回调
或raw
API - 高层次的
Sequential
API - BSD 风格的
socket
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 内核。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 风格的socket
API,以及对哪些文件是多线程安全的
进行了文档化描述。关于文档化
lwIP 线程安全要求
, 这是Kieran Mansley
提出的一个任务(见task #6683),起始于 2007 年 3 月 26,直到 2009 年 5 月 7 ,由Simon Goldschmid
在 rawapi.txt 中添加相关描述才结束。
2015 年 9 月 22
lwIP 提供 3 种 应用编程接口(API),用于与 TCP/IP 代码通讯:
- 低层次的
core
、回调
或raw
API - 高层次的
Sequential
API - BSD 风格的
socket
API
对于 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 本工程项目管理系统源码-全面的工程项目管理
工程项目管理系统是指从事工程项目管理的企业(以下简称工程项目管理企业)受业主委托,按照合同约定,代表业主对工程项目的组织实施进行全过程或若干阶段的管理和服务。 如今建筑行业竞争激烈,内卷严重,…...

DAY43 复习日
浙大疏锦行-CSDN博客 kaggle找到一个图像数据集,用cnn网络进行训练并且用grad-cam做可视化 进阶:把项目拆分成多个文件 src/config.py: 用于存放项目配置,例如文件路径、学习率、批次大小等。 # src/config.py# Paths DATA_DIR "data…...

jenkins gerrit-trigger插件配置
插件gerrit-trigger下载好之后要在Manage Jenkins -->Gerrit Trigger-->New Server 中新增Gerrit Servers 配置好保存后点击“状态”查看是否正常...

TDengine 开发指南——无模式写入
简介 在物联网应用中,为了实现自动化管理、业务分析和设备监控等多种功能,通常需要采集大量的数据项。然而,由于应用逻辑的版本升级和设备自身的硬件调整等原因,数据采集项可能会频繁发生变化。为了应对这种挑战,TDen…...
青少年编程与数学 01-011 系统软件简介 03 NetWare操作系统
青少年编程与数学 01-011 系统软件简介 03 NetWare操作系统 一、历史背景二、核心架构三、关键功能四、管理工具五、客户端支持六、版本演变七、衰落原因八、遗产与影响总结 摘要:NetWare 是早期网络操作系统的巅峰之作,其高性能文件服务、目录管理和容错…...
录制mp4
目录 单线程保存mp4 多线程保存mp4 rtsp ffmpeg录制mp4 单线程保存mp4 import cv2 import imageiocv2.namedWindow(photo, 0) # 0窗口大小可以任意拖动,1自适应 cv2.resizeWindow(photo, 1280, 720) url "rtsp://admin:aa123456192.168.1.64/h264/ch1/main…...

GOOUUU ESP32-S3-CAM 果云科技开发板开发指南(一)(超详细!)Vscode+espidf 通过摄像头拍摄照片并存取到SD卡中,文末附源码
看到最近好玩的开源项目比较多,就想要学习一下esp32的开发,目前使用比较多的ide基本上是arduino、esp-idf和platformio,前者编译比较慢,后两者看到开源大佬的项目做的比较多,所以主要学习后两者。 本次使用的硬件是GO…...

【软件工具】批量OCR指定区域图片自动识别内容重命名软件使用教程及注意事项
批量OCR指定区域图片自动识别内容重命名软件使用教程及注意事项 1、操作步骤1-5: 安装与启动:安装成功后,在桌面或开始菜单找到软件图标,双击启动。 导入图片:进入软件主界面,点击 “导入图片” 按钮&a…...

Linux 系统、代码与服务器进阶知识深度解析
在数字化时代,Linux 系统凭借其开源、稳定、安全的特性,成为服务器领域和软件开发的核心支柱。除了算法优化技巧,Linux 系统在网络服务、容器化技术、服务器安全等方面也蕴含着丰富的知识和实用技术。接下来,我们将深入探讨这些领…...
打卡第47天
作业:对比不同卷积层热图可视化的结果 核心差异总结 浅层卷积层(如第 1-3 层) 关注细节:聚焦输入图像的边缘、纹理、颜色块等基础特征(例:猫脸的胡须边缘、树叶的脉络)。热图特点:区…...
使用 Windows 完成 iOS 应用上架:Appuploader对比其他证书与上传方案
iOS 应用上架流程对很多开发者来说都是一道复杂关卡,特别是当你并不使用 Mac 电脑时。虽然 Apple 一直强调使用其原生工具链(Xcode 和 Transporter),但现实是大量开发者正在寻找更灵活的替代方案。 今天我将从证书申请和 IPA 上传…...