DMA im Allgemeinen und im Besonderen

    Wenn ich wüsste, wohin du fallen würdest, würde ich Strohhalme legen

    Über die Existenz von DMA (Direct Memory Access) - russischsprachigem DAP (Direct Access to Memory), haben viele Entwickler von eingebetteten Geräten gehört, aber jetzt verwenden sie es viel weniger, als es (DAP) verdient. Übrigens, ich werde diese Abkürzung erwähnen, aber nicht, weil ich so ein hartnäckiger Patriot und ein Gegner der Anleihe in englischer Sprache bin, sondern nur, weil ich zu faul bin, das Tastaturlayout noch einmal zu wechseln.

    Die Hauptgründe für die unzureichende Verwendung von DAP in MK-Programmen sind drei: 1) die relative Komplexität dieses Geräts, die zusammen mit 2) einem mangelnden Verständnis der Vorteile seiner Verwendung dazu führt, dass das Gerät nur ungern erlernt und beherrscht wird (wie es in solchen Fällen heißt, bestellt die ältere Schwester nicht - für diejenigen Wer im Tank ist über die Faulheit, die wir vor) geboren wurden, belastet 3) das Fehlen von guten und verständlichen Beispielen für die Verwendung des MPD in den mit MK gelieferten Handbüchern. Und wenn die ersten beiden Gründe eindeutig subjektiver Natur sind, ist der dritte zweifellos objektiv und der Paranoide erwacht in mir und besteht darauf, dass dies speziell getan wurde, um zu verhindern, dass einheimische MK - Entwickler ein fortgeschrittenes Level erreichen, irgendwo über 60 (was darunter leidet) und andere Entwickler auf der ganzen Welt, paranoid ignoriert,

    Trotzdem, ohne Witze, gibt es in den Beispielen bestenfalls ein Modul zum Einrichten eines einzelnen RAP-Kanals, und Sie werden in Anwendungsbeispielen kein verknüpftes System mit dem RPS-Treiber finden (auch in CMSIS gibt es keinen objektiven Grund - ich werde einen Beitrag darüber schreiben ihn - ich werde erwähnen). Warum das so ist - ich weiß es nicht, aber die Kristallentwickler wissen es besser. Die einzige vernünftige Rechtfertigung, die mir in den Sinn kommt, ist, dass die RAPs sehr spezifisch sind. "Sie können es also nicht einfach abrufen und annehmen", um den Code aus einer anderen Quelle zu übertragen, sondern im Hinblick auf Die geringe Nachfrage nach RAP in realen Entwicklungen, das Fehlen solcher Beispiele, wird nicht als wesentlicher Nachteil angesehen. Um die von mir angegebene Wissenslücke zu schließen, ist dieser Beitrag gedacht (eine unbescheidene Aussage, aber wenn Sie sich nicht selbst loben, gehen Sie die ganze Zeit wie ein Spieß)

    Dennoch muss ich den ungeduldigen Leser warnen, dass er hier keine Silberkugel finden wird, die sicher in seine Entwürfe aufgenommen werden kann, sondern nur (aber das ist eine Menge) einige Gedanken und Ansätze finden wird, die ihm den Aufbau seiner eigenen Systeme auf MK mit erleichtern Anwendung des RAP. Das heißt, ich werde die Flaggen an den Stellen anbringen, an denen der Rechen genau liegt, aber ich kann nicht garantieren, dass es keinen nicht markierten Rechen gibt, was Sie jedoch nicht daran hindert, die Flaggen in die Feigen zu werfen und den Rechen selbst zu laufen. Im Allgemeinen müssen diejenigen, die meine Beiträge lesen, bemerkt haben, dass ich mich nicht darauf konzentriere, WAS und WIE genau zu tun ist, sondern darauf, warum ich genau das empfehle.

    Daher ist DAP ein Teil der MK-Ausrüstung, mit der Daten zwischen verschiedenen Komponenten eines bestimmten MK (und eines Systems mit seiner Beteiligung) gesendet werden können, ohne dass Prozessorressourcen angezogen werden (genauer gesagt, mit minimalem Aufwand, da etwas in einem MK-System im Allgemeinen OHNE Prozessorbeteiligung ausgeführt wird - ein kühner und weitreichender Gedanke).

    Die Hauptidee dieser Geräte ist, dass bei der Ausführung eines Programms nicht jeder Befehl einen Systembus zu externen Geräten oder zum RAM aufruft (der Zugriff auf den Programmspeicher wird nicht berücksichtigt). Daher hat ein Gerät, das den Systembus bedient, Leerlaufzyklen, die es wäre schön etwas zu benutzen.

    Ein weiterer Grund für die Erstellung von RAPs war das Aufkommen von Hochgeschwindigkeits-Eingabe- / Ausgabegeräten, für deren Wartung beim Abruf eine erhebliche Prozessorzeit erforderlich war und ein Interrupt-Service fast unmöglich war. Der Vorläufer eines RAP sollten die sogenannten Peripherieprozessoren in der Mainframe-Architektur mit lokalem Speicher sein, die dann in echte RAPs umgewandelt wurden, die Datenübertragungsprobleme zwischen Hochgeschwindigkeits-Eingabe- / Ausgabegeräten und dem Arbeitsspeicher lösen und Teil der Hardware sind, die ein bestimmtes externes Gerät steuert.

    Es gab ein Bild (zum Beispiel in DCK), als eine WU nach dem RAP arbeitete und die zweite - nach Unterbrechungen oder sogar im Abfragezyklus (MX-Treiber, falls sich jemand erinnert). Als die ersten MCs auftauchten, in denen der Speicher in den Chip integriert ist, wurde die Erstellung externer Geräte in Bezug auf den Chip mit DAP zu einer sehr nicht trivialen Aufgabe, und natürlich wanderte der DAP in den MK und wurde Teil seiner Architektur. Dieser Prozess verlief nicht linear in progressiv und kann als MK basierend auf der 51. Architektur mit Unterstützung für DAP und MK basierend auf Cortex-M3 mit einem umfangreichen Satz an Peripheriegeräten, jedoch ohne Unterstützung für DAP (zum Beispiel Stellaris) gefunden werden. DAP ist jedoch in den meisten modernen MCs, die auf ARM basieren, vorhanden, und wir können sie weiter untersuchen und zunächst ihre Merkmale berücksichtigen.

    Wie oben erwähnt, besteht der Hauptzweck des RAP darin, Daten zwischen verschiedenen Geräten mit minimaler Beteiligung des Prozessors zu übertragen. In der Regel ist eines dieser Geräte der Hauptspeicher von MK, obwohl es manchmal möglich ist, zwischen zwei externen Geräten zu wechseln, also von Speicher zu Speicher. Einige RAPs unterstützen solche Funktionen, andere nicht. Dies sollte bei der Auswahl eines MK berücksichtigt werden.

    Das nächste wichtige Merkmal ist die Anzahl der gleichzeitig übertragenen Übertragungskanäle - in dem Sinne, dass natürlich zu jedem Zeitpunkt nur ein Datenelement auf dem Bus übertragen werden kann, aber es können mehrere Anforderungen vorhanden sein, die abwechselnd wieder zu minimalen Kosten der Prozessorressourcen verarbeitet werden. Natürlich beträgt die Mindestanzahl der MAP-Kanäle -1 (weniger Kanäle sind wahrscheinlich nicht betriebsbereit), das Maximum ist nahezu unbegrenzt, die tatsächliche Grenze kann die Anzahl der externen Geräte + 1 (für Anforderungen vom Typ Speicher-Speicher) sein, aber nichts (außer den Kosten) kann stören mache uns beliebig viele Kanäle des RAP.

    Das nächste Merkmal kann als Anforderungsservicemechanismus in einem Kanal angesehen werden. Lassen Sie uns näher auf diesen Punkt eingehen und die Funktionsweise einer Anfrage eines Kanals des RAP allgemein analysieren.

    Um eine Übertragung durchführen zu können, müssen wir den RAP über unsere Absichten informieren, d. H. Woher wir Daten übertragen möchten, wohin sie gesendet werden sollen, wie viele Daten übertragen werden sollen, Übertragungsmodi (dazu später mehr) und möglicherweise Serviceinformationen. Wir können diese Informationen entweder in den Registern ablegen, die für den Betrieb des DAP verantwortlich sind (die veraltete Methode und wir werden später verstehen, warum), oder im RAM des Systems. In letzterem Fall sollte es sich entweder um einen speziell zugewiesenen Speicherbereich handeln, damit der DAP weiß, wo er die Informationen erhält , oder Informationen darüber, wo genau sich die Daten im Hauptspeicher befinden (in der üblichen Sprache sollten wir einen Link setzen), sollten in ein Register des RAP gestellt werden. Es ist die letztere Methode, die verwendet wird, da sie die folgenden Vorteile hat:

    Nachdem die angegebene Übertragung abgeschlossen ist, erhalten wir ein Signal über das Ende der Übertragung (höchstwahrscheinlich in Form eines Interrupts) und müssen möglicherweise die nächste Übertragung so schnell wie möglich starten. Wenn wir die Übertragungsparameter in den Registern einstellen, können wir sie entweder nicht vor dem Ende der aktuellen Übertragung ändern oder Schattenregister erstellen. Wenn das Register eine Verknüpfung zu den Daten enthält, die die Übertragung definieren (TCB - Transfer Control Block - Übertragungssteuereinheit-BUP), können wir die BUP für die nächste Übertragung im Voraus für die nächste konfigurieren und am Ende der aktuellen Übertragung nur die Verknüpfung im RAP-Register ändern .

    In der Praxis gibt es eine Vielzahl kombinierter Schaltkreise, hauptsächlich mit dem Ziel, MK-Geräte zu sparen - einen Zeiger auf einen Speicherbereich, der zwei oder mehr ECUs enthält, die während der Ausführung durchlaufen, einen Zeiger auf die nächste ECU im Servicefeld der aktuellen ECU, hierarchischer Zugriff, wenn die ECU enthält Anzeigen der Reihenfolge der BUP, die tatsächlich ausgeführt werden und so weiter.

    In den oben genannten Fällen benötigen wir auch ein spezielles Tag, das den Abschluss aller aktuell angeforderten Übertragungen anzeigt, die zu den Serviceinformationen gehören. Neben anderen Dienstinformationen gibt es häufig Tags, die den Übertragungsmodus angeben (Bittiefe der übertragenen Daten, Schritt und Richtung der Änderung der Adressen von Empfänger und Absender, Informationen für das Speicherverwaltungsmodul ...).

    Gehen wir nun von der Betrachtung des RAP im Allgemeinen zur Betrachtung einer spezifischen Implementierung über, nämlich des MK der Firma Milander 1986VE1T.

    Warum zu ihm? Erstens arbeite ich mit ihm, zweitens verfügt er über eine ausreichende MPD-Kapazität und drittens über umfangreiche Funktionen (dies ist kein Fehler, diese Funktion ist so ein Ja, ja, sie gehört zu dieser Kategorie) Die Arbeit mit MK ist eine aufregende Aktivität, nach der die Arbeit mit Analoga namhafter Hersteller einfach und unkompliziert erscheint.

    Erstens die gute Nachricht - der PDP unterstützt 32 unabhängige Zugriffskanäle - einen für jedes externe Gerät als Teil des MK und einen für Speicher-Speicher-Übertragungen. Darüber hinaus unterstützt der PDP, wie Sie bereits aus dem vorhergehenden Satz verstanden haben, alle möglichen Weiterleitungsmodi: WU-Speicherregister, WU-Register, WU-Register, Speicher, und wenn es Ihnen so vorkommt, ist dies vollständig nicht so, und verschiedene Modi funktionieren etwas anders und sind nicht immer implementiert.

    Darüber hinaus unterstützt der PDP verschiedene Datenformate: 1 Byte, 2 Byte und 4 Byte (ein Wort in unserer Architektur) sowie verschiedene Arten der Adressinkrementierung von Quelle und Empfänger getrennt: 1, 2 und 4 (Dekrementierung wird nicht unterstützt). Der RAP verfügt über ein Arbitrierungssystem für bediente Kanäle mit der Möglichkeit, jedem Kanal flexible Prioritäten zuzuweisen, sowie eine konfigurierbare elementare Transaktionsgröße (die Anzahl der Übertragungen eines Kanals, für die eine Arbitrierung durchgeführt wird). Zusätzlich kann jeder Kanal bis zu 2 MCUs haben, die durch ein zyklisches System ersetzt werden können oder in einem hierarchischen Modus arbeiten. Gleichzeitig ist auch ein einzelner Modus möglich.

    Sagen wir, um das Gleichgewicht zu halten, weniger gut. Nochmals zur Dokumentation - wenn Sie nicht wissen, wie der RAP funktioniert, dann werden Sie anhand der Dokumentation des Unternehmens definitiv nichts darüber wissen. Die Dokumentation ist klar übersetzbar, es gibt Übersetzungsfehler, die die Bedeutung stark verfälschen, es gibt auch sehr unhörbar beschriebene Stellen, aber im Allgemeinen kann es für einen geschulten Entwickler ausreichen, wenn Sie es gewohnt sind, für den Autor zu mutmaßen. Von den bedeutenderen Nachteilen (natürlich im Vergleich zum idealen Gerät) - erhebliche Busressourcenkosten (6 Zugriffe pro 1 Übertragung, obwohl ich vielleicht etwas falsch verstanden habe) und eine Reihe von Funktionen, über die etwas später.

    Und hier warten wir auf:

    Hinterhalt # 1 von Entwicklern - Unterbrechung vom Ende der Übertragung nicht in externen Geräten angezeigt. Das heißt, wir haben einen Unterbrechungsvektor am Ende der Transaktion von einem der programmierten Kanäle. Darüber hinaus gibt es kein Register, in dem die Nummer des Kanals gespeichert ist, der die Transaktion abgeschlossen hat, oder zumindest ein Bitregister mit Flags. Das heißt, die einzige Möglichkeit, die Nummer des Kanals zu bestimmen, der die Übertragung abgeschlossen hat, besteht darin, alle Kanäle zu sortieren und die entsprechenden Felder des TCB zu überprüfen. Dies müssen wir im Interrupt-Handler durchführen, was so wenig Zeit wie möglich in Anspruch nehmen sollte. Die naheliegende Lösung - die Kanalsuche auf die untere Hälfte des Verarbeitungstreibers zu übertragen, funktioniert nicht, weil wir auf Folgendes warten:

    Hinterhalt Nr. 2 von den Entwicklern - die Unterbrechung ist möglich und wir können den Betrieb der oberen Hälfte nicht stoppen, ohne sie explizit fallen zu lassen. Darüber hinaus gibt es auch einen

    Hinterhalt Nummer 3 von ihnen - wir können den Interrupt nicht durch Manipulieren der RAPs zurücksetzen, sondern müssen die Berechtigung zum Generieren von Abfragen in den Registern des externen Geräts zurücksetzen. Ja, ja, das stimmt, der RAP-Treiber muss etwas über die Zusammensetzung der Register der zu wartenden Geräte wissen, es ist kaum vorstellbar, dass das Kapselungsprinzip schwerwiegender verletzt wird (und dies gilt auch für das Hardware-Design). Ich weiß nicht, was die Entwickler des RAP geraucht haben, aber, wie Gayduk sagt, "etwas sehr Interessantes." Das heißt, Sie können es vielleicht nicht glauben, aber wenn wir die Weiterleitung von Anfragen aus dem entsprechenden Kanal verbieten und dessen Verarbeitung verbieten, werden wir die Unterbrechung sowieso NICHT ZURÜCKSETZEN.
    Es stellte sich heraus, dass etwas mehr Briefe waren als geplant. Lassen Sie uns die Leser über die schwierige Situation nachdenken, in der sich die Hauptfigur der Geschichte befand, was besonders am Freitagabend zutrifft, und ich werde es schreiben. Fortsetzung ...

    Jetzt auch beliebt: