STM32: предотвращение коллизий DMA и ЦП

В разделе 13.4 справочного руководства STM32 (для моей платы STM32F303RE) говорится:

Контроллер прямого доступа к памяти выполняет прямую передачу памяти, используя системную шину совместно с ядром Cortex-M4®F. Запрос DMA может остановить доступ ЦП к системной шине на несколько циклов шины, когда ЦП и DMA нацелены на одно и то же место назначения (память или периферийное устройство).

Мой вопрос: когда именно 2 места назначения памяти одинаковы в этом контексте? Это только тогда, когда 2 действительно перекрываются (например, ЦП обращается к 4 байтам @ Aс одной инструкцией - таким образом, получая доступ A,A+1,A+2,A+3- и DMA 1 байт @ A+2) или память разделена на более крупные области, и 2 сталкиваются, когда они обращаются к одной и той же области?

Если второе, то насколько велики эти регионы?

Ответы (2)

Это означает, что если и DMA, и ЦП нацелены на ОЗУ, в зависимости от того, чья очередь в планировщике матрицы шины, ЦП может быть вынужден ждать завершения очереди DMA.

Например, если DMA выполняет копирование ram-ram, а CPU читает/записывает в периферийный регистр, то они используют два отдельных канала шины и ожидания не происходит.

Например, если DMA выполняет копирование ram-ram, а CPU читает/записывает в ram, тогда Busmatrix разрешает доступ к ram. Иногда DMA будет ждать, иногда CPU будет ждать.

См. раздел 3.1 руководства, посвященный шинной матрице.

Я не думаю, что вы сможете разместить свои буферы в памяти, где ЦП может не конкурировать с DMA.

Я хотел бы добавить, что DMA и ЦП не могут одновременно обращаться к одним и тем же битам в памяти не потому, что выполняется какое-то сравнение адресов, чтобы увидеть, перекрываются ли биты, а потому, что если оба мастера шины пытаются получить доступ к одному и тому же ведомые устройства шины (RAM, FLASH, AHB и т. д.) в то же время будут блокировать друг друга и вместо этого будут работать по очереди.
@jms дело в том, что они не могут одновременно получить доступ к какой-либо части ОЗУ, потому что в ОЗУ идет только одна адресная шина. Ни о каком слиянии не может быть и речи, когда есть наложение. Можно разделить оперативную память на две области, но это, вероятно, не будет оправдано для низкопроизводительной части.

Прямой доступ к памяти здесь представляет собой интерфейс аппаратного обеспечения с портами памяти, предназначенными для монопольного доступа.

DMA может использоваться с основными периферийными устройствами: SPI, I2C, USART, таймерами общего назначения, ЦАП и АЦП с эксклюзивным доступом к отображаемой памяти DMA.

  • 0x4002 0400 - 0x4002 07FF (1K) DMA2
  • 0x4002 0000 - 0x4002 03FF (1K) DMA1

Циклические буферы поддерживаются в DMA.

Привет, Тони, я не уверен, что ты понял мой вопрос. Я знаю, как это работает (по крайней мере, с точки зрения программного обеспечения), но я спрашиваю, что более точно означает этот конкретный цитируемый абзац под «тот же пункт назначения». Я спрашиваю, потому что хотел бы знать, где разместить буфер DMA в памяти, чтобы я был уверен, что ЦП (мое программное обеспечение) не сталкивается за кулисами с контроллером DMA, обращающимся к этому буферу.
Адреса периферийных устройств и адреса DMA являются жестко закодированными пробелами. Оба конечных диапазона имеют ограниченный доступ для других процессов. Итак, скажем, процесс SPI DMA создан, тогда как порты SPI, так и назначенные диапазоны буфера DMA ограничены для всех других процессов, отличных от DMA, и разрешен только доступ DMA. Эти процессы могут чередоваться, а шина совместно используется процессором и контроллером прямого доступа к памяти. Если у вас пульсирующий трафик, тогда имеет смысл использовать режим DMA. Но если это регулярно, то DMA не имеет смысла входить и выходить из этих режимов, что добавляет накладные расходы.