启用LWIP锁定以解决ESP8266快速传输TCP数据包时的崩溃问题

💡 原文英文,约500词,阅读约需2分钟。
📝

内容提要

为解决ESP8266在快速数据传输时的崩溃问题,优化了LWIP配置和SPI闪存读写,调整了线程优先级,并改进了TCP数据包处理。通过使用LWIP_TCPIP_CORE_LOCKING避免函数重入,成功解决了崩溃问题,确保了TCP通信速度。

🎯

关键要点

  • 为了解决ESP8266在快速数据传输时的崩溃问题,优化了LWIP配置和SPI闪存读写。
  • 调整了主线程和LWIP线程的优先级,确保主线程优先级高于LWIP线程。
  • TCP数据包处理状态机进行了优化,单个1200字节数据包的发送和接收时间约为40毫秒。
  • 在进行网页测试时,ESP8266崩溃并重启,报告了LoadProhibited错误。
  • 崩溃的原因是seg、useg及其tcp头部为NULL,导致tcp_write_checks函数失败。
  • 通过分析发现pcb->unacked在函数调用中未被改变,可能是由于线程不安全导致的重入问题。
  • LWIP线程和HTTP服务器线程同时调用tcp_output函数,导致了崩溃。
  • 为避免函数重入,决定使用LWIP_TCPIP_CORE_LOCKING特性。
  • 在lwipopt.h文件中定义了LWIP_TCPIP_CORE_LOCKING,并在主线程中添加了锁定和解锁操作。
  • 解决了内核崩溃问题,TCP通信速度满足256kb/s的带宽需求。

延伸问答

ESP8266崩溃的主要原因是什么?

ESP8266崩溃的主要原因是tcp_write_checks函数中的seg、useg及其tcp头部为NULL,导致函数失败。

如何优化LWIP配置以解决ESP8266崩溃问题?

通过定义LWIP_TCPIP_CORE_LOCKING,调整线程优先级,并在主线程中添加锁定和解锁操作来优化LWIP配置。

ESP8266的TCP数据包处理速度是多少?

单个1200字节数据包的发送和接收时间约为40毫秒。

在ESP8266中,如何确保主线程优先级高于LWIP线程?

通过调整主线程和LWIP线程的优先级,使主线程的优先级高于LWIP线程来确保这一点。

使用LWIP_TCPIP_CORE_LOCKING有什么好处?

使用LWIP_TCPIP_CORE_LOCKING可以避免函数重入,从而解决内核崩溃问题,确保TCP通信的稳定性。

ESP8266的TCP通信速度能满足什么样的带宽需求?

ESP8266的TCP通信速度可以满足256kb/s的带宽需求。

➡️

继续阅读