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.
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:
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).
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.
pgvoorhees
Finbarr
Ahorn
CNA
Finbarr
CNA
Ahorn