[开发资料] 在单片机上运行Lwip!

[复制链接]
1578|7
 楼主| szt1993 发表于 2024-3-26 15:00 | 显示全部楼层 |阅读模式
1、最近项目遇到的问题   
[color=rgba(0, 0, 0, 0.9)]最近在stm32上用cubemax移植了lwip协议栈,lwip就不用过多介绍了,(lightweight IP)一款轻量级的开源TCP/IP协议栈,专为嵌入式系统设计,具有小巧高效、可裁剪性强,主要是已经发展和广泛应用多年,可靠性还是可以的,基本上大多数嵌入式系统的网络通信需求都可以满足。
[color=rgba(0, 0, 0, 0.9)]然而最近项目中通信数据量大一点,老是send超时,运行时间久了还会直接挂在ethnetif_input,这可把我给整郁闷了。
[color=rgba(0, 0, 0, 0.9)]最后定位到原因还是lwip适配的两个线程优先级分配得有问题,导致FreeRTOS信号量超时异常。
2、两个主要线程
[color=rgba(0, 0, 0, 0.9)]在lwIP协议栈中,ethernetif_input线程和tcpip协议栈线程是两个核心的线程,在处理网络数据包和执行TCP/IP协议栈功能时的作用就不用多说了,下面简单的介绍下两个线程的作用:
  • ethernetif_input线程:

    • ethernetif_input线程负责接收来自网络接口(如以太网接口)的数据包,并将其传递给lwIP协议栈进行处理。
    • 这个线程通常运行在较低的优先级,因为它主要负责接收和缓存数据包,而不涉及复杂的协议处理。
    • 在实际应用中,可以根据系统的需求和性能进行调整,但通常情况下,ethernetif_input线程的优先级相对较低。

  • tcpip协议栈线程:

    • tcpip协议栈线程是lwIP协议栈的核心线程,负责处理TCP/IP协议栈的各种功能,包括TCP连接管理、IP数据报的路由和转发、以及UDP数据包的处理等。
    • 由于tcpip协议栈线程需要处理复杂的协议逻辑和数据包处理,因此它通常运行在较高的优先级。
    • 保持tcpip协议栈线程的较高优先级有助于确保网络数据包的及时处理和协议栈功能的高效执行。

[color=rgba(0, 0, 0, 0.9)]在实际的嵌入式系统设计中,需要根据具体的硬件平台和应用场景来合理设置这两个线程的优先级。通常情况下,可以通过操作系统或者裸机编程的方式来配置线程的优先级,以满足系统对网络数据处理和协议栈功能的实时性和效率要求。
3、总 结   
[color=rgba(0, 0, 0, 0.9)]所以通常情况下,tcpip协议栈线程的优先级需要设置得更高,因为tcpip协议栈线程需要处理复杂的协议逻辑、数据包处理、连接管理等任务,保持tcpip协议栈线程的较高优先级可以确保网络数据包的及时处理和协议栈功能的高效执行,从而提高系统的响应速度和网络通信的稳定性。
[color=rgba(0, 0, 0, 0.9)]ethernetif_input线程通常负责接收和缓存数据包,相对来说不涉及太多复杂的处理逻辑,因此可以设置相对较低的优先级。
经过优先级调整后,跑了2天都没有出现异常问题。
中国龙芯CDX 发表于 2024-4-10 13:52 | 显示全部楼层
tcpip协议栈线程的优先级需要设置得更高,因为tcpip协议栈线程需要处理复杂的协议逻辑、数据包处理、连接管理等任务,保持tcpip协议栈线程的较高优先级可以确保网络数据包的及时处理和协议栈功能的高效执行,从而提高系统的响应速度和网络通信的稳定性。
小夏天的大西瓜 发表于 2024-4-10 13:54 | 显示全部楼层
lwip一款轻量级的开源TCP/IP协议栈,专为嵌入式系统设计,具有小巧高效、可裁剪性强,主要是已经发展和广泛应用多年,可靠性还是可以的,基本上大多数嵌入式系统的网络通信需求都可以满足
jf101 发表于 2024-4-14 14:45 | 显示全部楼层
lwip专为嵌入式系统设计款轻量级的开源TCP/IP协议栈
小小蚂蚁举千斤 发表于 2024-4-15 09:56 | 显示全部楼层
单片机上运行Lwip是以太网上的IP通信的一种实用方式
OKAKAKO 发表于 2024-4-19 18:45 | 显示全部楼层
Lwip是开源TCP/IP协议栈,专为嵌入式系统设计,具有小巧高效、可裁剪性强
星辰大海不退缩 发表于 2024-4-21 12:21 | 显示全部楼层
在lwIP协议栈中,ethernetif_input线程和tcpip协议栈线程是两个核心的线程,有处理网络数据包和执行TCP/IP协议栈功能
xiaohuihuiya 发表于 2024-8-16 19:19 | 显示全部楼层
想问下有遇到过数据发送失败的情况吗,我这个很容易遇到,发送失败的问题。老是出现在这个low_level_output()函数中的这个位置,一直处于被DMA持有。
if((DmaTxDesc->Status & ETH_DMATXDESC_OWN) != (uint32_t)RESET)
  {
    errval = ERR_USE;
    errortimeout++;
    goto error;
  }
您需要登录后才可以回帖 登录 | 注册

本版积分规则

351

主题

3039

帖子

6

粉丝
快速回复 在线客服 返回列表 返回顶部