【问题标题】:Cortex-M4 Memory contention (DMA against program)Cortex-M4 内存争用(针对程序的 DMA)
【发布时间】:2017-03-13 22:46:12
【问题描述】:

我正在使用 STM32F4xx 控制器。 我使用 DMA 来缓冲 UART(循环缓冲区)。 我担心的是,当我的程序与 DMA 同时访问相同的内存位置时,是否会发生内存争用。

是否会以这种方式发生争用,或者控制器有措施防止这种情况发生?

谢谢。

【问题讨论】:

  • 争用是什么意思,你认为会发生什么。您可以同时对同一地址进行多笔交易,而内存/外围设备没有理由无法处理。现在肯定有一些例外,但设计良好的芯片会将交易排队,对系统施加背压或使用信用并处理所有交易
  • 争用据我了解,是同时访问同一内存位置(两个 DMA 或 DMA + 程序)。这可能会产生一些故障异常。我担心 DMA 是否会停止。这是我想避免的效果。程序可能会读取 DMA 正在填充的相同位置。
  • 当 CPU 和 DMA 都试图通过 BusMatrix 访问同一个内存块时,就会发生内存争用 - 它不必位于同一个位置。此外,如果有太多外设通过 DMA 传输太多数据,则可能会发生 DMA 争用。

标签: dma cortex-m contention


【解决方案1】:

我在 STM32F401 手册中找到了这个:

BusMatrix 管理主机(CPU、DMA)之间的访问仲裁。仲裁使用循环算法。

由于仲裁,DMA(或 CPU)可能无法(在正确的时间)进行传输。这会导致欠载/溢出错误(在 DMA 中,CPU 将等待)。

如果 DMEIFx 或 FEIFx 标志因溢出或欠载情况而设置,则故障 流不会自动禁用,由软件通过复位 DMA_SxCR 寄存器中的 EN 位来禁用或不禁用流。这是因为发生此类错误时不会丢失数据。

【讨论】:

    猜你喜欢
    • 2020-04-11
    • 1970-01-01
    • 1970-01-01
    • 2020-11-25
    • 1970-01-01
    • 2017-12-03
    • 2020-03-22
    • 2019-12-14
    • 1970-01-01
    相关资源
    最近更新 更多