最近基于 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 均能正常工作,回调任务都能正常回调。