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

【经验分享】STM32F2x7 以太网 FreeRTOS 下驱动问题的说明

[复制链接]
STMCU小助手 发布时间:2022-2-19 16:54
STM32F2x7 FreeRTOS 下网络压力测试错误无法恢复的问题+ E. d8 Q" E% S, F  a1 ]
一. 前言; q; R6 V6 i# x( k6 O; m" \+ }4 l
很多朋友反映 ST 官网的例程 stsw-stm32060(也就是 STM32F2x7 的以太网例程)中的FreeRTOS 驱动有问题,表现为在网络压力测试下向 STM32 进行 ping 测试,过段时间后会出现无法恢复的网络延时,甚至出现 ping 不通(网络不通的情况,注意不是超时)。: `: _' |7 I1 q: X5 }3 H6 I" H! o

8 U5 {6 T1 A  N! a: b/ ^事实上,ST 的工程师已经发现了这个 bug,他们在 stsw-stm32070(STM32F4x7 的以太网例程,不过 STM32F2x7 还没有更新这个驱动)中修复了这个 bug。但是许多朋友并不知道这件事,这篇文档就是对这个问题进行一些说明,另外将新的驱动移植到了 STM32F2x7中(暂时就叫做 STM32F2x7_ETH_LwIP_V1.2.0(RC)) :-D。9 T) K/ }# x! ]+ r5 J! {

, p3 L! X* ^3 D) s# d二. Stsw-stm32060 中的问题产生原因
$ E8 C' W: V  p' ~! u& r解释这个问题前,首先要对 ST 的驱动程序进行一些说明,以太网的数据是通过 FIFO送入 DMA 缓冲区的,lwip 的底层输入函数(ethernetif_input 进程)将数据从 DMA 缓冲区拷贝到协议栈缓冲区,数据由协议栈自行处理(tcp_ip 进程)。
0 {" k0 S' K, V( _- {) b# c. @1 _4 K+ v0 ]) O) J* i% |' D
1. 以太网的 DMA 有两个拥有者+ ~3 r" H4 A6 y2 w" W
   主机:数据可以被处理;" A* f) \7 V% d- V5 d& X  e3 t
   DMA 自身:只有在这种情况下 DMA 可以接收数据并产生中断。
/ x0 y& Q; Z* {/ R   特别需要注意的当 DMA 描述符所对应的缓冲区满的时候,该描述符会为主机所拥有;驱动程序是将数据拷贝到 lwIP 的数据缓冲区后将该 DMA 拥有者置为 DMA 自身。5 Z  [( I+ F0 a3 @0 B
2. ST 的例程是采用中断机制来处理以太网的数据接收,FreeRTOS 下使用 CounterSemaphore 来对中断进行描述(Counter Semaphore 的增长是在中断处理函数中的),中断服务程序(ethernetif_input,后文称这个函数为 ISR,但这个任务并不在中断处理函数中,这个任务平常是阻塞的,只有得到信号量后才会运行)仅处理一个以太网 packet。
6 x' S0 c8 p5 U( q
+ u! R8 i2 |, S4 ?/ T  H# `   正常情况下,在数据包到达 STM32 的以太网接收缓冲区时,会进入中断,中断程序会将 Counter Semaphoare+1,从而触发中断服务程序 ISR(ethernetif_input)对这个包进行处理。
2 ?3 J- g2 b) u. A( X& f# L! i2 s, U8 n3 W
69U9NUW9ZMG04URXVYPVY7A.png , E4 j0 L* q& c' {- o
0 S8 C) I  B* c( J7 ?
   但是,如果有数据包送到接收缓冲区,但是没有及时产生中断的话(在操作系统中这是非常容易引起的,比如更高级的中断或者临界代码,这些操作都会屏蔽掉其它中断)。此时就会发生一种奇怪的现象,即 Counter Semaphore 的值与数据缓冲区的 packet 映射不对应。如下图所示7 M$ T5 i. k8 e+ |' `, T6 H

$ `7 {7 ^  O0 H6 @ S4)D8A}Y3)SLFXJ0Y~A`B5X.png   X( R) q7 j% o' J& |

1 W* n( c! \/ W1 I   这个时候网络状况就非常糟糕了,实际的 ISR 程序执行的非常晚,表现的方式就是大量的的延时甚至是 Timeout。" @# N9 L6 K8 R5 F+ Q

1 F4 e8 J+ r- i. ` HG165]{{06GAA43JL_}~{{I.png ! I" h7 x& y9 B2 h3 `
0 C8 J& E% K1 l7 b4 ~, `+ U" {
   但这还不是最糟糕的,一旦 DMA Buffer 满了,同时 Counter Semaphore 中没有任何可用信号量。按照刚才提到的,DMA 是无法再接收数据并产生中断了(RBUS = 1),即无法进入中断处理函数,从而也无法触发触发中断服务程序。网络就表现为断线。此时 ping 的响应就不是 timeout,而是 IP 无法到达(我在写这篇文档时候没出现这个情况,所以没有截图,但是以前是遇到过的)。
6 r3 m* |5 I. c# J! ?0 K, ?4 z
" \8 y, B: I# y1 e: K, Q9 A6 f   三. Stsw-stm32070 的改进
' Y8 X! b' U9 E& j6 z& l1.ethernetif_input 中处理多个以太网 packet,即只要进入这个程序,就会将以太./网的缓冲处理完。4 [) \( f4 Q) g8 T7 U; w6 N
2.FreeRTOS 下中断采用二值信号量来触发阻塞任务。
) M$ C: o2 |) y+ G* l9 V) V
  大家可以简单分析一下,在这种情况下,是不会出现 stm32060 中的问题的。丢包和延时仍然是可能出现的。这是我自己利用新的驱动做的测试,2 个 ping tester(10ms,1kbytes),同时还打开 http 服务(事实上已经 http 已经完全没有响应了)和 cmd 的ping(1s, 1000bytes),这个测试压力比许多应用,stm32F4x7(168MHz)的仍然能保持网络的畅通性。
; C4 u& P1 P+ ^8 _  a4 C! Z- g: ?* H( }' A
   四. 结语
1 D% y7 l6 O4 b$ P& b   可以看出新的驱动确实较之过去有了明显的提升。由于 STM32F4 和 F2 的以太网外设是一样的,所以驱动也是相互兼容的。" l6 s( |9 n' o5 N

& T1 C  o; V8 Z3 ?# Z9 F   最后需要说明的是,驱动也是工程师写的,在资源有限的情况下必然存在一些问题(总是有需要完善的地方)。对于应用工程师而言,压力测试的环境应该参考自己的实际应用场景来设计,远超于实际应用的压力测试其实是没有太大的意义。
$ W8 z: l+ f8 u$ l7 \
0 H8 B' x" [: f$ I( P1 n* ~   欢迎朋友们继续交流。
% m5 s; n8 c& E
, ^+ R* o9 V% R. ]4 |" p& V& a& @
0 u# H- r  J7 q& F
K~8R`VTQZ{10SKI){F)W1W7.png
收藏 评论0 发布时间:2022-2-19 16:54

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版