STM32F407+FreeRTOS+LWIP1.4.1移植问题记录

电子说

1.3w人已加入

描述

最近在学习物联网相关的知识,打算用ST的开发板STM32F407ZGT6作为控制中心,上面搭载FreeROTS实时系统,STM32F407开发板作为 TCP client,网络调试助手作为TCP server,利用串口获取两者的连接状态。在用原子的lwip工程移植到自己的STM32F407开发板时,可以正常获取DHCP分配的IP,也能通过网络和网络工具正常通信,但是串口一直提示错误:

FreeRTOS

从port.c文件中,定位到该行。

FreeRTOS

从文件中来看,应该是和中断有关的,从网上查阅了很多资料发现,首先怀疑串口的中断的优先级超过FreeRTOS的管理最高优先级,需要将串口中断的优先级降为FreeRTOS的管理最高优先级以下就可以。

据此,分别确认以下中断配置:主函数中,(1)系统中断优先级分组,位于main.c文件(2)串口中断,位于usart.c文件(3)FreeRTOS系统可以管理的中断最高优先级,位于freertosconfig.h文件

FreeRTOS

FreeRTOS

FreeRTOS

可以发现,串口中断的优先级为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()是使用的任务级的临界保护,所以芯片会出现未知的异常。

FreeRTOS

FreeRTOS

FreeRTOS

发现编译下载到板卡中,串口还是会出现同样的问题。

此外sys_mbox_trypost也要用中断级入队函数。

FreeRTOS

修改后,重新编译下载,串口打印ok.

FreeRTOS

出现这个问题应该就是在中断中调用了任务级临界保护,建议逐条查看中断中调用的函数中是否用到了任务级临界保护。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分