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

绩效之路 - 第 3 部分

嗨伙计,

好的!三周内发布三篇博文!谁知道我有时间。

第 3 部分 - 主 DMA 控制器

上周我谈到了 DMA 内存缓冲区局部性的重要性,以及将 SRAM 中的 DMA 内存缓冲区放置在与 DMA 控制器相同的 AHB 矩阵区域中。然而,SRAM 的大小有限。如何将 SRAM 缓冲区中的数据块移动到 SDRAM 中更大的缓冲区中?当然,您可以使用处理器,但是,使用 STM32H7,您可以访问主 DMA 控制器来为您执行此操作,而无需加载 CPU。

主 DMA (MDMA) 控制器是 STM32H7 上的高性能 DMA 控制器,与 STM32 微控制器上的标准 DMA 控制器相比,具有更多的数据移动功能。特别是,当其他 DMA 控制器完成数据移动时,它可以触发其他 DMA 控制器,使其像微型处理器一样工作,中断 memcpy() 数据从一个缓冲区到另一个缓冲区的传输。

我们如何在STM32H7上使用它

与 STM32H7 上的许多硬件一样,解释模块的功能并不能真正提供有关如何使用它们的任何见解。因此,我将解释我们的相机驱动程序如何使用 MDMA 为 CPU 实现 100% 的图像捕获卸载。系好安全带!

使用 DMA 进行线路捕获

我们的新相机图像捕获驱动程序相当复杂。去年我们确实将其发挥到了极致。但是,这里可以非常直接地解释我们如何使用 MDMA。首先,我们使用 DMA 控制器接收来自相机的像素线。行被一遍又一遍地加载到相同起始地址的相同内存缓冲区中。

DCMI 至行缓冲器

正如之前的博客文章中提到的,我们必须遵循 DMA 控制器的所有内存对齐和数据大小规则。因此,行缓冲区是 16 字节对齐的,我们以 16 字节块的形式移动图像以使 DMA 控制器满意(但是,每行我们只需 4 字节对齐,但总图像必须为 16-字节对齐)。

也就是说,当您想要每行裁剪超过 4 字节的像素时,为了实现架构上高效的裁剪,我们告诉 DCMI 硬件删除每行的前 1-3 个字节,以确保裁剪图像的第一个像素位于 32 位边界上。完成此操作后,我们只需更改要抓取像素的起始地址即可使用 MDMA 裁剪图像,同时能够保持 4 字节对齐,这对于保持 32 位 AHB 总线上的性能至关重要。

DCMI 硬件还负责通过在起始行之前和结束行之后删除行来垂直裁剪图像。因此,与上述技巧一起,图像裁剪完全卸载到硬件上。

MDMA 到帧缓冲区

MDMA 到帧缓冲区

接下来,MDMA 将图像的每一行移动到帧缓冲区。如上所述,为了处理裁剪,我们只需对 MDMA 进行编程,其中包含需要移动的行数、每行的大小以及行缓冲区中的起始地址偏移量。然后,它会在每次 DMA2 完成图像的行传输时触发,从而完成剩下的工作。一旦 MDMA 控制器完成,它就会生成一个传输完成中断,让我们知道它已完成写入图像!

现在,MDMA 的真正魔力在于其 memcpy() 功能。图像数据并不总是可以直接使用。特别是,某些相机向我们发送字节反转的 RGB565 像素,处理器通常必须对其进行字节反转。但是,STM32H7 设计人员预见到了这个问题,并赋予 MDMA 控制器对其正在移动的数据进行字节反转、半字反转和字反转的能力!

接下来,有时我们必须从 YUV422 图像中提取 Y 通道,以便从相机中获取灰度图像。这需要相当多的处理器带宽,因为它不能非常有效地完成。但是,MDMA 也可以做到这一点!它支持灵活的源和数据大小增量,允许我们对其进行编程,以每两个字节抓取一个字节,以从 YUV422 图像中提取 Y 通道(YUV422 图像以重复的 YUYV 字节模式组织)。

最后,MDMA 最好的部分是它比常规 STM32 DMA 控制器智能得多。 根据行字节偏移和宽度,我们最佳地选择源/目标数据/增量/突发大小,以尽可能高效地使用系统总线移动数据

总结一切

图像完全传输后,我们将其放入灵活的帧缓冲区架构中(使用指针)。处理器必须完成这部分工作。然后,当 DCMI 硬件接收到新图像时,我们重新开始该过程以接收下一帧。所有这一切都在我们运行您的代码时在后台发生。在三重缓冲模式(这是 OpenMV Cam H7 Plus、OpenMV PureThermal 和 Arduino Portenta H7 上的默认模式)下,我们能够在后台持续接收图像并将图像存储到 SDRAM,而处理器开销实际上为零。然后,当您调用 snapshot() 时,您只需将帧缓冲区设置为指向捕获的最新帧,以确保您拥有最新的图像(同时必须使图像所在的缓存无效)字节对齐和 32 字节多图像缓冲区)。

无论如何,感谢您的阅读!这就是大家!

(OpenMV PureThermal 怎么样?本周我没有任何关于它的新更新。不过,请在 GroupGets 上支持它!新的高性能相机驱动程序架构是由像 GroupGets 这样投资 OpenMV 的公司实现的。支持我们和 GroupGets支持OpenMV PureThermal )。