STM32以太网通信-LWIP简介

这篇具有很好参考价值的文章主要介绍了STM32以太网通信-LWIP简介。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

LwIP全名:Light weight IP,意思是轻量化的TCP/IP协议,是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。

LwIP的设计初衷是:用少量的资源消耗实现一个较为完整的TCP/IP协议栈,其中“完整”主要指的是TCP协议的完整性,实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。此外LwIP既可以移植到操作系统上运行,也可以在无操作系统的情况下独立运行。

LwIP具有主要特性
1.支持ARP协议(以太网地址解析协议)。
2.支持ICMP协议(控制报文协议),用于网络的调试与维护。
3.支持IGMP协议(互联网组管理协议),可以实现多播数据的接收。
4.支持UDP协议(用户数据报协议)。
5.支持TCP协议(传输控制协议),包括阻塞控制、RTT 估算、快速恢复和快速转发。
6.支持PPP协议(点对点通信协议),支持PPPoE。
7.支持DNS(域名解析)。
8.支持DHCP协议,动态分配IP地址。
9.支持IP协议,包括IPv4、IPv6协议,支持IP分片与重装功能,多网络接口下的数据包转发。
10.支持SNMP协议(简单网络管理协议)。
11.支持AUTOIP,自动IP地址配置。
12.提供专门的内部回调接口(Raw API),用于提高应用程序性能。
13.提供可选择的Socket API、NETCONN API (在多线程情况下使用) 。

stm32tcpip,stm32,网络,tcp/ip,单片机

LwIP 内核是由一系列模块组合而成,这些模块包括:TCP/IP协议栈的各种协议、内存管理模块、数据包管理模块、网卡管理模块、网卡接口模块、基础功能模块、API模块。每个模块是由相关的几个源文件和头文件组成的,通过头文件对外声明一些函数、宏、数据类型。使得其他模块可以方便的调用次模块的功能。

LwIP 本质是对数据的处理,其中也使用了大量的数据结构。

LwIP的三种编程接口
LwIP提供了三种编程接口,分别为 RAW/Callback API、Netconn API、Socket API。他们的易用性从左到右依次提高,而执行效率从左到右依次降低,用户可以根据实际情况,平衡利弊,选择合适的API进行网络应用程序的开发。以下内容将分别介绍这三种API。

1. RAW/Callback API
RAW/Callback API是指内核回调型的API,这在许多通信协议的C语言实现中都有所应用。

RAW/Callback API是LwIP的一大特色,在没有操作系统支持的裸机环境中,只能使用这种API进行开发,同时这种API也可以用在操作系统环境中。

"回调"概念:新建立一个TCP或UDP连接,你想等它接收到数据以后去处理它们,这时你需要把处理该数据的操作封装成为一个函数,然后将这个函数的指针注册到LwIP内核中。LwIP内核会在需要的时候去检测该函数是否收到数据,如果接收到数据,内核会在第一时间调用注册的函数,这个过程成为“回调”。这个注册函数被称为“回调函数”。

这个回调函数中装着你想要的业务逻辑,在这个函数中,你可以自由地处理接收到的数据,也可以发送任何数据,也就是说,这个回调函数就是你的应用程序。

在回调编程中,LwIP内核把数据交给应用程序的过程就只是一次简单的函数调用,这是非常节省时间和空间资源的。每一个回调函数实际上只是一个普通的C函数,这个函数在TCP/IP内核中被调用。每一个回调函数都作为一个参数传递给当前TCP或UDP连接。而且,为了能够保存程序的特定状态,可以向回调函数传递一个指定的状态,并且这个指定的状态是独立于TCP/IP协议栈的。

2. NETCONN API
在操作系统中,可以使用 Netconn API 或者 Socket API 编程进行网络应用程序开发。NETCONN API是基于操作系统的IPC机制(即信号量和邮箱机制)实现的,它的设计将LwIP内核代码和网络应用程序分离成了独立的线程。如此一来,LwIP内核线程就只负责数据包的TCP/IP封装和拆封,而不用进行数据的应用层处理,大大提高了系统对网络数据包的处理效率。

在操作系统环境中,LwIP内核会被实现为一个独立的线程,名为tcpip_thread,使用NETCONN API或者Socket API的应用程序处在不同的线程中,我们可以根据任务的重要性,分配不同的优先级给这些线程,从而保证重要任务的时效性,分配优先级的原则具体如下:

stm32tcpip,stm32,网络,tcp/ip,单片机

NETCONN API使用了操作系统的IPC机制,对网络连接进行了抽象,用户可以像操作文件一样操作网络连接(打开/关闭、读/写数据)。但是NETCONN API并不如操作文件的API那样简单易用。

举个例子,调用f_read函数读文件时,读到的数据会被放在一个用户指定的数组中,用户操作起来很方便,而NETCONN API的读数据API,就没有那么人性化了。用户获得的不是一个数组,而是一个特殊的数据结构netbuf,用户如果想使用好它,就需要对内核的pbuf和netbuf结构体有所了解,我们会在后续的章节中对它们进行讲解。

NETCONN API之所以采取这种不人性的设计,是为了避免数据包在内核程序和应用程序之间发生拷贝,从而降低程序运行效率。当然,用户如果不在意数据递交时的效率问题,也可以把netbuf中的数据取出来拷贝到一个数组中,然后去处理这个数组。

