UART-Empfang + DMA

Als ich etwas über DMA lernte, erfuhr ich, dass es auch in UART-Peripherieoperationen implementiert werden kann. Bisher habe ich UART-Peripheriegeräte für einfache Kommunikationsvorgänge verwendet. Manchmal verwende ich es für Projekte, die auf dem Modbus-Protokoll basieren. Abgesehen von einfachen Projekten verarbeite ich in Modbus-Protokollprojekten ständig jedes über den UART-Empfangsinterrupt empfangene Byte, um die weitere Verarbeitung schnell oder mit sehr minimaler Verzögerung durchzuführen.

Aber DMA erklärt, dass es einen CPU-Interrupt auslösen kann, nachdem der gesamte Puffer / die Hälfte der Puffer nur gefüllt wurde. Außerdem gibt es eine Situation, in der ich nicht weiß, wie viele Daten über den UART-Empfang kommen. Wenn ich nur 4 Bytes erhalte, muss ich sie verarbeiten. Wenn ich 120 Bytes zur Verarbeitung erhalten soll, muss ich darauf warten. Also hier ist die Länge zumindest bei meinen Anforderungen nicht konstant. Die Verwendung von DMA mit UART erfordert jedoch meines Wissens eine konstante Byteanzahl. Also habe ich die Idee verworfen, DMA in Modbus-basierten Kommunikationsprojekten zu verwenden. Ist es richtig?

Die Verwendung von DMA-freier CPU belastet jedoch mehr als eine normale Interrupt-Methode. Aber in welchen Anwendungen kann ich es verwenden? In welchen Anwendungen ist das UART + DMA-Konzept besser geeignet als die normale UART-Interrupt-Methode? Wenn es einen Anwendungslink oder Beispiele gibt, ist das hilfreich.

Überprüfen Sie, ob Ihr UART-Modul einen IDLE LINE-Interrupt hat. Dieser Interrupt kann verwendet werden, um den Randfall abzufangen, bei dem es weniger DMA-Übertragungen gibt als die Anzahl, die für einen COMPLETE- oder HALF COMPLETE-DMA-Interrupt erforderlich ist.
Paketbasierte Protokolle, bei denen Sie die ersten paar Bytes mithilfe von Interrupts empfangen können, bis Sie eine Länge erhalten, die Sie in den DMA-Controller programmieren können, um den Rest zu erhalten. Das Einsparen von CPU-Belastung ist jedoch nur dann wirklich nützlich, wenn Sie sie für etwas anderes verwenden müssen.
@Finbarr Tolles "aber" :) Die Komplizierung der Implementierung nur um der Sache willen ist normalerweise die Hauptquelle für Fehler und Kopfschmerzen beim Debuggen.
@Finbarr, danke für den Kommentar. Was meinst du mit "etwas anderes"?
Sagen Sie mir, Sie haben die Entlastung der CPU erwähnt. Es hängt davon ab, was Ihr System sonst noch tut.
@Finbarr, ich frage nicht nach einem bestimmten System. Ich frage nach bestimmten Anwendungen, in denen die Kombination UART Rx + DMA verwendet werden kann. Nur auf diese Weise habe ich Ihren Kontext „etwas anderes“ erwähnt.
@CNA, während Ihre ursprüngliche Frage MODBUS erwähnte, war alles in Ordnung. Aber mit jedem Kommentar hier bewegen Sie sich von den spezifischen Anwendungsanforderungen in die Zone „Ich habe keine Ahnung, wonach ich frage“.

Antworten (2)

Sie haben die Hardware nicht angegeben und in der gesamten Frage "CPU" verwendet. Da Sie jedoch auch halbe/vollständige Interrupts erwähnt haben, gehe ich davon aus, dass Sie tatsächlich über MCU sprechen.

Die Verwendung von DMA mit UART erfordert eine konstante Byteanzahl

