STM32: Vermeidung von DMA- und CPU-Kollisionen

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 @ Amit einer Anweisung zu - A,A+1,A+2,A+3und 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?

Antworten (2)

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.

Ich möchte hinzufügen, dass der DMA und die CPU nicht gleichzeitig auf dieselben Bits im Speicher zugreifen können , nicht weil eine Art Adressvergleich durchgeführt wird, um zu sehen, ob sich die Bits überschneiden, sondern weil beide Busmaster versuchen, auf dieselben zuzugreifen Bus-Slaves (RAM, FLASH, AHB etc.) gleichzeitig blockieren sie sich gegenseitig und wechseln sich stattdessen ab.
@jms Der Punkt ist, dass sie nicht einmal beide gleichzeitig auf einen Teil des RAM zugreifen können, da nur ein Adressbus zum RAM führt. Von einer Zusammenführung bei Überschneidungen keine Rede. Es ist möglich, den Arbeitsspeicher in zwei Bereiche aufzuteilen, aber das wäre wahrscheinlich nicht auf einem Teil mit geringer Leistung gerechtfertigt.

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

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

Zirkuläre Puffer werden in DMA unterstützt.

Hallo Tony, ich bin mir nicht sicher, ob du meine Frage verstanden hast. Ich weiß, wie es funktioniert (zumindest aus Software-Sicht), aber ich frage, was dieser spezifische zitierte Absatz mit "gleichem Ziel" genauer bedeutet. Ich frage, weil ich wissen möchte, wo ich einen DMA-Puffer im Speicher platzieren soll, damit ich sicher bin, dass die CPU (meine Software) nicht hinter den Kulissen mit dem DMA-Controller kollidiert, der auf diesen Puffer zugreift.
Die Peripherieadressen und DMA-Adressen sind fest codierte Räume. Beide Endbereiche sind für den Zugriff von anderen Prozessen eingeschränkt. Angenommen, ein SPI-DMA-Prozess wird erstellt, dann werden sowohl die SPI-Ports als auch die dem DMA-Puffer zugewiesenen Bereiche von allen anderen Nicht-DMA-Prozessen ausgeschlossen und nur der DMA-Zugriff ist zulässig. Diese Prozesse können verschachtelt werden und der Bus wird von CPU und DMA-Controller gemeinsam genutzt. Wenn Ihr Datenverkehr stoßweise ist, ist der DMA-Modus sinnvoll. Aber wenn es regulär ist, macht DMA keinen Sinn, um in diese Modi einzutreten und sie zu verlassen, was Overhead hinzufügt.