我是靠谱客的博主 友好香水,最近开发中收集的这篇文章主要介绍lwip 开发 sntp 与 tcp 不能同时工作的奇怪问题,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

最近基于 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 不能同时工作的奇怪问题所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(55)

评论列表共有 0 条评论

立即
投稿
返回
顶部