3. Socket API
Socket 即套接字,它对网络连接进行了高级的抽象,使得用户可以像操作文件一样操作网络连接,它十分易用,许多网络开发人员最早接触的就是 Socket 编程,Socket 已经成为了网络编程的标准。

相较于NETCONN API, Socket API具有更好的易用性。使用Socket API编写的程序可读性好,便于维护,也便于移植到其它的系统中。Socket API在内核程序和应用程序之间存在数据的拷贝,这会降低数据递交的效率。另外,LwIP的Socket API是基于NETCONN API实现的,所以效率上相较前者要打个折扣。文章来源地址https://www.toymoban.com/news/detail-725250.html

到了这里,关于STM32以太网通信-LWIP简介的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【STM32F1】以太网通信之UDP/TCP实验

    在本实验中,开发板主控芯片通过 SPI 接口与 CH395Q 以太网芯片进行通讯,从而完成对 CH395Q 以太网芯片的功能配置、数据接收等功能,同时将 CH395Q 以太网芯片的 Socket0 配 置为 UDP 模式,并可通过按键发送 UDP 广播数据至其他的 UDP 客户端,也能够接收其他 UDP 客户端广播的数

    2024年02月07日
    浏览(20)
  • STM32CubeMX+STM32F407+FreeRTos+LAN8720 以太网通信实现数据收发功能

    目录 前言 一、STM32CubeMX配置 二、修改代码 三、硬件测试 总结 该工程应用的以太网芯片是LAN8720,代码是基于STM32CUbeMx6.2.1配置生成的,在CubeMx中配置了ETH和LWIP,还有串口1和FREERTOS,最后通过创建任务函数实现udp的以太网数据收发功能。在测试中,可以在电脑的DOS窗口ping通在

    2024年02月08日
    浏览(26)
  • STMicroelectronics的STM32微控制器和WIZnet的W5500以太网通信单片机代码

    单片机代码   #include \\\"stm32f1xx_hal.h\\\" #include \\\"string.h\\\"   #define W5500_CS_GPIO_Port GPIOB #define W5500_CS_Pin GPIO_PIN_12   SPI_HandleTypeDef hspi2;   void SystemClock_Config(void); static void MX_GPIO_Init(void); static void MX_SPI2_Init(void);   uint8_t W5500_ReadByte(void) {     uint8_t byte;     HAL_SPI_Receive(hspi2, byte, 1, 10);  

    2023年04月13日
    浏览(48)
  • STM32的以太网外设+PHY(LAN8720)使用详解(6):以太网数据接收及发送

    1.1.1 检查是否接收到一帧完整报文 使用轮询的方式接收以太网数据是一种简单但是效率低下的方法,为了保证及时处理以太网数据我们需要在主循环内高频轮询是否接收到了以太网数据。轮询的函数为ETH_CheckFrameReceived,内容如下: 当以太网帧大于我们设置的DMA描述符buffer大

    2024年01月23日
    浏览(19)
  • STM32以太网接口的配置和使用方法详解

    STM32 微控制器提供了多种系列和型号,不同型号的芯片可能有不同的以太网接口,包括MAC(媒体访问控制器)和PHY(物理层接口)等组件。 在这里,我们以STM32F4系列为例来详细介绍以太网接口的配置和使用方法。 ✅作者简介:热爱科研的嵌入式开发者,修心和技术同步精进

    2024年04月26日
    浏览(14)
  • STM32H723配置以太网+Freertos注意事项

    由于STM32H743涨价到300元以上,项目换用了Pin2Pin替换的STM32H723,看上去cpu运行速度快了20%达到550Mhz。 但是内存布局存在很大不一样,而且ST官方代码库升级迭代快,要手动修改地方每个版本不一样,在有H743的经验下,花了2天时间搞好了记录一下。很多信息来源于英文ST支持论

    2023年04月18日
    浏览(14)
  • 【AUTOSAR】【以太网】TCPIP

    目录 一、概述 二、约束和假设 三、依赖模块 3.1 EthIf 3.2 EthSM 3.3 SoAd 3.4 Ke

    2024年02月05日
    浏览(14)
  • STM32的以太网外设+PHY(LAN8720)使用详解(2):硬件设计

    在LAN8720上电或复位时会读取一些特定引脚的电平,根据电平来进行硬件配置。LAN8720的引脚分布如下: 注意,LAN8720有些引脚内部自带上/下拉,定义如下: LAN8720的PHYAD[0]用来配置PHY地址的bit0,当接入了多个PHY时可以用来区分不同的PHY。该引脚自带内部下拉,同时我们也只用到

    2024年04月14日
    浏览(18)
  • STM32+RTThread配置以太网无法ping通,无法获取动态ip的问题

    记录一个非常蠢的问题,今天在移植rtthread的以太网驱动的时候出现无法获取动态ip的问题,问题如下: 设置为动态ip时不管是连接路由器还是电脑主机都无法ping通,也无法获取dns地址。 设置为静态ip时无法ping通主机。 使用wireshark抓包,源码debug以及各种方法尝试半天后依然

    2024年02月10日
    浏览(16)
  • STM32F407以太网DMA描述符和数据链路层收发数据

    本文主要介绍STM32F407单片机MAC内核的DMA描述符,以及如何实现以太网二层的数据收发。这一篇先实现数据链路层的正常收发,下一篇再去介绍如何把LWIP移植到单片机上。大部分资料都是把LWIP移植和以太网卡驱动放在一起介绍,对新手不友好。所以我在这篇文章先把网卡驱动

    2024年02月10日
    浏览(13)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包