概述
最近基于 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 均能正常工作,回调任务都能正常回调。
最后
以上就是友好香水为你收集整理的lwip 开发 sntp 与 tcp 不能同时工作的奇怪问题的全部内容,希望文章能够帮你解决lwip 开发 sntp 与 tcp 不能同时工作的奇怪问题所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复