В разделе 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 сталкиваются, когда они обращаются к одной и той же области?
Если второе, то насколько велики эти регионы?
Это означает, что если и DMA, и ЦП нацелены на ОЗУ, в зависимости от того, чья очередь в планировщике матрицы шины, ЦП может быть вынужден ждать завершения очереди DMA.
Например, если DMA выполняет копирование ram-ram, а CPU читает/записывает в периферийный регистр, то они используют два отдельных канала шины и ожидания не происходит.
Например, если DMA выполняет копирование ram-ram, а CPU читает/записывает в ram, тогда Busmatrix разрешает доступ к ram. Иногда DMA будет ждать, иногда CPU будет ждать.
См. раздел 3.1 руководства, посвященный шинной матрице.
Я не думаю, что вы сможете разместить свои буферы в памяти, где ЦП может не конкурировать с DMA.
Прямой доступ к памяти здесь представляет собой интерфейс аппаратного обеспечения с портами памяти, предназначенными для монопольного доступа.
DMA может использоваться с основными периферийными устройствами: SPI, I2C, USART, таймерами общего назначения, ЦАП и АЦП с эксклюзивным доступом к отображаемой памяти DMA.
Циклические буферы поддерживаются в DMA.
джмс
Шон Хулихейн