Nicht wirklich. Die Kombination aus zyklischem DMA-Modus + halben/vollständigen/leeren Interrupts ermöglicht es Ihnen, Frames beliebiger Länge zu verarbeiten. Für die Hardware, die Leerlauf-Interrupts nicht unterstützt, gibt es alternative Implementierungen, wie die Verwendung eines Leerlauf-Timers mit Rx-Leitung, die mit dem Timer-Reset-Eingang verdrahtet ist.

Dieses Tutorial bietet eine großartige Zusammenfassung verschiedener DMA-Methoden. Möglicherweise finden Sie auch AN3109 von ST nützlich.

In welchen Anwendungen ist das UART + DMA-Konzept besser geeignet als die normale UART-Interrupt-Methode?

So ziemlich jede paketbasierte Kommunikation (einschließlich Modbus) kann von DMA profitieren. Die Ausnahmen sind:

  • Wenn Ihre Kommunikation nur aus wenigen Bytes besteht, die mit langen Leerlaufperioden dazwischen gesendet werden, wird das Einrichten und Verarbeiten von DMA die Software unnötig verkomplizieren;
  • Wenn in zeitkritischen Anwendungen der Empfang bestimmter Bytes (z. B. EOF) eine sofortige Reaktion erfordert, kann die Verwendung von DMA zu einer inakzeptablen Latenz führen;
  • Wenn Ihre Anwendung nichts anderes zu tun hat, wenn keine Daten zu verarbeiten sind UND die MCU schnell genug ist, um einen kontinuierlichen Bytestrom mit maximaler Bandbreite einzeln zu verarbeiten, führt die Verwendung von DMI zu unnötiger Komplexität.

Grundsätzlich sollten Sie bei der Entscheidung, ob Sie DMA verwenden oder nicht, dies berücksichtigen - die Datenverarbeitung dauert sowieso genau die gleiche Anzahl von Zyklen. Die Verwendung von UART-Interrupts fügt dem IRQ-Eintritt/Austritt Overhead pro Byte hinzu . Die Verwendung von DMA fügt den gleichen Overhead hinzu, aber nur zu halben/vollständigen/leeren Pufferunterbrechungen. Daher spart Ihnen jeder Puffer, der länger als zwei Bytes ist, theoretisch einige Zyklen (in Wirklichkeit bräuchten Sie etwas längere Puffer, um die Vorteile zu sehen).

Danke für die Antwort. Ich verwende Piccontroller. Können Sie genauer auf die paketbasierte Kommunikation eingehen, bei der das UART+DMA-Konzept verwendet wird?
Ich weiß nicht, wie ich genauer sein kann. Ich habe Ausnahmen aufgeführt, wenn die Verwendung von DMA nicht vorteilhaft ist, und ich habe erklärt, wie sich die Puffergröße auf die Kommunikationsüberlastung auswirkt. Ich habe auch ausdrücklich MODBUS erwähnt, das Sie zu verwenden scheinen.
Der Tutorial-Link ist defekt. Es weist auf diese Frage hin.
@Harvey Ich habe den Link korrigiert, danke.

Wenn es Beendigungszeichen gibt, können Sie nach diesen suchen, da einige MCUs einen Zeichenübereinstimmungs-Interrupt haben.

Viele Protokolle haben auch ein Byte, das die Länge der Nachricht angibt, das sich an einem vorhersagbaren Punkt relativ zum Anfang der Nachricht befindet. Sie können dies verwenden, um zu wissen, wann eine vollständige Nachricht abgeschlossen ist und wie viele Bytes für diese Nachricht analysiert werden müssen, bevor Sie auf die nächste Nachricht im Puffer stoßen.

Andernfalls könnten Sie einen Timer haben, der gelegentlich die letzten n ungeprüften empfangenen Bytes nach etwas durchsucht, das eine vollständige Nachricht anzeigt. Oder starten Sie die Verarbeitung, wenn für eine bestimmte Zeit keine Bytes empfangen werden, was auch das Ende einer Übertragung bedeuten könnte.

Aber wenn Sie wirklich jedes einzelne Byte prüfen müssen, wenn es ankommt, dann macht ein DMA keinen Sinn.