[:en]Arduino Assembler Tutorial : Introduction[:de]Arduino Assembler Tutorial : Einführung[:]

[:en]What’s the deal with Assembler?

 

In short, the difference between Assembler and another high-level language is similar to driving a car yourself (Assembler) versus calling a taxi (high-level language).

When you want to drive a car, you need to know how to operate everything and be familiar with traffic rules. Getting from one point to another involves many complex maneuvers. You have to parallel park, navigate through traffic, obey traffic lights, signs, and regulations, and park again, among other things. These maneuvers themselves involve various smaller tasks like shifting gears, braking, accelerating, and observing traffic.

Calling a taxi is much easier because the driver takes care of everything. You just need to tell them where you want to go, maybe provide your preferred route. The entire driving is taken care of for you. Both methods can get you to your destination.

Assembler and C++ behave similarly. With Assembler, you control the machine (the microcontroller, in this case, the Arduino) yourself. However, you have to manipulate all the levers (bits) yourself and keep a close eye on where you store your data. In a high-level language like C++, you only need to explain what you want to do, and the toolchain takes care of all the details during compilation. Programming in a high-level language hides all the controller’s details, which is precisely what it should do. Many algorithms can be described more easily this way.

When to use Assembler

So far, it may seem like programming in Assembler is cumbersome and time-consuming, and it is to some extent. Paying attention to all the intricacies and details of a microcontroller while programming requires a lot of effort and time. It’s essential to remember that the most crucial resource in programming is not flash memory, RAM, or the number of pins but development time.

It’s also true that Assembler code isn’t easily reusable or adaptable. If you change controller families, reusing code becomes extremely difficult, and significant portions of the code may need to be rewritten. Implementing larger projects in Assembler is also very time-consuming.

However, Assembler has some advantages that can be significant:

  1. You learn a lot about MCU architecture, which can be helpful in future projects.
  2. It provides unparalleled control over the hardware.
  3. When optimized correctly, Assembler can be incredibly fast.
  4. Assembler code consumes very little memory compared to other languages.

In my opinion, the best approach is to write an entire project in C++ code and then optimize only essential parts in Assembler. Time- or memory-intensive functions are the best candidates for this. C++ gives you the flexibility to get things done quickly. In practice, a significant portion of a project is non-critical and doesn’t benefit from optimization.

Practical Example: Let’s say you want to output some data over the serial interface for debugging purposes. Implementing this in C++ on an Arduino using standard libraries requires almost no effort at all. Writing the code in Assembler, on the other hand, will take more time, even if you reuse old code. But here’s the thing: From a practical standpoint, implementing it in Assembler doesn’t give you any advantage!

It consumes more time and energy.

On the other hand, if your project involves algorithms that need to execute quickly, there’s the possibility of optimizing them in Assembler.

Moving on to the practical example: Implementing a Blink Arduino Sketch using Assembler.[:de]Was 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:

  1. Man lernt eine Menge über die MCU-Architektur, was wiederum beim nächsten Projekt hilfreich sein kann
  2. Es gibt Ihnen unübertroffene Kontrolle über die Hardware
  3. Im Falle korrekter optimierung, ist Assembler unglaublich schnell
  4. 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[:]


Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.