Arduino Assembler Tutorial : Einführung
Friday, der 12. June 2015Was hat es mit Assembler überhaupt auf sich?
Kurz gesagt, ist der Unterschied zwischen Assembler und einer anderen Hochsprache ähnlich wie wenn man selbst ein Auto fährt (Assembler) und sich ein Taxi rufen (Hochsprache).
Wenn man Auto fahren will, muss man erst einmal wissen wie man alles bedient und die Verkehrsregeln kennen. Das Fahren von einem Punkt zum anderen benötigt viele komplexe Manöver. Man muss ausparken können, im Verkehr navigieren können, auf Ampeln, Schilder und Verkehrsregelungen achten, weider einparken etc. Diese Manöver selbst benötigen wieder verschiedene kleinere Aufgaben wie hoch und runter schalten, Bremsen, Beschleunigen und das Beobachten Verkehrs.
Ein Taxi rufen ist da viel einfacher, da der Fahrer alles für einen übernimmt. Man muss ihm nur sagen, wo man hin will, vielleicht sagt man ihm noch die Route, die Sie bevorzugen. Die Gesamte Fahrerei wird einem aber abgenommen. Beide Methoden werden können einen zum Ziel führen.
Assembler und C ++ verhalten sich da sehr ähnlich. Mit Assembler steuert man die Maschine (den Microcontroller, in diesem Fall den Arduino) selbst. Man muss aber alle Hebel (Bits) selber betätigen und und genau im Auge behalten wo man seine Daten speichert. In einer Hochsprache wie C ++ braucht man „nur“zu erklären was man tun möchte, und die Toolchain kümmert sich beim Kompilieren um alle Details. Programmierung in einer Hochsprache verbirgt alle Details des Controllers. Dies ist auch vollkommen in Ordnung, das ist genau was sie tun soll. Viele Algorithmen können auf diese Weise leichter beschrieben werden.
Wenn Assembler verwenden
Bis jetzt klingt es so als ob das Programmieren in Assembler umständlich und Aufwendig ist, und an sich ist dem auch so. Alle Feinheiten und Details eines Mikrocontroller zu beachten während man programmiert erfordert viel Aufwand und Zeit. Man sollte dabei immer bedenken, dass die wichtigste Ressource beim Programmieren nicht Flashspeicher, RAM oder die Anzahl der Pins ist, sondern die Entwicklungszeit.
Auch ist es so, dass sich Assembler-Code nicht leicht wiederverwenden und umschreiben lässt. Wenn man z.B. die Controllerfamilien ändert, dann gestaltet sich die Wiederverwendung von Code als äusserst schwierig, große Teile des Codes müssen neu geschrieben werden. Es ist auch sehr zeitaufwendig größere Projekte in Assembler zu verwirklichen.
Assembler hat aber einige Vorteile, die enorm ins Gewicht fallen können:
- Man lernt eine Menge über die MCU-Architektur, was wiederum beim nächsten Projekt hilfreich sein kann
- Es gibt Ihnen unübertroffene Kontrolle über die Hardware
- Im Falle korrekter optimierung, ist Assembler unglaublich schnell
- Assembler-Code verbraucht sehr wenig Speicher im Vergleich
Der beste Weg ist es, meiner Meinung nach, ein Projekt komplett in C ++ Code zu schreiben und dann nur wichtige Teile in Assembler zu optimieren. Dabei eigenen sich zeit- oder speicherintensive Funktionen am besten. C ++ gibt einen die Flexibilität, um alles schnell zu erledigen. In der Praxis ist ein sehr großer Teil eines Projektes unkritisch und profitiert nicht von Optimierung.
Beispiel aus der Praxis: Nehmen wir an möchten zu Debugzwecken einige Daten über die serielle Schnittstelle Ausgeben. Die Umsetzung auf einem Arduino in C ++ nimmt fast keinen Aufwand überhaupt, wenn man die Standartbibliotheken verwendet. Das Schreiben des Codes in Assembler auf der anderen Seite wird immer mehr Zeit in Anspruch nehmen, auch wenn man alten Code wiederverwendet. Aber hier ist das Ding: Aus praktischer Sicht bringt einem die Implementierung in Assembler überhaupt keinen Vorteil!
Es verbraucht aber mehr Zeit und Energie.
Auf der anderen Seite, wenn im Projekt Algorithmen verwendet werden, die schnell ausgeführt werden müssen, Dann besteht die Möglichkeit diese in Assembler zu optimieren.
Weiter geht es mit dem praktischen Beispiel: Blink Arduino Sketch mit Assembler implementiert