Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
WIZnet_W5500
多socket并发下,W5500突然网络异常,无法收发
发布于 2024-10-17 10:57:11 浏览:601
订阅该版
[tocm] W5500一共有8个socket,SIR指示那几个socket来了中断,Sn_IR指示具体socket产生了什么中断(发送,接收或者超时等) ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20241021/bf92a4bbdea4a79b5b4ff726eaa3f61c.png.webp) ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20241021/b2ed2287e1e444c57b28fcffc832b2be.png.webp) ## 问题描述: 分析官方的源码,可知,当多个线程同时存在多个socket下或者一个线程存在多个socket下,接收到一个wiz_rx_mb下sir = getSIR()只会获取一次,getSIR的值在下面的for循环下可能已经被其他socket修改了,但是此时的INIT引脚还是低电平(空闲下应该是高电平),低电平的情况下无法响应中断,也就是会漏掉了部分的mailbox,导致SIR和Sn_IR的寄存器没有完全清0,INIT引脚一直为低,如果你网络异常情况下,INIT引脚一直为低,那么大概率也是这个原因; ## 解决办法: 多增加一个while和run_times,直至查询该getSIR寄存器为0 或者运行次数大于20次(这个次数自定义),这样可以不断更新sir的值,防止多线程下多socket并发导致的问题 官方源码: ```c static void wiz_data_thread_entry(void *parameter) { #define IR_SOCK(ch) (0x01 << ch) /**< check socket interrupt */ struct rt_spi_device* dev; while (1) { if (rt_mb_recv(wiz_rx_mb, (rt_ubase_t*) &dev, RT_WAITING_FOREVER) == RT_EOK) { uint8_t ir, sir, sn_ir; int8_t socket = -1; /* get IR data than clean IR */ ir = getIR(); setIR(ir); if ((ir & IR_CONFLICT) == IR_CONFLICT) { setIR(IR_CONFLICT); } if ((ir & IR_UNREACH) == IR_UNREACH) { setIR(IR_UNREACH); } /* get and process socket interrupt register */ sir = getSIR(); for (socket = 0; socket < 8; socket++) { sn_ir = 0; if (sir & IR_SOCK(socket)) { /* save interrupt value*/ sn_ir = getSn_IR(socket); if (sn_ir & Sn_IR_CON) { setSn_IR(socket, Sn_IR_CON); } if (sn_ir & Sn_IR_DISCON) { wiz_closed_notice_cb(socket); setSn_IR(socket, Sn_IR_DISCON); } if (sn_ir & Sn_IR_RECV) { wiz_recv_notice_cb(socket); setSn_IR(socket, Sn_IR_RECV); } if (sn_ir & Sn_IR_TIMEOUT) { /* deal with timeout event in the wiznet ioLibrary */ //setSn_IR(socket, Sn_IR_TIMEOUT); } } } } } } ``` ### 修改后的源码 ```c static void wiz_data_thread_entry(void *parameter) { #define IR_SOCK(ch) (0x01 << ch) /**< check socket interrupt */ struct rt_spi_device* dev; uint8_t run_times = 0; while (1) { if (rt_mb_recv(wiz_rx_mb, (rt_ubase_t*) &dev, RT_WAITING_FOREVER) == RT_EOK) { uint8_t ir, sir, sn_ir; int8_t socket = -1; run_times = 0; /* get IR data than clean IR */ ir = getIR(); setIR(ir); if ((ir & IR_CONFLICT) == IR_CONFLICT) { setIR(IR_CONFLICT); } if ((ir & IR_UNREACH) == IR_UNREACH) { setIR(IR_UNREACH); } /* get and process socket interrupt register */ while ((sir=getSIR()) && run_times < 20) { run_times++; for (socket = 0; socket < 8; socket++) { sn_ir = 0; if (sir & IR_SOCK(socket)) { /* save interrupt value*/ sn_ir = getSn_IR(socket); if (sn_ir & Sn_IR_CON) { setSn_IR(socket, Sn_IR_CON); } if (sn_ir & Sn_IR_DISCON) { wiz_closed_notice_cb(socket); setSn_IR(socket, Sn_IR_DISCON); } if (sn_ir & Sn_IR_RECV) { wiz_recv_notice_cb(socket); setSn_IR(socket, Sn_IR_RECV); } if (sn_ir & Sn_IR_TIMEOUT) { /* deal with timeout event in the wiznet ioLibrary */ //setSn_IR(socket, Sn_IR_TIMEOUT); } } } } } } } ```
1
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
NHMF_4386
这家伙很懒,什么也没写!
文章
3
回答
4
被采纳
1
关注TA
发私信
相关文章
1
W5500软件包开机无法解析link.rt-thread.org
2
W5500 如何实现断开重连?
3
W5500初始化全部都OK,电脑能ping板子,板子ping不通电脑
4
w5500 编译错误
5
求个SPI上挂W5500、Max6675两个设备的驱动例子
6
TFTP与W5500配合能传文件但无内容
7
wiznet(W5500) 设置MAC
8
SPI总线挂接2个W5500以太网芯片
9
多网卡建立链路问题,求官方解答
10
为什么W5500一直显示无法挂载
推荐文章
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组件
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
DMA
USB
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
I2C_IIC
ESP8266
UART
WIZnet_W5500
ota在线升级
cubemx
PWM
flash
freemodbus
BSP
packages_软件包
潘多拉开发板_Pandora
定时器
ADC
flashDB
GD32
socket
编译报错
中断
Debug
rt_mq_消息队列_msg_queue
SFUD
msh
keil_MDK
ulog
C++_cpp
MicroPython
本月问答贡献
出出啊
1518
个答案
343
次被采纳
小小李sunny
1444
个答案
290
次被采纳
张世争
813
个答案
177
次被采纳
crystal266
549
个答案
161
次被采纳
whj467467222
1222
个答案
149
次被采纳
本月文章贡献
出出啊
1
篇文章
3
次点赞
小小李sunny
1
篇文章
1
次点赞
张世争
1
篇文章
3
次点赞
crystal266
2
篇文章
2
次点赞
whj467467222
2
篇文章
2
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部