lwip 开发 sntp 与 tcp 不能同时工作的奇怪问题

  • Post author:
  • Post category:其他


最近基于 stm32f107  做lwip 网络开发, 开启


dhcp 和 sntp 服务,




一个udp 并且是多播 和




一个tcp,开发是基于 stm32cube 工具生成的代码,LWIP 配置如下:



工作时出现了很奇怪的问题:







如果先开 sntp    ( 执行sntp_init()

) 那么 后面的 tcp 过一段时间后会无法主动发送数据,



如果先开 tcp , 则 sntp 只能执行一次,不根据设置的 SNTP_UPDATE_DELAY 定时同步时间。


仿真发现 ,如果先开 sntp ,则后面tcp 的 tcp_poll 回调函数无法回调,如果先开 tcp 则 sntp 的回调函数无法被执行。

问题很奇怪,总之谁先初始化,谁就能正常工作,谁后初始化,谁就有异常!

怀疑过  很多东西,曾把 tcp 与 udp 的数量增加到 5,5,或,5,6 ,都还是有一样的问题。



最后怀疑是回调定时器的个数可能不够用,找了上图配置界面没找到相关的设置参数,最后在 lwip 源码中的 opt.h 中找到

#if !defined MEMP_NUM_SYS_TIMEOUT || defined __DOXYGEN__
#define MEMP_NUM_SYS_TIMEOUT            (LWIP_TCP + IP_REASSEMBLY + LWIP_ARP + (2*LWIP_DHCP) + LWIP_AUTOIP  + LWIP_IGMP + LWIP_DNS + (PPP_SUPPORT*6*MEMP_NUM_PPP_PCB) + (LWIP_IPV6 ? (1 + LWIP_IPV6_REASS + LWIP_IPV6_MLD) : 0))
#endif

发现没有 LWIP_SNTP 项,果断加上 LWIP_SNTP  :

#if !defined MEMP_NUM_SYS_TIMEOUT || defined __DOXYGEN__
#define MEMP_NUM_SYS_TIMEOUT            (LWIP_TCP + IP_REASSEMBLY + LWIP_ARP + (2*LWIP_DHCP) + LWIP_AUTOIP + LWIP_SNTP + LWIP_IGMP + LWIP_DNS + (PPP_SUPPORT*6*MEMP_NUM_PPP_PCB) + (LWIP_IPV6 ? (1 + LWIP_IPV6_REASS + LWIP_IPV6_MLD) : 0))
#endif

重新编译工程,问题完美解决!!SNTP 与 TCP 均能正常工作,回调任务都能正常回调。



版权声明:本文为zhanglifu3601881原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。