关于Wiznet(5500)会出现[rt_mutex_take] shall not be used in ISR的问题

2019-11-19 17:37 [复制链接] 2 76

wiznet在使用时,有时会出现
" d8 U7 ]3 s! nFunction[rt_mutex_take] shall not be used in ISR(0) assertion failed at function:rt_mutex_take, line number
/ A+ }" [( {! ~' k3 T3 x" y/ Q: w2 d$ R9 a
的问题。
1 }+ [1 @. W* b( i这是由于在中断中使用了进行了spi操作。0 m  J/ [2 |# a
经过排查发现在wiz.c(248行)开启了定时器
4 \* I# Z- E$ a3 G3 c; _dhcp_timer = rt_timer_create("wiz_dhcp", wiz_dhcp_timer_entry, RT_NULL, 1 * RT_TICK_PER_SECOND, RT_TIMER_FLAG_PERIODIC);
9 Q  p, ^4 v2 G' }: e6 u, ]此处开启了定时器,但是没有指定其为软定时。因此有可能在硬件定时器中断中进行spi操作,导致上述问题产生。只需改为
- Y3 t3 V6 A* w2 |# D: J& x" _dhcp_timer = rt_timer_create("wiz_dhcp", wiz_dhcp_timer_entry, RT_NULL, 1 * RT_TICK_PER_SECOND, RT_TIMER_FLAG_PERIODIC|RT_TIMER_FLAG_SOFT_TIMER);4 R! t- ~/ D' }1 B6 F
即可。即指定其为软定时。
. Q' c' T& y& y: V. U+ K同样的,在wiz.c(396行)
: K* A% ~% F5 K% Llsd_timer = rt_timer_create("wiz_lsd", (void (*)(void *parameter))wiz_dhcp_restart, RT_NULL,* o9 m/ D6 p3 g: E5 L& R; B
                (getDHCPLeasetime() - 60) * RT_TICK_PER_SECOND, RT_TIMER_FLAG_PERIODIC);+ `; ]/ k2 D6 u
只需将这些地方改为软定时即可。
) h; x+ R: k$ ]; I, x' I! b3 n1 r还需要注意自己不要在定时器和中断中发送数据。6 K) @" k3 F0 K; m5 ]; \
1 t% C9 e; ~* ~( E7 ~4 s! O. _
使用道具 举报 显示全部楼层 回复
最新评论 | 正序浏览
显示全部楼层 |楼层直达:
发表于 2019-11-19 17:52:53 | 显示全部楼层
本帖最后由 yangjie 于 2019-11-19 17:59 编辑
: y  T6 w% h% \1 [
/ V5 r; p' x- n  ~7 d+ I咦,这个默认不是软件定时器吗..
使用道具 举报 回复
发表于 2019-11-19 18:00:15 | 显示全部楼层
楼主可以提个pr把这个问题修复下~~
使用道具 举报 回复
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|RT-Thread开发者社区 ( 沪ICP备13014002号-1

有害信息举报电话:021-31165890 手机:18930558079

© 2006-2019 上海睿赛德电子科技有限公司

Powered by RT-Thread

快速回复 返回顶部 返回列表