Voraussetzungen
In einer Reihe von Artikeln ( https://habr.com/ru/post/345320/ , habr.com/ru/post/80893 , habr.com/ru/post/246975 ) wurde vorgeschlagen , Excel als Übersetzer zu verwenden in AVR Assembly Code.
Vergleichen wir Excel mit den Hauptfunktionen eines "normalen" Code-Editors. Die Liste der beliebtesten Funktionen lautet wie folgt:
Code-Editor-Funktion | So implementieren Sie in Excel | Wie in Atmel Studio implementiert |
---|---|---|
Satzstellung markieren | Bedingte Formatierung von Zellen basierend auf Inhalten | Befehlshervorhebung |
Autovervollständigung | Benutzerdefinierte VBA-Funktionen;
Benannte Bereiche; Zelle als Minikonsole mit einem Makro für das Change-Ereignis; |
Nein |
Vertiefung | Springen Sie manuell zu einer benachbarten Spalte | Manuell |
Überprüfen der korrekten Platzierung der Klammern | Hat eingebaute Kontrolle | Nur Montage |
Hilfe zum Kontextcode | Nein | Es gibt eine Liste von Markennamen |
Einen Codeblock reduzieren | Spalten- und Zeilengruppierungsfunktion | Nein |
Statischer Analysator | Zeigt Fehler in Links für unterwegs an | Nein |
Sieht akzeptabel aus. Einige Dinge werden "kostenlos", etwas muss verbessert werden.
Der Hauptunterschied zwischen einem Tabellenkalkulationsprozessor und einem Textprozessor besteht jedoch darin, dass der Benutzer einen Informationsblock an einer beliebigen Stelle im Raum und nicht nur untereinander platzieren kann. Wir verwenden diese Funktion, um Flatcode in ein fast vollständiges Flussdiagramm umzuwandeln.
Erste Vereinbarungen
Nehmen wir hier den allgemeinen Ansatz und die Terminologie: habr.com/ru/post/345320
Der gesamte Algorithmus ist in Zweige unterteilt. Die Niederlassung spielt die Rolle einer unabhängigen Programmeinheit.
Jeder Zweig hat einen Namen, der der Einstiegspunkt ist. Es muss einzigartig und sinnvoll sein. Alle Filialnamen werden in die oberste Zeile gesetzt, die wir "Namenszeichenfolge" nennen werden.
Ein Zweig endet mit einem oder mehreren Zweigen zu anderen Zweigen. Übergänge von einem Zweig zum anderen werden ganz unten platziert. Nennen wir es die "Übergangslinie".
Wir akzeptieren auch die Regel, dass es innerhalb eines Zweigs unmöglich ist, in einen anderen zu gelangen.
Allgemeines Schema des Algorithmus
Für Zweige und Schleifen innerhalb eines Zweigs werden auch Beschriftungen verwendet. Das heißt, es gibt viele Labels im Programm. Jedes Mal, wenn Sie einen neuen eindeutigen Namen finden, ist dies eine Routine. Hier kommt die grundlegende Excel-Funktionalität ins Spiel. Jede Zelle hat bereits einen eindeutigen Namen, der aus einem Spaltennamen und einer Zeilennummer besteht.
Erstellen Sie in VBA eine Beschriftungsfunktion mit einem Argument vom Typ Range . Ein Etikett im AVR-Assembler muss am Ende einen Doppelpunkt haben. Jene. Unsere Beschriftungsfunktion erhält als Eingabe einen Verweis auf die Zelle, in der sie platziert ist, und berechnet ihre Adresse im A1-Format. Dann fügt er den Text "_M:" hinzu. Das "_M" -Fragment ist kein Zufall, wir werden es weiter verwenden - bei der Formatierung von Zellen.
Übergangsvisualisierung
In echten visuellen Umgebungen werden Übergänge durch Pfeile angezeigt. Es ist bequem und intuitiv.
In einem Tabellenkalkulationsprozessor können Sie anstelle von Pfeilen die Zellen, die den Pfad zur Beschriftung bilden, mit dem Befehl jump tönen. Dies geschieht in den Beispielen.
Wenn Sie es schaffen, den gesamten Zweigcode in einen Bildschirm zu integrieren, müssen Sie keine Routen zeichnen. Alle Übergangsbefehle und Beschriftungen werden vor Ihren Augen angezeigt.
Für Blockdiagramme gibt es Standards für die Bezeichnung einzelner Elemente. Ein Rechteck ist beispielsweise eine Berechnung. Diamant - Zustand usw. Bei der Arbeit mit einem Tabellenkalkulationsprozessor haben wir Zugriff auf die Steuerung von Farbe, Stil und Rahmen.
Excel verfügt über eine praktische Funktion zur bedingten Formatierung. Es kann auf verschiedene Arten verwendet werden, aber wir werden nur drei einfache Regeln einführen:
- Eine nicht leere Zelle in der Namensleiste und in der Übergangsleiste ist gelb gefärbt.
- Eine nicht leere Zelle im Körper des Zweigs ist orange gefärbt;
- Zellen mit "lokalen" Beschriftungen und Sprungbefehlen sind blau gefärbt. Es ist eine nicht leere Zelle, die die oben genannten "_M" -Zeichen enthält.
Das folgende GIF zeigt, wie die Arbeit mit Beschriftungen und Übergängen nach allen Einstellungen aussieht.
Arbeiten mit Beschriftungen und Sprungbefehlen
Das Verfahren zur Erstellung der endgültigen Auflistung
Der Listing Collector durchläuft das endgültige Programm von oben nach unten und von rechts nach links. Eine Zelle zu einer Zeit.
Wie die endgültige Auflistung gebildet wird
Der Assemblierungsalgorithmus überspringt leere Zellen und Zellen, die das Zeichen ";" enthalten, d. H. Bemerkungen.
Das Debuggen des Algorithmus und die Endmontage des Projekts finden im Studio statt. In Studio mit Excel-Zellen gibt es keine Code-Rückmeldung. Um Fehler in der endgültigen Auflistung gegenüber jedem Befehl abzufangen, geben wir daher eine Zellverbindung an. Über diesen Link finden wir den problematischen Befehl im Diagramm in Excel.
Die grundlegende algorithmische Lösung ist wie folgt verzweigt:
If <> then
<>
Else
<>
End if
Dafür gibt es im AVR-Assembler bedingte Sprunganweisungen (breq, brne, sbic und andere). Diese Befehle teilen dem Programm mit, wohin es gehen soll, wenn die Bedingung erfüllt ist.
Stellen wir uns nun vor, wie ein Programm einer solchen Verzweigung unter Berücksichtigung der oben beschriebenen Prinzipien aussehen sollte:
Einfache Verzweigung
Der Befehl brne und seine Kollegen haben eine Einschränkung. Die Sprungdistanz beträgt 64 Wörter in jede Richtung. Daher kann ein langes Makro, das in den Zweig "Keine" eingefügt wird, außerhalb des Bereichs aufrufen.
Um diese Einschränkung zu umgehen , wird "Nein" in einem separaten Zweig verarbeitet, der sich rechts von der Zweigmarke von brne befindet . Oder verwenden Sie eine Unterroutine, in der das Makro aufgerufen wird.
Wählen Sie Fall
Wenn Sie aus einer Vielzahl von Optionen auswählen müssen, wird der Auswahlfall in Java verwendet:
Select Case <>
Case <1>
Case <2>
Case <3>
Case else
End select
Indexsprünge sind in der Assemblersprache für AVR verfügbar. Lassen Sie uns die Implementierungsoption zeigen.
Wählen Sie Fall
Hier sehen Sie, dass das Verbot, vom Körper eines Zweiges zu einem anderen Zweig zu springen, verletzt wird. Dies ist beabsichtigt, da das Programm sonst zu viel horizontalen Platz einnimmt.
Aus dem gleichen Grund sollte der Interruptvektor in einer Spalte ausgeführt werden.
Schleife mit Nachbedingung
Eine Schleife sieht in Java-Notation folgendermaßen aus, wenn mindestens eine Wiederholung erforderlich ist:
Do
<>
Loop while <>
Ein Beispiel dafür, wie es in Excel aussieht und der daraus resultierende Code im Studio:
Schleife mit Nachbedingung
Schleife mit Vorbedingung
Ein Beispiel in Java:
Do while <>
<>
Loop
Ein Beispiel dafür, wie es in Excel aussieht und der daraus resultierende Code im Studio:
Schleife mit Vorbedingung
Schleife mit verschachtelter Schleife
Das Verarbeiten von Arrays oder das Arbeiten mit Zahlen erfordert die Verwendung verschachtelter Schleifen. Gesamtansicht von JAVU:
Do
Do
<>
Loop while < 2- >
<>
Loop while < 1- >
Es gibt zwei Möglichkeiten, eine verschachtelte Schleife zu implementieren: entweder innerhalb eines einzelnen Zweigs oder unter Verwendung mehrerer Zweige. Lassen Sie uns beide Optionen zeigen.
Verschachtelte Schleifen innerhalb eines Zweigs
Verschachtelte Schleifen mit Implementierung über Zweige
Schleife mit bedingtem Ausgang
Es gibt Situationen, in denen Sie den Zyklus verlassen müssen, bevor er endet. Beispielsweise kann eine logische Null auf dem 0. Zweig von Port D auf eine Fehlfunktion hinweisen. Das Programm sollte die Hauptschleife verlassen und einen Alarm auslösen.
In JLU wird der Befehl break verwendet , und der allgemeine Algorithmus lautet wie folgt:
Do
<>
If < > then break
Loop while <>
Lassen Sie uns noch einmal zeigen, wie der Algorithmus ohne Verzweigungen und mit Verzweigungen aussehen würde.
Unterbrechen einer Schleife innerhalb eines Zweigs
Unterbrechen einer durch Zweige implementierten Schleife
Unterprogramme aufrufen
Unterprogramme werden mit den Befehlen call , icall , rcall aufgerufen . Hier gibt es ein wichtiges Merkmal. Das Unterprogramm muss ausschließlich vom Körper des Zweigs aufgerufen werden. Wenn der Anruf in einer Nebenleitung getätigt wird, ist fast garantiert, dass die Rückkehr von der Unterroutine an der falschen Stelle erfolgt.
Obligatorische Anforderungen an das Unterprogramm:
- Das Unterprogramm selbst muss mit einem Labelnamen beginnen.
- Der letzte Befehl des Unterprogramms muss ret und in der Sprungzeile platziert werden.
Die interne Struktur des Unterprogramms kann beliebig sein - wenden Sie dieselbe automatische Beschriftung an, um die Logik zu implementieren.
Beispiel für Lauflicht
Hier ist der Code eines Lauflicht-Testprogramms. Das Beispiel enthält Schleifen, Verzweigungen und Unterprogrammaufrufe.
Das Endergebnis sieht folgendermaßen aus:
Lauflichtschema
Auflisten des gesamten Programms in Excel mit einem Scratch Fit auf einem Bildschirm:
Lauflicht. Excel-Code
Lauflicht. Endgültige Auflistung
Ergebnis
Was hat nicht gefallen
- Es ist unwahrscheinlich, dass die beschriebene Methode für die Arbeit an einem großen Projekt unter Beteiligung eines gesamten Teams geeignet ist. Versionskontrolle, Unterschiede usw. Sie müssen sich noch für die Seite entscheiden.
- Im Debug-Modus ist es ohne zwei Monitore sehr unpraktisch. Das Debuggen selbst wird im Studio und das Flussdiagramm in Excel durchgeführt. Dies sind verschiedene Fenster, ein Umschalten ist erforderlich.
- Das Programm schwillt horizontal schnell an. Gleichzeitig ist das Scrollen zur Seite in Excel rau und unpraktisch.
- - – . 12801024 5 45 . 20% ( 45 ). – . .
- « » . .
- Excel . Atmel Studio .
- .
- . – . , .
- Excel . - , - – VBA.
- . « » , . 4-5 . « – – – » , « » , « » « ». 4-5 .
- Zusätzliche Überprüfungen auf Fehler. Es ist einfach, mit einem Makro zu überprüfen, ob "baumelnde" Blöcke vorhanden sind, die nicht mit Übergängen enden. Wir können auch ein Makro verwenden, um nicht verwendete Beschriftungen zu finden und zu entfernen, die die Aufmerksamkeit beim Debuggen ablenken.
- Sie können Ihre eigenen Regeln zum Färben von Zellen eingeben.
- Wenn ein Tabellenkalkulationsprozessor als Code-Editor in das Studio integriert wäre, wäre es sehr praktisch, direkt in einem solchen Blockdiagramm zu debuggen.