一开始我还以为是 lwIP 的锅。

TCP window 调了、mem pool 调了、pbuf 调了、cache 搞了、DMA 描述符也重构了,甚至 TX 还做了 copy buffer。

结果:

👉 3Mbps → 7Mbps,没本质变化。


关键转折点

后来换了个思路:

把外部 XIP(100M NOR Flash)直接关掉,改成内部 ROM 跑代码


结果很离谱:

👉 直接 50Mbps

而且:

  • lwIP 基本没再怎么动
  • 零拷贝还在
  • DMA 还在
  • cache 还在
  • ITCM 热点优化也还在

真正的问题

不是 lwIP,不是 DMA,也不是 TCP。

XIP + cache + flash 访问模式


H750 + 外部 NOR Flash(100MHz)的问题:

开 I-cache 之后,理论上应该还行。

但实际是:

  • 预取 miss 很严重
  • instruction fetch 卡顿
  • pipeline 被 flash latency 打断

结果就是:

👉 TCP send_more 不是算不过来
👉 是 CPU 在“等指令”


最坑的一点

ST 文档说:

XIP 性能只下降 10%+

这个在“理想 cache 命中”情况下是对的。

但现实是:

👉 一旦预取/branch miss 多一点
👉 性能直接掉一大截

不是线性的,是断崖式的


对比很明显

❌ 外部 XIP(100M NOR Flash)

  • lwIP 已经优化完
  • DMA 正常
  • cache 开了
  • 零拷贝也做了

👉 结果:3~7Mbps


✔ 内部 ROM

啥都没变:

  • lwIP
  • DMA
  • pbuf
  • TCP window
  • cache

👉 直接 50Mbps


最后结论很简单

很多人调 lwIP,其实调错层了:

不是网络慢,是 CPU 在 XIP 上“卡指令”


补一句更真实的感受

H750 这个东西:

  • 做通信没问题
  • DMA 很强
  • ETH 很稳

但你一旦:

👉 把代码跑在外部 NOR XIP 上

整个系统就会变成:

“看起来都对,但就是跑不满”


经验总结

  • lwIP 不是瓶颈(大部分时候)
  • DMA 也不是瓶颈
  • TCP 也不是瓶颈
  • cache 也不是主要问题

真正杀性能的:

👉 指令执行路径(XIP + flash latency + miss)

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