Firmware-Entwicklung: Einführung

Hallo Habr! Ich präsentiere Ihnen die Übersetzung der Artikel von Chris Svec, das Original ist hier . Veröffentlichung mit Genehmigung des Autors unter Lizenz CC-A-NC-ND .

Embedded Software Engineering 101: Einführung


Ich starte eine Reihe von Tutorials zur Firmware-Entwicklung. Wir werden zunächst einen einfachen Mikrocontroller beschreiben. Nachdem Sie die Funktionsweise verstanden haben, werden wir diesen entwickeln, um zu verstehen, wie er in Bezug auf komplexe Systeme wie Fitbit oder Nest funktioniert.
Ich habe diese Serie Embedded Software Engineering 101 genannt und sie beginnt diese Woche hier auf diesem Blog.

Lesen Sie weiter für weitere Erklärungen und Details.


Einige Bausteine ​​auf anderen Bausteinen.

Ich arbeite seit über 14 Jahren mit eingebetteten Systemen und entwickle Mikrochips. Ich mag eingebettete Systeme - Hardware, Software und die Einschränkungen, die sie zusammenhalten.
Amateurelektronik und Ideen wie Arduino , Adafruit und Sparkfun ermöglichten es, über das Wochenende (oder einen Monat oder ein Semester) einfach etwas von Hardware und Software zu werfen , etwas Neues, Interessantes zu schaffen und sogar nützlich zu sein.

Es ist toll! Menschen die Möglichkeit zu geben, etwas zu erschaffen, ist eine erstaunliche Sache. Wenn ich mich hart ausdrücken wollte, würde ich es ehrgeizig als "Demokratisierung der Technologie" bezeichnen.

Die meisten Amateurprojekte sind einmalig. Sie sammeln etwas, machen es so gut, wie Sie genug Zeit oder Energie haben, und gehen weiter.
Ich habe meine Karriere am anderen Ende des Spektrums verbracht - Produkte zu entwickeln, die Hunderttausende oder Millionen oder mehr Kopien enthalten - und dies erfordert eine völlig andere Denkweise und einen systematischen Ansatz.

Ich möchte den Leuten beibringen, wie man Firmware für diese Art von Systemen schreibt. Ich habe diese Idee für den Embedded Software Engineering 101-Kurs / Leitfaden / Buch / Blog lange gepflegt und dank des Embedded.fm-Blogs beginne ich jetzt mit der Implementierung.

Ich bin eine Person von grundlegendem Typ, daher ist mein Plan, mit den Grundlagen zu beginnen, mit einer einfachen Beschreibung eines einfachen Mikroprozessors, und diese Grundlage zu entwickeln, bis Sie verstehen, wie ein relativ komplexes eingebettetes System funktioniert.

Mein Ziel ist es, dass Sie am Ende dieses Zyklus herausfinden können, wie Fitbit, ein Nest-Thermostat oder ein ähnliches eingebettetes System funktioniert. Sie können mit Berufserfahrung beginnen, mit eingebetteten Softwaresystemen zu arbeiten.

Embedded Software Engineering 101 wurde entwickelt für:

  1. Hochschulabsolventen in den Bereichen Informatik, Computertechnik oder Elektronik, die sich für eingebettete Systeme interessieren.
  2. Amateur-Elektronik-Enthusiasten, die besser verstehen möchten, wie ihr System auf Arduino funktioniert, und herausfinden möchten, wie sie sich weiterentwickeln (und ob dies notwendig ist!).
  3. , , .
  4. , , -.

Was meine ich damit, dass ich eine „Person von grundlegendem Typ“ bin? Richard Feynman , ein mit dem Nobelpreis ausgezeichneter Physiker und ausgezeichneter Geschichtenerzähler, drückte es auf die bestmögliche Weise aus: "Was ich nicht nachbauen kann, verstehe ich nicht."

Ich bin also kein Feynman, aber ich bin sicher, dass der beste Weg, das System zu verstehen, darin besteht, mit den Grundlagen zu beginnen. Mit diesem Verständnis können Sie einfache eingebettete Systeme mit einfacher Software erstellen. Wenn Sie zunächst ein sehr einfaches Programm verstanden haben, können Sie es entwickeln, indem Sie mit zunehmender Erfahrung komplexere Software erstellen.

Die Grundlagen an erster Stelle - das ist natürlich nur meine persönliche Überzeugung. Viele Leute haben mit Arduino nützliche Dinge gemacht, ohne die Grundlagen zu verstehen. Diese Artikelserie richtet sich an diejenigen, die die Grundlagen und alles, was darauf aufbaut, noch verstehen wollen.

Natürlich müssen wir uns fragen: Wo ist das richtige Niveau, um mit diesen „Grundlagen“ zu beginnen? Transistoren und Logikgatter? Nein, dies ist zu niedrig, um mit der Firmware zu beginnen. An gängige Sensoren anschließen? Nein, das ist ein zu hohes Niveau, es braucht zu viel Wissen, um damit zu beginnen.

