In Abschnitt 13.4 des STM32-Referenzhandbuchs (für mein STM32F303RE-Board) heißt es:
Der DMA-Controller führt eine direkte Speicherübertragung durch, indem er den Systembus mit dem Cortex-M4 ® F-Kern teilt. Die DMA-Anforderung kann den CPU-Zugriff auf den Systembus für einige Buszyklen stoppen, wenn die CPU und der DMA auf dasselbe Ziel (Speicher oder Peripheriegerät) abzielen.
Meine Frage ist: Wann genau sind in diesem Zusammenhang 2 Speicherziele gleich ? Ist es nur, wenn sich die 2 tatsächlich überlappen (z. B. CPU greift auf 4 Bytes @ A
mit einer Anweisung zu - A,A+1,A+2,A+3
und DMA 1 Byte @ A+2
) oder ist der Speicher in größere Regionen aufgeteilt und die 2 kollidieren, wenn sie auf dieselbe Region zugreifen?
Wenn letzteres der Fall ist, wie groß sind diese Regionen?
Dies bedeutet, dass, wenn sowohl der DMA als auch die CPU auf RAM abzielen, die CPU abhängig davon, wer im Busmatrix-Scheduler an der Reihe ist, gezwungen sein kann, zu warten, bis der DMA an der Reihe ist.
Beispiel: Wenn der DMA eine RAM-RAM-Kopie durchführt und die CPU in ein Peripherieregister liest/schreibt, dann verwenden sie zwei separate Buskanäle und es findet kein Warten statt.
zB Wenn der DMA eine RAM-RAM-Kopie durchführt und die CPU in den RAM liest/schreibt, dann entscheidet die Busmatrix über den Zugriff auf den RAM. Manchmal wartet DMA, manchmal wartet CPU.
Siehe Abschnitt 3.1 des Handbuchs für die Busmatrix-Sachen.
Ich glaube nicht, dass Sie Ihre Puffer in einem Speicher platzieren können, in dem die CPU möglicherweise nicht mit dem DMA konkurriert.
Der DMA bildet hier eine Schnittstelle zwischen Hardware und Speicherports, die für exklusiven Zugriff vorgesehen sind.
Der DMA kann mit den wichtigsten Peripheriegeräten verwendet werden: SPI, I2C, USART, Allzweck-Timer, DAC und ADC mit exklusivem Zugriff auf den zugeordneten DMA-Speicher
Zirkuläre Puffer werden in DMA unterstützt.
jms
Sean Houlihane