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 本工程项目管理系统源码-全面的工程项目管理
工程项目管理系统是指从事工程项目管理的企业(以下简称工程项目管理企业)受业主委托,按照合同约定,代表业主对工程项目的组织实施进行全过程或若干阶段的管理和服务。 如今建筑行业竞争激烈,内卷严重,…...
智慧医疗能源事业线深度画像分析(上)
引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...
Objective-C常用命名规范总结
【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名(Class Name)2.协议名(Protocol Name)3.方法名(Method Name)4.属性名(Property Name)5.局部变量/实例变量(Local / Instance Variables&…...
视频字幕质量评估的大规模细粒度基准
大家读完觉得有帮助记得关注和点赞!!! 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用,因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型(VLMs)在字幕生成方面…...
Robots.txt 文件
什么是robots.txt? robots.txt 是一个位于网站根目录下的文本文件(如:https://example.com/robots.txt),它用于指导网络爬虫(如搜索引擎的蜘蛛程序)如何抓取该网站的内容。这个文件遵循 Robots…...
令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍
文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结: 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析: 实际业务去理解体会统一注…...
IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)
文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...
用docker来安装部署freeswitch记录
今天刚才测试一个callcenter的项目,所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...
select、poll、epoll 与 Reactor 模式
在高并发网络编程领域,高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表,以及基于它们实现的 Reactor 模式,为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。 一、I…...
【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分
一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计,提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合:各模块职责清晰,便于独立开发…...
C++.OpenGL (20/64)混合(Blending)
混合(Blending) 透明效果核心原理 #mermaid-svg-SWG0UzVfJms7Sm3e {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-icon{fill:#552222;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-text{fill…...
