Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
WIZnet_W5500
多socket并发下,W5500突然网络异常,无法收发
发布于 2024-10-17 10:57:11 浏览:258
订阅该版
[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
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
WIZnet_W5500
ota在线升级
UART
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
Debug
编译报错
msh
SFUD
keil_MDK
rt_mq_消息队列_msg_queue
at_device
ulog
C++_cpp
本月问答贡献
踩姑娘的小蘑菇
7
个答案
3
次被采纳
张世争
8
个答案
2
次被采纳
rv666
5
个答案
2
次被采纳
用户名由3_15位
11
个答案
1
次被采纳
KunYi
6
个答案
1
次被采纳
本月文章贡献
程序员阿伟
6
篇文章
2
次点赞
hhart
3
篇文章
4
次点赞
大龄码农
1
篇文章
2
次点赞
ThinkCode
1
篇文章
1
次点赞
Betrayer
1
篇文章
1
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部