/ 消息 / 绩效之路 - 第 2 部分

绩效之路 - 第 2 部分

大家好,

是时候发表下一篇博文了。将尝试每周继续更新该系列。但首先:

PureThermal OpenMV 降价了!

PureThermal OpenMV 现价259.99 美元!为了节省成本,我们设法将 BOM 削减了 30 美元(我们希望将其降低到 249.99 美元,但由于当前的芯片市场,无法做到这么低)。

我们将为我们的第一次生产运行构建 250 个这样的东西,并从那里开始。 请支持该活动并立即锁定您的位置!

是的,这些博客文章是我不断浏览有关 PureThermal OpenMV 的电子邮件列表的工具。但是,我还在下面写了真正有用的内容。也许下周我会制作一个演示视频,展示船上一些很酷的东西。

第 2 部分 - DMA 缓冲区局部性

将 DMA 缓冲区放置在 RAM 中的位置很重要。它决定数据如何在芯片上的系统总线中流动,并确定哪些资源处于负载状态。例如,使用 PureThermal OpenMV,我们能够执行以下操作:

  • 使用 OV5640 以 80 MB/s 的速度持续捕获图像
  • 恒定显示缓冲区更新(50 MB/秒)
  • 以 1280x720 @ 60 Hz (111 MB/s) 持续显示更新
  • FLIR Lepton 3.5 的恒定 SPI 总线输入(2.5 MB/s)
  • 用于电视扩展板的恒定 SPI 总线输出 (10 MB/s)
  • 恒定 WiFi 输出(1.25 MB/秒)
  • 恒定 USB 输出(1.25 MB/秒)
  • 恒定 SDIO 输出(12.5 MB/秒)

同时!当我们第一次尝试同时完成所有这些工作时,我们的代码失败了。 DMA FIFO 溢出,东西被锁定,没有任何作用。但是,我们在查看系统总线架构时找到了答案。

STM32F4/STM32F7 系统总线

如果您深入研究 STM32F427 参考手册,您会发现以下系统总线架构。

STM32F427系统总线

当我们第一次开始在 STM32F427 上开发固件时,我们不必太担心 DMA 缓冲区在 SRAM 中的位置。相机速度较慢,我们没有使用 SDRAM,而且处理器也更简单。因此,我们没有努力去优化 DMA 缓冲区的位置。

现在,我们来看看如何查看上面的图片。您会注意到有三个 SRAM 组。这样做的原因是它允许三个主机同时读/写所有 SRAM 组。总线主控器是矩阵顶部的设备,而总线目标是右侧的设备。只要多个主机不尝试共享目标,STM32F427 上的总线矩阵就允许所有主机同时读取/写入所有目标。最后,上面的点显示了大师可以访问的目标。例如,如果您仔细查看上面的内容,您会发现大多数总线主控器无法访问 AHB1/2 外设 - 只能访问 RAM。

接下来,即使在 STM32F765 ST 上也保留了相同类型的架构:

SMT32F765系统总线

与 STM32F427 系统总线一样,有一个主矩阵和三个可供使用的 SRAM。主系统总线矩阵上有两个 SRAM 以及 DTCM SRAM,所有总线主设备都可以通过 ARM-Cortex-M7 处理器上的 AHB 从端口进行访问。因此,我们的固件最初在 STM32F4/F7 之间大致保持相同。

进入 STM32H7 - 片上系统

现在,STM32H7 与 STM32F4/F7 是完全不同的芯片。虽然STM32 F4/F7 芯片看起来像是非常高性能的微控制器,但 STM32H7 显然是一个片上系统:

STM32H743系统总线

它具有三个系统总线矩阵,以及一个64 位 AXI 总线域(存在三个域,因为每个域都可以关闭以节省电量)。什么是AXI?嗯,它是一种分离事务总线架构,允许主设备以最小化总线资源锁定的方式发出读/写请求。在 AHB 总线上,主设备在完成读/写所需的时间内独占锁定总线。如果一个主机正在执行可能需要很长时间才能完成的读取操作,则另一主机在总线空闲等待读取响应时无法执行写入操作。使用 AXI,每个主设备和目标之间实际上有五个事务通道,用于写入请求、写入数据、写入响应、读取请求和读取响应。这允许目标同时接收多个读/写请求,选择如何处理它们以获得最佳性能,并在不阻塞的情况下响应事务。

显然,使用 AXI,STM32H7 上不会出现带宽问题。它的运行频率为 240 MHz,具有 64 位数据总线,内存带宽为 1.92 GB/s。但是,您就错了,因为并非所有总线主控器都是 AXI 域 - 有些总线主控器仍然属于 AHB 域。

瓶颈

要将 AXI 总线域链接到 AHB 总线域 ST 选择使用 AHB 总线。 D1 到 D2 AHB 总线和 D2 到 D1 AHB 总线允许总线主控器跨域通信。这些 32 位总线以 240 MHz 运行,带宽为 960 MB/s。但是,与 AXI 不同的是,当主设备执行读/写操作时,AHB 总线会被锁定。例如,如果 DMA2 想要从 SDRAM 读取数据,则必须:

  1. 赢得对D2 至 D1 AHB 总线的仲裁访问权。
  2. 使用D2 到 D1 AHB 总线将事务发送到 SDRAM。
  3. 等待 SDRAM 响应(可能需要一段时间 - 数百个时钟)
  4. 通过 D2 到 D1 AHB 总线返回结果

并且...在上述时间内,没有其他总线主控器可以使用D2 到 D1 AHB 总线。如果您还记得上一篇博文,STM32 系列微控制器上的 DMA 引擎只有 16 字节的板载 FIFO 空间。如果这些 FIFO 不断从外设接收数据,则它们无法处理需要很长时间才能完成且不会溢出的读/写操作。因此,如果您尝试将图像数据从相机写入 SDRAM,同时从 SDRAM 拉出另一帧以使用 DMA 发送到 SPI,则会崩溃。

解决方案 - 使用架构特性!

回到我最初的观察,ST 的芯片设计师将 SRAM 块放在不同的域中。这是为了解决这个确切的问题。 DMA1/2 旨在针对外设和 SRAM1/2/3,而 BDMA 旨在针对 SRAM4。通过将 DMA 缓冲区放置在本地 SRAM 组中,您可以显着减少系统总线拥塞,确保您所需的带宽可用。

所以,规则很简单。如果您有一个实时 DMA 事务,则无法通过背压在该 DMA 控制器附近的本地 SRAM 中定位它的 DMA 缓冲区。这样做,事情就会顺利进行。

下周 - MDMA

STM32H7 上还有另一个 DMA 控制器。主 DMA 控制器。在下一篇博客文章中,我将解释如何使用它。

感谢大家的阅读,以上就是全部内容了!