Ich denke, die richtige Basis ist der eingebaute Mikroprozessor. Es ist nicht erforderlich, Physik oder Elektronik zu verstehen, um den eingebauten Mikroprozessor zu verwenden, und es ist auch nicht erforderlich, ein Experte für Programmierung zu sein.

Hier beginnen wir also im nächsten Artikel.

Vorurteilswarnung: In einem früheren Leben war ich Architekt / Prozessorentwickler. Wenn Sie diesen Zyklus mit dem Verständnis der Funktionsweise der CPU beginnen, ist dies möglicherweise nicht der beste Weg, um eingebettete Systeme zu verstehen, aber so funktioniert mein Gehirn. Probieren Sie unbedingt andere Kurse / Handbücher usw. aus, wenn Sie dies nach mehreren Artikeln nicht verstehen.

Embedded Software Engineering 101: Grundlagen des Mikrocontrollers


Wir werden unsere Reise von Embedded Software Egineering 101 mit einem bescheidenen Mikrocontroller beginnen. Ein Mikrocontroller (oder Mikroprozessor) ist der Hauptbaustein aller eingebetteten und anderer Computersysteme.

MK scheint ziemlich kompliziert zu sein, besteht aber aus drei einfachen Dingen: Anweisungen, Register und Speicher. Anweisungen sind die Dinge, die der Mikrocontroller ausführen kann. Ein einfacher MK kann nicht so viel leisten - er kann zum Beispiel 20 oder 30 Anweisungen haben. Später in diesem Zyklus werde ich den Mikrocontroller MSP430 von Texas Instruments verwenden, der nur 27 Anweisungen enthält.


Nur ein Foto von MK (TI MSP430F5529)

Diese 27 Anweisungen sind die einzigen Dinge, die der MSP430 tun kann. Er kann zwei Zahlen addieren, eine andere von einer Zahl subtrahieren, Zahlen von einem Ort an einen anderen verschieben oder 24 andere einfache Operationen ausführen. 27 Operationen scheinen nicht genug zu sein, um etwas Nützliches zu tun, aber in Wirklichkeit werden sie genug sein, um ein denkbares Programm durchzuführen.

Das bedeutet, dass der Mikrocontroller Anweisungen hat, die etwas mit Zahlen tun. Aber wo sind diese Zahlen? Register und Speicher! Anweisungen arbeiten mit Nummern, die in Registern und im Speicher gespeichert sind.

Register sind ein sehr schnelles Repository mit Nummern, die Anweisungen verarbeiten. Sie können sie sich als Notizblock vorstellen, der von Anweisungen verwendet wird. MK enthält wenige Register, normalerweise 8-32. Zum Beispiel hat der MSP430 16 Register.

Speicher ist auch Speicher für Zahlen, aber er ist viel größer und langsamer als Register. Der Mikrocontroller kann 64 kB, 256 kB oder sogar mehr als 1 MB Speicher haben. MSP430F5529 verfügt über ca. 128 kB Speicher. das ist mehr als das 8.000-fache der Anzahl seiner Register!

Bevor wir uns Beispiele ansehen, fordere ich Sie auf, sich ein Stück Papier und einen Stift oder Bleistift zu besorgen und diese Beispiele beim Lesen zu studieren. Es ist schwieriger, sie auf Papier zu studieren, als nur zu lesen, was ich geschrieben habe. Auf diese Weise nähern Sie sich dem Prozess sorgfältig und die Chancen, sich das Gelernte zu merken, sind höher.

Schauen wir uns ein fiktives, aber charakteristisches Beispiel eines Mikrocontrollers an.

Nehmen wir an, unser MK verfügt über 4 Register und 8 Speicherzellen. Register werden normalerweise kreativ genannt, zum Beispiel "R0", "R1" usw., und wir werden das Gleiche tun. Speicherzellen werden normalerweise mit ihren Nummern bezeichnet, die auch als Speicheradressen bezeichnet werden, beginnend mit der Nummer 0. So sehen unsere Register und unser Speicher aus:



Und jetzt werde ich einige Werte in sie



einfügen : Jetzt benötigt unser fiktiver Mikrocontroller einige Anweisungen.
Der Befehlssatz, den MK kennt, wird als Befehlssatz bezeichnet. Nehmen wir an, im Set gibt es drei Anweisungen: ADD (addieren), SUB (kurz für "subtrahieren" - subtrahieren) und MOVE (verschieben). Die Anweisungen müssen die Nummern abrufen, von denen sie stammen, und ihre Ergebnisse auch irgendwo ablegen, sodass einige von ihnen Informationen darüber enthalten, wo sich die Eingabe- und Ausgabedaten befinden.

Lassen Sie unseren ADD-Befehl beispielsweise zwei Quellen und einen Datenempfänger haben, und alle müssen Register sein. Das Handbuch kann diese Anweisung folgendermaßen beschreiben:
ADD regist, regPrm
Der ADD-Befehl addiert den Wert des reg reg-Registers zum Wert des reg reg-Registers und speichert das Ergebnis im reg reg-Register.
Zusammenfassung: regPrm = regIST + regPrm
Beispiel: ADD R1, R2 führt die Operation R2 = R1 + R2 aus
In den Anweisungen wird allgemein akzeptiert, dass eine der Quellen auch als Empfänger verwendet wird, wie dies bei der ADD-Anweisung der Fall ist, wobei regPrm als Quelle und Empfänger von Daten verwendet wird.

