绩效之路 - 第 1 部分
嗨伙计,
通常我更专注于添加新功能而不是博客。但是,我们在底层做了很多更改,以便为图像捕获启用三重缓冲,我想分享!但首先...
PureThermal OpenMV 活动已更新!
Group 更新了PureThermal OpenMV Cam 活动!现在有更多关于该产品的信息。完整的功能列表、原理图、电路板轮廓等均已发布!我们在产品中投入了大量的爱和精力,如果您能支持它,我们将不胜感激!它是迄今为止功能最齐全的 OpenMV Cam。请观看我在下面解释的视频:
目前价格有点高,但是,一旦芯片短缺得到缓解(现在零件的价格不会高出 2 倍以上)并且产量增加,我们希望能够降低该功能丰富的系统的价格。 请立即支持 PureThermal OpenMV !
现在,是时候深入探讨今天的技术主题了。
第 1 部分 - 内存对齐
当我们第一次开始开发 OpenMV Cam 时,我们正在研究 STM32F4 架构。与其他微控制器一样,该架构以 Cortex-M4 为系统核心。 Cortex-M4 是一款直接的处理器,可以一次读/写 8/16/32 位,没有副作用,使编码变得容易。你编程什么,你就得到什么。以至于我们在开发大部分原始代码时都假设我们只需要在分配内存时保持 4 字节对齐,或者可能需要 8 字节来支持 64 位值。
输入 DMA(直接内存访问)
DMA 控制器是一个棘手的野兽。我们的原始固件直到最近才避免使用它们。如果您最近一直在编写微控制器固件,您可能也避免使用它们。它们对于大多数应用程序来说都是多余的——处理器通常可以完成您需要做的所有事情。但是,如果你也像我们一样避免它们,那么你就会失去大量的性能。在应用程序中使用 DMA 控制器并不简单。您首先需要解决一个巨大的挑战,它会无限期地困扰您 -内存对齐。
在 STM32 系列微控制器上,DMA 控制器具有 16 字节深的 FIFO,可以保存 4 个 32 位值、8 个 16 位值或 16 个字节。 DMA 控制器的工作方式是,先将来自相机接口等外设的数据一次填充 32 位,然后将其内部 FIFO 刷新到内存。现在,DMA 控制器并不复杂。它们在硬件的系统总线级别上工作。这意味着,它们不会像 Cortex-M4 处理器那样自动抽象出复杂性来让您的生活更轻松。特别是,使用 STM32 DMA 控制器时必须遵循两条规则:
- AHB 总线允许 4、8 或 16 节拍的突发事务(这些是最有效的事务类型,因为每个元素的地址仲裁可以将总线带宽削减一半或更多)。这直接与DMA 控制器的 FIFO 可以保存的 4 个 32 位值、8 个 16 位值或 16 个字节相匹配。因此,为了获得最佳性能,您需要将数据缓冲区设置为上述值的倍数……即 16 字节。
- AHB 总线将所有突发事务包装在 1KB 边界处。为了避免这种情况发生,我们必须确保决不允许突发事务跨越 1KB 边界。幸运的是,这非常简单,因为我们总是传输 16 字节...所以我们只需要确保我们的内存缓冲区是 16 字节地址对齐的,这将确保我们永远不会跨越 1KB 边界。
如果遵循以上两条规则,那么DMA在STM32上就很容易使用了。它将按预期工作,不会有太大麻烦。但是……这说起来容易做起来难,就好像您在不尊重这两条规则的情况下开发了大量代码一样,那么您将需要像我们尝试打开 DMA 时一样进行大量工作。
进入 Cortex-M7 和缓存
但是,OpenMV Cam M7/H7 由具有缓存功能的 Cortex-M7 提供支持!缓存自动使您的代码运行速度更快 - 但是,将其与 DMA 一起使用具有挑战性。因为,虽然它向您隐藏了很多系统复杂性,但它不能很好地与 DMA 硬件配合使用。
Cortex-M7 上的缓存通过读取/写入大小为 32 字节的缓存线来工作。注意它只能读/写缓存线。因此,无论何时读/写,它始终是与 32 字节对齐的 32 字节块地址。
此外,作为缓存,根据定义,它仅在缓存中尚不存在某些内容时才读取主内存,并且仅在必须从缓存中刷新一行(或多行)时才写入主内存。因此,DMA 对主内存的更新是不可见的,除非您使覆盖 DMA 正在写入的内存缓冲区的高速缓存无效,以强制高速缓存读取更新的内存。同样,处理器写入对于 DMA 来说是不可见的,除非将缓存刷新到 DMA 要读取的内存缓冲区。虽然更复杂的微处理器在硬件中内置了缓存一致性来为您处理此问题,但 Cortex-M7 却没有,因此您必须自己处理它。
无论如何,考虑到缓存行规则,我们必须再次扩展内存分配要求。也就是说,内存缓冲区的大小必须是 32 字节的倍数,并且必须是 32 字节地址对齐。如果您遵循此规则,那么使用 Cortex-M7 和 DMA 就会变得轻而易举。一切都会顺利!
并且...如果您不这样做,您将遇到一些由代码中的缓存和 DMA 控制器之间的竞争条件产生的最具挑战性的错误。
下周 - DMA 缓冲区局部性
您知道 STM32H7 是 SoC(片上系统)吗?下周我们将讨论 DMA 缓冲区局部性及其对性能的影响。
感谢大家的阅读,以上就是全部内容了!