Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
RT-Thread一般讨论
春节测试Wiznet模块发现的问题,请RTT官方确认
发布于 2020-02-10 17:51:07 浏览:2757
订阅该版
* 本帖最后由 Spunky 于 2020-2-10 17:52 编辑 * 春节闲来无事试用了下RTT官方发布的Wiznet软件包,将测试情况列出来: 一、使能DHCP功能后会死机 1. 现象: 使用DHCP功能后,系统在运行接近2小时(准确说是7140秒)就会出现断言,打桩发现是spi1总线(W5500使用SPI1)的互斥量在中断中被调用(soft_timer是开启的)。 ![mutex.png](/uploads/202002/10/165213h89slkm8c8mkaat8.png) 2.原因 这个现象非常有规律,就是运行接近2小时发生,找到DHCP的续约租期时间默认的就是7200秒,而查找代码发现名字为"wiz_lsd"的定时器使用的是硬件模式,而wiz_dhcp_restart()使用SPI总线就是在中断中使用的。 ![dhcp1.png](/uploads/202002/10/165107fme7hp0ie7lclcn0.png) 3.正向验证原因 1) 将wizchip_dhcp.c中,将getDHCPLeasetime()函数修改为如下,即续约租期改为120秒: ![check1.png](/uploads/202002/10/170204id0n232nuqpumz1p.png) 2) 运行程序1分钟左右即会发生断言 ![mutex.png](/uploads/202002/10/165213h89slkm8c8mkaat8.png) 4. 反向验证原因 将定时器"wiz_lsd"改为软件定时器模式,然后将软件定时器默认的线程堆栈改为2048: ![check2.png](/uploads/202002/10/170747n2jvjio5hhkxzk05.png) ![check3.png](/uploads/202002/10/170817htz9z07wfyvvp8yd.png) 经过3个小时的连续运行,在120秒的续约租期条件下,证明修改的有效性。 5. 总结: 我水平不够,但个人觉得这是RTT团队的笔误或者是其他什么原因。除了这个严重BUG外,还有几个小吐槽: 二、使用wiz_set_mac()函数设置网卡的MAC地址,的确是设置到W5500寄存器里面了,但是使用ifconfig()命令仍然是默认的MAC值: 所以除了调用wiz_set_mac()外还需要设置netdev的数据: ![drv1.png](/uploads/202002/10/171735iws1k6tq1hss9mz4.png) 三、测试ping功能是发现有时会失败或者很卡,毫无规律: 查代码才发现,Wiznet模块使用固定DNS服务器地址:114.114.114.114: 1. 造成ifconfig设置的dns服务器地址就是摆设了; 2. 某些偏远地区使用地址为114.114.114.114的DNS服务器,状态很不友好,比如我所在的重庆。 因此我进行了下修改: ![dns1.png](/uploads/202002/10/172636sql2m2665k8mkqx2.png) 修改后,ping域名地址就很流畅了。 四、发现每次上电启动会出现接收超时错误: ![aa.png](/uploads/202002/10/173323v3rm2r34mcam8rgm.png) SAL组件在判断是否连接internet的时候,会固定发送一条UDP信息(编译时间和版本号数据)到link.rt-thread.org:8101,收到服务器的回复就判断上网成功。 ![bb.png](/uploads/202002/10/174910j4m76ttxsm4qannn.png) ![cc.png](/uploads/202002/10/174910fxaorsb4y64uza4y.png) 但现在是阿里云服务器都连上了,link.rt-thread.org:8101还连不上(也许是春节期间),造成我有些惊慌了,还以为又出了什么问题。因此我提个建议: 1. 将SAL_INTERNET_HOST和SAL_INTERNET_PORT放到ENV中进行设置; 2. check_netdev_internet_up_work()函数设置成weak模式; 开放给大家进行自由修改。 五、adbd模块在使用Wiznet的情况不能够使用 1. Disconvery模式会失败; 2. 使用SHELL会死机; 3. 由于SHELL都用不了,我也没有试文件传输功能; 马上要上班了,要收拾下心情,因此以上问题还没有开始查找,看RTT官方证实下,有没有什么解决方案。 武汉加油,中国加油!!! ![dhcp2.png](https://oss-club.rt-thread.org/uploads/202002/10/165131klom1oh83083y8oo.png)
查看更多
14
个回答
默认排序
按发布时间排序
hyd007
2020-02-10
这家伙很懒,什么也没写!
后面那个可能是shell栈太小了,还有这个不插网线,上电,提示初始化失败,后面即使插上网线,调用SAL接口也是失败
Spunky
2020-02-11
这家伙很懒,什么也没写!
>后面那个可能是shell栈太小了,还有这个不插网线,上电,提示初始化失败,后面即使插上网线,调用SAL接口也 ... --- 不插网线上电,初始化失败,这个不是问题,理念上不一样,Wiznet包本身就是这样写的。自己稍微改一下就OK了。
aozima
2020-02-11
调网络不抓包,调I2C等时序不上逻辑分析仪,就像电工不用万用表!多用整理的好的文字,比截图更省流量,还能在整理过程中思考。
Wiznet的软件包 看来要修下这几个问题。 有自己改过的可以发下PR。 DHCP可以在路由上面把租约时间改短一下,这样方便复现。
Spunky
2020-02-11
这家伙很懒,什么也没写!
>Wiznet的软件包 看来要修下这几个问题。 >有自己改过的可以发下PR。 --- 我昨天晚上开始测试了12个小时,租约时间改为1分钟,没有出现问题。
armink
2020-02-12
这家伙很懒,什么也没写!
一些问题分析的很专业,感谢反馈哈,也欢迎贡献 pr
Cheney_Chen
2020-02-13
这家伙很懒,什么也没写!
感谢楼主反馈,几个问题我逐一回答一下: 1. 软件定时器的问题已经在最新提交中改动过,参考[https://github.com/RT-Thread-packages/wiznet/commit/67aef7c4383852034ca5961f935b670b11bb9d19](https://github.com/RT-Thread-packages/wiznet/commit/67aef7c4383852034ca5961f935b670b11bb9d19) 改动,**建议楼主验证一下软件定时器默认的线程堆栈改为 2048 是否是必须的**, 如果是必须的可以考虑在软件包中添加适当 ERROR 错误提示。 2. wiznet 软件包中设置 mac 地址确实没有设置到 netdev,楼主改动没问题,netdev 中需要同步更新一下 3. dns 服务器设置**建议修改在 wiz.c 文件中 wiz_netdev_set_dns_server 函数中添加**,这样使用 dns 命令设置服务器地址时能同步设置 netdev 和 W5500 寄存器中 4. check_netdev_internet_up_work 函数旨在检查设备是否能够连接外网,外网连接的状态不会影响设备的网络连接,只做 ifconfig 中显示,但是现在由于服务器问题偶尔会出现连接失败导致状态错误显示,后面会考虑完善完服务器或者开放对应接口 最后,如果可以的话,也欢迎楼主就上面确定出错的问题提交 PR 修复,大家一起完善 WIZnet软件包:lol
Spunky
2020-02-15
这家伙很懒,什么也没写!
>感谢楼主反馈,几个问题我逐一回答一下: > >1. 软件定时器的问题已经在最新提交中改动过,参考https://githu ... --- 非常感谢这个帖子收到了官方的详细回复,前几天我发现问题后,只是用比较简单粗暴的方法修改,主要是验证问题。但具体修改肯定要思考下,我把我的思路提出来大家讨论下: 1. DHCP执行定时器死机的结症已经确认: 1) 改为软件定时器。 2) 软件定时器堆栈改为2048. 经过先前的验证是没有问题的。但是我认为使用定时器方案不是很好,原因如下: 1) 使用W5500的单片机系统肯定SRAM是不丰富的,软件定时器堆栈必须在原有基础上(默认512字节)增加1.5K内存。 2) DHCP功能只是在开机、续租到期或者插拔网线才执行一次,使用软件定时器利用率不高。 我建议使用RTT系统的workqueue模块,在初始化调用一次,将DHCP服务扔给"sys_work"线程去管理,这样就不增加任何多余的内存支出,我已经改好测试完毕,具体如下: 1) 新增函数wiz_dhcp_work(),执行一次之后就利用workqueue服务自动连续执行: [attach]13646[/attach] 2) 修改wiz_network_dhcp()函数,在启动的时候调用一次即可,用于DHCP相关设置、workqueue的初始化和wiz_dhcp_work()的首次调用,开启DHCP的周期服务。 [attach]13647[/attach] 3) 修改wiz_network_init()函数,增加调用前W5500硬件配置成功标志。 [attach]13648[/attach] 4) 修改wiz_link_status_thread_entry()函数,用于在重新联网后执行一次DHCP服务 [attach]13649[/attach] 5) 很多网友都反应上电的时候不插网线就失效。的确是这样,因此我进行下修改,目前测试没有什么问题: [attach]13650[/attach] 2. 设置MAC的问题我要说下应用逻辑,按照原作者思路是先搞个默认MAC,然后用户自己重新设置,但用户基本只能在DHCP完成后去设置,这样会存在一些不安的因素。因此我建议使用一个RT_WEAK函数的方法,在系统上电的时候就设置好MAC。具体修改如下: 1) 增加用户设置MAC接口函数和修改wiz_set_mac()函数 [attach]13651[/attach] 设置MAC接口函数范例: [attach]13652[/attach] 2) wiz_set_mac()调用位置调整 [attach]13653[/attach] 3. 关于你说的DNS问题在wiz_netdev_set_dns_server()中添加,我没有理解:wiz_netdev_set_dns_server()已经设置了芯片和netdev的DNS了。 [attach]13654[/attach] 我提出的问题是在使用wiz_socket.c文件里面wiz_gethostbyname()函数时固定使用了114.114.114.114的DNS服务器地址,而不是使用netdev或者芯片设置的dns地址,需要将芯片或者netdev的DNS读出来当做参数,然后调用DNS_run()函数。Wiznet包还是使用W5500的底层驱动包,DNS_run()不会自己去读芯片内部的DNS地址的,具体见下图: [attach]13655[/attach] 4. 关于check_netdev_internet_up_work()判断是否连接Internet,是向link.rt-thread.org发送一条UDP信息,收到回复后判断为NETDEV_FLAG_INTERNET_UP。 这样的做法本身没有问题,但在不知情的情况下,心里阴影面比较大。这次如果不是春节期间link.rt-thread.org服务器出了点问题,我都还没有怎么关注这个细节。所以我觉得这块服务开放与不开放都没有问题,但是这个重要细节应该向用户说明下。。。。
Cheney_Chen
2020-02-15
这家伙很懒,什么也没写!
楼主问题分析的都很细致全面,有些问题之前我们也没有注意到,对楼主的 PR 我们也会仔细查看,再次感谢楼主的支持:lol
stook
2020-02-16
这家伙很懒,什么也没写!
>不插网线上电,初始化失败,这个不是问题,理念上不一样,Wiznet包本身就是这样写的。自己稍微改一下就OK ... --- 不插网线,初始化失败的问题,已经解决了.[https://github.com/RT-Thread-packages/wiznet/commit/20ecd54f0e3f68bfe15faf6aa970cec959b67c8e](https://github.com/RT-Thread-packages/wiznet/commit/20ecd54f0e3f68bfe15faf6aa970cec959b67c8e) 另外我也野火霸道的板子上遇到了类似的问题,工作十来个小时单片机就跑飞的问题 shell 界面无任何错误输出,之前已经修改了定时器为软模式,但是并未修改软件定时器的堆栈,目前已经修改了HDCP 的租约时间,看下是不是和定时器的堆栈有关系.
stook
2020-02-16
这家伙很懒,什么也没写!
>感谢楼主反馈,几个问题我逐一回答一下: > >1. 软件定时器的问题已经在最新提交中改动过,参考https://githu ... --- 目前在野火霸道的板子上验证 验证方式如下,基于最新的提交:f7d2794ed702907209fee0ff614ab2f76fc372ca 修改DHCP的租约时间为2分钟,每两分钟问题必出现,改为2048后,问题暂未复现.
撰写答案
登录
注册新账号
关注者
0
被浏览
2.8k
关于作者
Spunky
这家伙很懒,什么也没写!
提问
19
回答
98
被采纳
0
关注TA
发私信
相关问题
1
有关动态模块加载的一篇论文
2
最近的调程序总结
3
晕掉了,这么久都不见layer2的踪影啊
4
继续K9ii的历程
5
[GUI相关] FreeType 2
6
[GUI相关]嵌入式系统中文输入法的设计
7
20081101 RT-Thread开发者聚会总结
8
嵌入式系统基础
9
linux2.4.19在at91rm9200 上的寄存器设置
10
[转]基于嵌入式Linux的通用触摸屏校准程序
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
最新文章
1
开源共生 商业共赢 | RT-Thread 2024开发者大会议程正式发布!
2
【24嵌入式设计大赛】基于RT-Thread星火一号的智慧家居系统
3
RT-Thread EtherKit开源以太网硬件正式发布
4
如何在master上的BSP中添加配置yml文件
5
使用百度AI助手辅助编写一个rt-thread下的ONVIF设备发现功能的功能代码
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
WIZnet_W5500
UART
ota在线升级
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
Debug
编译报错
msh
SFUD
rt_mq_消息队列_msg_queue
keil_MDK
ulog
MicroPython
C++_cpp
本月问答贡献
踩姑娘的小蘑菇
7
个答案
3
次被采纳
a1012112796
19
个答案
2
次被采纳
张世争
9
个答案
2
次被采纳
rv666
6
个答案
2
次被采纳
用户名由3_15位
13
个答案
1
次被采纳
本月文章贡献
程序员阿伟
9
篇文章
2
次点赞
hhart
3
篇文章
4
次点赞
RTT_逍遥
1
篇文章
6
次点赞
大龄码农
1
篇文章
5
次点赞
ThinkCode
1
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部