STM32F407+FreeRTOS+LWIP1.4.1: Error:..\FreeRTOS\portable\RVDS\ARM_CM4F\port.c,441

在基于STM32F407ZGT6的开发板上,遇到使用FreeRTOS和TCP通信时串口错误的问题。问题源于串口中断优先级高于FreeRTOS管理的最高优先级,导致FreeRTOS无法正确管理中断。通过调整串口中断优先级至6并检查sys_arch.c中sys_arch_protect()和sys_arch_unprotect()的临界保护,发现原DEMO使用任务级保护,而在中断中应使用中断级保护。修改后,问题仍未解决。进一步排查lan7820.c中以太网中断优先级设置,发现需设置为大于6,以避免与LWIP的系统任务冲突。最终成功解决串口错误,实现正常通信。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近在学习物联网相关的知识,打算用ST的开发板STM32F407ZGT6作为控制中心,上面搭载FreeROTS实时系统,STM32F407开发板作为 TCP client,网络调试助手作为TCP server,利用串口获取两者的连接状态。在用原子的lwip工程移植到自己的STM32F407开发板时,可以正常获取DHCP分配的IP,也能通过网络和网络工具正常通信,但是串口一直提示错误:
在这里插入图片描述
从port.c文件中,定位到该行,
在这里插入图片描述
从文件中来看,应该是和中断有关的,从网上查阅了很多资料发现,首先怀疑串口的中断的优先级超过FreeRTOS的管理最高优先级,需要将串口中断的优先级降为FreeRTOS的管理最高优先级以下就可以。
据此,分别确认以下中断配置:主函数中,(1)系统中断优先级分组,位于main.c文件(2)串口中断,位于usart.c文件(3)FreeRTOS系统可以管理的中断最高优先级,位于freertosconfig.h文件
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
可以发现,串口中断的优先级为3,freeRTOS最大可管理的中断优先级是5(中断级小于等于5,freeRTOS无法管理),中断优先级更改为6,发现不行。再继续查阅资料。
发现在ethernetif.c源码中,low_level_input中有一个pbuf_alloc,而源码中恰恰有sys_arch.c的sys_arch_protect()和sys_arch_unprotect()的临界保护
而low_level_input是在中断中调用的。
发现参考DEMO的sys_arch.c中的sys_arch_protect()和sys_arch_unprotect()是使用的任务级的临界保护,所以芯片会出现未知的异常。
在这里插入图片描述
在这里插入图片描述

改成中断级临界保护,
在这里插入图片描述
发现编译下载到板卡中,串口还是会出现同样的问题。
此外sys_mbox_trypost也要用中断级入队函数。
在这里插入图片描述
修改为在这里插入图片描述

修改后,重新编译下载,串口打印ok.
在这里插入图片描述

出现这个问题应该就是在中断中调用了任务级临界保护,建议逐条查看中断中调用的函数中是否用到了任务级临界保护。
补充说明,lan7820.c中以太网的中断优先级设置(串口中断优先级可以设置为<6),参考例程中设置的优先级是0(FreeRTOS中,数字越小,优先级最高,要与任务优先级区别),FreeRTOS最大的管理优先级是6,因为LWIP中sys_arch.c中使用的是FreeRTOS的任务级函数的API,所以需要将lan8720.c中断优先级设置为>6。
如果lan8720.c中中断优先级<6,那么会出现:能正常获取IP,同时有以下报错:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值