你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

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

[复制链接]
STMCU小助手 发布时间:2022-12-13 16:00
640 (8).png

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

% D4 d3 f; G  |5 R) V2 @
640 (7).png

& V# I7 V! v9 x  c1 ]- M& H
从port.c文件中,定位到该行。
9 Q) D: `& G+ |: }+ j* b( N
640 (6).png
8 j) ^4 M% [# j+ D4 a( Q- f
从文件中来看,应该是和中断有关的,从网上查阅了很多资料发现,首先怀疑串口的中断的优先级超过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()是使用的任务级的临界保护,所以芯片会出现未知的异常。

, E; t' f* a2 J. P" S& t# f3 n" j
640 (5).png

3 q3 C3 k! v" g4 _4 ~% P$ m4 q% Q
640 (4).png
7 w# f4 u% o6 y/ X- z& m+ g  K1 {
640 (9).png
! Q# [, A* ?& p8 R
发现编译下载到板卡中,串口还是会出现同样的问题。
此外sys_mbox_trypost也要用中断级入队函数。

$ @+ H+ V9 Y" e# F5 i1 Y
640 (1).png

4 b" V* H, D, e1 G1 i: r
修改后,重新编译下载,串口打印ok.

- i4 t- X1 y! A% L
640.png
7 f( Q; p+ M. j9 D
出现这个问题应该就是在中断中调用了任务级临界保护,建议逐条查看中断中调用的函数中是否用到了任务级临界保护。

  u6 f' b. U1 z- s9 Y
640 (3).png
640 (2).png
640 (5).png
赞 收藏 评论1 发布时间:2022-12-13 16:00

举报

1个回答
HL_zju 回答时间:2022-12-31 16:24:41
在中断里使用了printf?
! {; I* t- p! |1 X: k: u/ v8 ~

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版