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

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

[复制链接]
STMCU小助手 发布时间:2022-2-19 16:54
STM32F2x7 FreeRTOS 下网络压力测试错误无法恢复的问题! |3 e) a% V4 D
一. 前言
8 \1 B- m- ^7 B% `9 M" e; k# S8 N很多朋友反映 ST 官网的例程 stsw-stm32060(也就是 STM32F2x7 的以太网例程)中的FreeRTOS 驱动有问题,表现为在网络压力测试下向 STM32 进行 ping 测试,过段时间后会出现无法恢复的网络延时,甚至出现 ping 不通(网络不通的情况,注意不是超时)。/ C9 m0 x# s9 S0 O% f: }

( B% }: J" D, k& x! r事实上,ST 的工程师已经发现了这个 bug,他们在 stsw-stm32070(STM32F4x7 的以太网例程,不过 STM32F2x7 还没有更新这个驱动)中修复了这个 bug。但是许多朋友并不知道这件事,这篇文档就是对这个问题进行一些说明,另外将新的驱动移植到了 STM32F2x7中(暂时就叫做 STM32F2x7_ETH_LwIP_V1.2.0(RC)) :-D。5 H* D9 a* E* I) \! m  n& k

  o, J! d0 |. `9 i7 T二. Stsw-stm32060 中的问题产生原因6 a$ y$ i% H5 P6 R0 z
解释这个问题前,首先要对 ST 的驱动程序进行一些说明,以太网的数据是通过 FIFO送入 DMA 缓冲区的,lwip 的底层输入函数(ethernetif_input 进程)将数据从 DMA 缓冲区拷贝到协议栈缓冲区,数据由协议栈自行处理(tcp_ip 进程)。7 @' \1 Z# X8 o& f9 ^3 E/ {3 Y
! e+ @7 j3 ]0 {  B
1. 以太网的 DMA 有两个拥有者, ~+ f: ]  y& ~
   主机:数据可以被处理;
8 Z! C; q3 z( |+ b. o3 F9 ?4 y( a   DMA 自身:只有在这种情况下 DMA 可以接收数据并产生中断。$ r! T  N7 S: H8 L- A0 `
   特别需要注意的当 DMA 描述符所对应的缓冲区满的时候,该描述符会为主机所拥有;驱动程序是将数据拷贝到 lwIP 的数据缓冲区后将该 DMA 拥有者置为 DMA 自身。
; ?( c7 G/ W# f3 N. j# _$ h2. ST 的例程是采用中断机制来处理以太网的数据接收,FreeRTOS 下使用 CounterSemaphore 来对中断进行描述(Counter Semaphore 的增长是在中断处理函数中的),中断服务程序(ethernetif_input,后文称这个函数为 ISR,但这个任务并不在中断处理函数中,这个任务平常是阻塞的,只有得到信号量后才会运行)仅处理一个以太网 packet。: w9 T2 S) I3 Q! q$ r
- j; |; e# p2 M% o4 A
   正常情况下,在数据包到达 STM32 的以太网接收缓冲区时,会进入中断,中断程序会将 Counter Semaphoare+1,从而触发中断服务程序 ISR(ethernetif_input)对这个包进行处理。
& h8 I* x& y+ _9 c4 M
& T* L5 y0 u/ u 69U9NUW9ZMG04URXVYPVY7A.png
3 J! U( W* h" G8 k+ W4 C
: G+ O! v. {! F9 S- ?: u; y7 {8 E   但是,如果有数据包送到接收缓冲区,但是没有及时产生中断的话(在操作系统中这是非常容易引起的,比如更高级的中断或者临界代码,这些操作都会屏蔽掉其它中断)。此时就会发生一种奇怪的现象,即 Counter Semaphore 的值与数据缓冲区的 packet 映射不对应。如下图所示
* [! ?" O9 ]9 }! H, \
4 K& x' _$ a! R- n8 P& k S4)D8A}Y3)SLFXJ0Y~A`B5X.png & J2 P# M5 F/ S* }; K

# d5 E- K/ t. ]& Q& y9 J6 k   这个时候网络状况就非常糟糕了,实际的 ISR 程序执行的非常晚,表现的方式就是大量的的延时甚至是 Timeout。
) [* O6 h  T5 K# D& D! S0 b6 k$ H$ p' B  Y6 r8 X1 r% C5 v: R1 i
HG165]{{06GAA43JL_}~{{I.png
6 @9 ]  I8 H- A! T1 E" o6 X; Z
  [3 v& i5 K/ r, p  F, z$ P   但这还不是最糟糕的,一旦 DMA Buffer 满了,同时 Counter Semaphore 中没有任何可用信号量。按照刚才提到的,DMA 是无法再接收数据并产生中断了(RBUS = 1),即无法进入中断处理函数,从而也无法触发触发中断服务程序。网络就表现为断线。此时 ping 的响应就不是 timeout,而是 IP 无法到达(我在写这篇文档时候没出现这个情况,所以没有截图,但是以前是遇到过的)。
. d+ W' X4 X: T6 m: |9 K0 ?
% ^. Q- s4 k2 f   三. Stsw-stm32070 的改进) `/ \* q6 E. ?' w. w+ C
1.ethernetif_input 中处理多个以太网 packet,即只要进入这个程序,就会将以太./网的缓冲处理完。6 ^) z( L$ h1 Z( s. K6 g4 N
2.FreeRTOS 下中断采用二值信号量来触发阻塞任务。
' z$ H) S6 ~% }) D+ T' ^( u
  大家可以简单分析一下,在这种情况下,是不会出现 stm32060 中的问题的。丢包和延时仍然是可能出现的。这是我自己利用新的驱动做的测试,2 个 ping tester(10ms,1kbytes),同时还打开 http 服务(事实上已经 http 已经完全没有响应了)和 cmd 的ping(1s, 1000bytes),这个测试压力比许多应用,stm32F4x7(168MHz)的仍然能保持网络的畅通性。/ s2 e& ^0 a9 X! U( ~0 k

; n7 c8 z8 C+ t   四. 结语4 p+ C0 l' `  A$ G, U7 m5 D3 B% C
   可以看出新的驱动确实较之过去有了明显的提升。由于 STM32F4 和 F2 的以太网外设是一样的,所以驱动也是相互兼容的。, @3 F- \# m9 Y7 x4 |2 [9 ~5 c

6 F& h; R1 y8 s$ l- }& z. ~! @8 X   最后需要说明的是,驱动也是工程师写的,在资源有限的情况下必然存在一些问题(总是有需要完善的地方)。对于应用工程师而言,压力测试的环境应该参考自己的实际应用场景来设计,远超于实际应用的压力测试其实是没有太大的意义。
# {5 W* e$ K4 x* [
# y  o1 `& p% [% n2 y: k5 p4 |/ \   欢迎朋友们继续交流。
9 k2 ?& ~* V3 I- U7 I5 \
+ U6 M$ e- E' d  [
) m. l& M3 c( I& I: X; `
K~8R`VTQZ{10SKI){F)W1W7.png
赞 收藏 评论0 发布时间:2022-2-19 16:54

举报

0个回答

所属标签

相似技术帖

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