"ADD R1, R2" ist eine Assemblersprache für einen Mikrocontroller, es ist eine native Programmiersprache MK.

Definieren wir SUB im selben Stil:
SUB-Register, Regrpm
Der SUB-Befehl subtrahiert den Wert des Registerregisters vom Wert des Regprm-Registers und speichert das Ergebnis im Regprm-Register.
Zusammenfassung: regPrm = regPrm - reggist
Beispiel: SUB R3, R0 führt die Operation R0 = R0 - R3 aus
Lassen Sie den MOVE-Befehl schließlich eine Quelle und einen Empfänger haben, und entweder:

  • Beide Argumente sind ebenfalls Register
  • eines ist ein Register und eines ist ein Speicherort.

Die Anleitung für den Befehlssatz lautet:
1. MOVE-Register, Register
2. MOVE-Register, reg
3. MOVE-Register, rem
Der MOVE-Befehl kopiert die Daten aus dem Argument East in das Argument Prm.
Zusammenfassung: Es gibt drei Arten von MOVE-Anweisungen:
1. regPrm = regist 2.
regPm = memist
3. memPm = reg
Beispiel: Ich werde später in diesem Beitrag Beispiele für die MOVE-Anweisung zeigen.
Ein Hinweis zum Wort „Verschieben“, das für diese Anweisung verwendet wird: Die meisten Befehlssätze verwenden es, obwohl in Wirklichkeit die Daten kopiert und nicht verschoben werden.

Der Name "move" kann den Eindruck erwecken, dass die Operandenquelle des Befehls zerstört oder gelöscht wird, aber tatsächlich bleibt er allein, nur der Empfänger wird modifiziert.
Lassen Sie uns einige Beispiele mit unserem fiktiven Mikrocontroller durchgehen.
Zu Beginn sehen unsere Register und unser Speicher folgendermaßen aus:



Jetzt führen wir die folgende Anweisung auf dem MK aus:

ADD R1, R2

Es nimmt den Wert von R1 an, addiert ihn zum Wert von R2 und speichert das Ergebnis in R2. Der Prozessor führt die meisten Anweisungen in einer Operation aus, aber ich werde die Ausführung jeder ADD-, SUB- und MOVE-Anweisung in mehrere Schritte aufteilen, wobei der Pfeil "=>" durch Ersetzungen führt (Register / Speicher => Wert):

R2 = R1 + R2 =>
R2 = 37 + 100 =>
R2 = 137

Nach dem Ausführen dieser Anweisung bleibt der Speicher unverändert, aber die Register sehen jetzt wie folgt aus, wobei der geänderte Wert in Rot geschrieben ist:



Beachten Sie, dass R1 unverändert ist; nur das Empfängerregister R2 hat sich geändert.
Als nächstes versuchen wir die SUB-Anweisung:

SUB R3, R0

Sie nimmt den Wert von R3, subtrahiert ihn vom Wert von R0 und speichert das Ergebnis in R0:

R0 = R0 - R3 =>
R0 = 42 - 2 =>
R0 = 40

Nach dem Ausführen dieser Anweisung bleibt der Speicher unverändert, aber die Register sehen jetzt folgendermaßen aus:



Lassen Sie uns abschließend einige Versionen der MOVE-Anweisung ausprobieren:

MOVE R2, R0

Dieser MOVE-Befehl kopiert den Wert von R2 nach R0:

R0 = R2 =>
R0 = 137

Und jetzt sehen die Register folgendermaßen aus:



Als nächstes kopieren wir das Register in den Speicher:

MOVE R3, [3]

Dieser MOVE-Befehl kopiert R3 in den Speicherplatz 3. Die eckigen Klammern in unserem Befehlssatz sind die Speicherzellen.

[3] = R3 =>
[3] = 2

Die Register sind unverändert, aber der Speicher ändert sich:



Und für unser letztes Beispiel kopieren wir den Wert aus dem Speicher in das Register:

MOVE [6], R0

Hier wird der Wert der Speicherzelle 6 in das Register R0 kopiert:

R0 = [6] =>
R0 = 1

Der Speicher ist unveränderlich, und die Register sehen jetzt so aus:



Ob Sie es glauben oder nicht, aber wenn Sie das meiste verstehen, was wir gerade über Anweisungen, Register und Speicher besprochen haben, dann verstehen Sie die Grundlagen von Mikrocontrollern und Assemblersprache.

Natürlich habe ich viele Details ausgelassen. Wie erhält MK beispielsweise Anweisungen zur Ausführung?

Gibt es interessantere Anweisungen als nur einfache Mathematik- und Kopieranweisungen? Entspricht der Speicher RAM oder Flash oder nicht?

Wir werden diese Fragen im nächsten Artikel beantworten.

All Articles