由wiznet引发的ISR (660)行错误,已解决

发布于 2020-04-25 16:18:09

现象发现的过程

W5500使用的网线是由路由器的LAN网口接出,测试的时候将路由器上的WLAN网口拔掉2s左右控制台不能输入,30秒左右后出现了以下错误。

Function[rt_mutex_take]shall not be used in ISR (0)assertion failed at function:rt_mutex_take, line number:660

推测控制台不能输入应该是停在在wiz线程中的某个while中 跳转不出来。
之后将断言中的while(dummy == 0)给屏蔽掉。

再次重现异常,打印了后续的错误信息

Function[rt_mutex_take]shall not be used in ISR(0)  assertionfailed at function:rt_mutex_take, line number:660 Function[rt_mutex_release]shall not be used in ISR(0) assertion failed atfunction:rt_mutex_release, line number:803 04-25 15:53:18 W/UART:Warning: There is no enough buffer for saving data, please increase theRT_SERIAL_RB_BUFSZ opt

用断点调试之后出乎意料的发现rt_mutex_take是由i2c调用的,我i2c在工作的器件只有ds2312,使用了ds2312软件包来代替系统的rtc。
进一步调试,发现是此时串口一直在接收数据,缓冲区超过设定的大小,输出警告的时间戳时会调用i2c去读取ds2312的时间。

由于我连接了阿里云,一直在上报信息,(不上报数据时不会出现此问题, 不过阿里云心跳消息上报时也会出现此状况,发生这个异常只是时间问题)。所以很快的出现了此问题,进一步跟踪错误发现在发送数据时进入了wizchip_socket.c 的 394行 这个while(1)中,将tmp参数打印出来之后发现,
正常情况下tmp的值为23 也就是SOCK_ESTABLISHED的值0x17,频率在1秒3次左右,拔掉WLAN网口的网线时就一直在输出tmp = 23, 30s左右tmp的值才变成0, 之后跳出这个while(1),然后就会立刻触发这个异常。

解决办法

  1. 如果W5500能检测到网口拔掉的话就能避免这个问题,但是没有研究过W5500 不知道能不能实现,不过rtt至今没有实现,猜想W5500的硬件是没有这个功能的。
  2. 既然如此就暂时弄个解决办法,在这个while里加入超时检测。

再次试验,没有再触发这个异常,猜想:这里是系统获取时间调用了i2c去读取ds2312发生的错误,那么当用户的线程优先级高于wiz这个线程时,去调用i2c或者spi时也会发生此类错误。

查看更多

关注者
0
被浏览
485
2 个回答
HelloBye
HelloBye 2020-04-25
图片被吃了 这里补上
1.png
2.png
3.png
4.png
aozima
aozima 2020-04-25
拒绝白嫖,拒绝键盘侠!
感谢分享

撰写答案

请登录后再发布答案,点击登录

发布
问题

分享
好友

手机
浏览

扫码手机浏览