Entwicklungsboards und zugehörige Software-Projektbeispiele, die von Mikrocontroller-Herstellern bereitgestellt werden, sind für Ingenieure oft eine große Hilfe beim Beginn eines neuen Designs. Nachdem jedoch die frühen Phasen eines Designprojekts abgeschlossen sind, kann die vom Hersteller bereitgestellte Software beim weiteren Design einige Probleme verursachen.
Es gibt auch viele Herausforderungen für das Design der Verwendung eines Echtzeitbetriebssystems als Plattform für Anwendungscode. Es geht beispielsweise um die Frage, wie Funktionen effektiv verschiedenen parallelen Aufgaben zugewiesen werden, wie eine zuverlässige Kommunikation zwischen Prozessen gestaltet wird und wie das gesamte Softwarepaket auf Hardware getestet wird.
Immer mehr OEM-Hersteller haben herausgefunden, dass der beste Weg, die oben genannten Probleme zu vermeiden, darin besteht, neue Designs mit einem Linux-Betriebssystem zu starten, das auf Open Source basiert, bewährt, skalierbar und auf verschiedenen Hardwareplattformen lauffähig ist. Auch die Zahl der auf verschiedene Computer-Hardwareplattformen portierten Linux-Betriebssysteme ist unübertroffen.
Linux-Derivate werden häufig in einer Vielzahl eingebetteter Systeme verwendet, darunter Netzwerk-Router, Mobiltelefone, Gebäudeautomationssteuerungen, Fernseher und Videospielkonsolen.
Obwohl Linux weit verbreitet und erfolgreich ist, bedeutet das nicht, dass es einfach zu bedienen ist. Linux enthält über eine Million Zeilen Code und funktioniert auf eine eindeutig „Linux-Art“, was für Anfänger möglicherweise etwas gewöhnungsbedürftig sein kann.
Daher besteht der Zweck dieses Artikels darin, beim Start eines neuen Designprojekts mit μClinux, einer Version des eingebetteten Linux-Betriebssystems, zu helfen. Dieser Leitfaden ist in fünf Schritte unterteilt. Zur Veranschaulichung des Leitfadens ein μClinux-Projekt, das auf dem STM32F429-Mikrocontroller von STMicroelectronics implementiert wurde, der einen ARM Cortex-M4-Kern mit einer maximalen Frequenz von 180 MHz verwendet und das STM32F429 Discovery Linux Board Support Package (BSP) von Emcraft nutzt.
Jedes Embedded-Software-Design beginnt mit der Auswahl der richtigen Tools.
Eine Toolkette ist eine Reihe von Softwareentwicklungstools, die miteinander verbunden (oder verknüpft) sind. Sie umfasst Tools wie die GNU Compiler Collection (GCC), Binutils (eine Reihe von Linkern, Assemblern und andere Tools für die Objektentwicklung). Dateien und Archive) und glibc (eine C-Bibliothek, die Systemaufrufe und Grundfunktionen bereitstellt); in einigen Fällen können auch andere Tools wie Compiler und Debugger enthalten sein.
Die für die eingebettete Entwicklung verwendete Toolkette ist eine Cross-Tool-Chain, besser bekannt als Cross-Compiler.
GNUBinutils ist die erste Komponente der eingebetteten Linux-Toolchain. GNUBinutils enthält zwei wichtige Tools:
● „as“, Assembler, konvertiert Assemblercode (generiert von GCC) in Binärcode
● „ld“, Connector, verbindet diskrete Zielcodesegmente mit Bibliotheken oder bildet ausführbare Dateien
Der Compiler ist die zweite wichtige Komponente der Toolkette. In Embedded Linux heißt es GCC und unterstützt viele Arten von Mikrocontroller- und Prozessorarchitekturen.
Als nächstes kommt die C-Funktionsbibliothek. Es implementiert die traditionelle POSIX-API (Application Programming Interface) von Linux, die zur Entwicklung von User-Space-Anwendungen verwendet werden kann. Es stellt über Systemaufrufe eine Schnittstelle zum Kernel her und stellt hochrangige Dienste bereit.
Ingenieuren stehen mehrere C-Funktionsbibliotheken zur Auswahl:
●glibc ist eine verfügbare C-Funktionsbibliothek, die vom Open-Source-GNU-Projekt bereitgestellt wird. Die Bibliothek ist voll funktionsfähig, portabel und entspricht den Linux-Standards.
●Embedded GLIBC (EGLIBC) ist eine abgeleitete Version, die für eingebettete Systeme optimiert ist. Sein Code ist optimiert, unterstützt Cross-Compilation und Cross-Testing und sein Quellcode und Binärcode sind mit GLIBC kompatibel.
●uClibc ist eine weitere C-Bibliothek, die verwendet werden kann, wenn der Flash-Speicherplatz begrenzt ist und/oder die Speichernutzung minimal sein muss.
Ein Debugger ist in der Regel auch Teil der Toolkette, da ein Cross-Debugger erforderlich ist, um die auf dem Zielrechner laufende Anwendung zu debuggen. Im Bereich eingebettetes Linux ist GDB ein häufig verwendeter Debugger.
Die oben genannten Tools sind so unverzichtbar, aber wenn sie unabhängig voneinander arbeiten, dauert es zu lange, den Linux-Quellcode zu kompilieren und in das endgültige Image zu integrieren. Glücklicherweise automatisiert Buildroot den Prozess der Erstellung eines vollständigen eingebetteten Systems und vereinfacht die Kreuzkompilierung, indem es einige oder alle der folgenden Aufgaben generiert:
●Cross-Compilation-Toolkette
●Root-Dateisystem
●Kernel-Bild
●Boot-Image
Für Entwickler eingebetteter Systeme ist es auch praktisch, ein Dienstprogramm-Aggregationstool wie BusyBox zu verwenden, das die Tools integriert, die normalerweise am meisten benötigt werden. Auf der Informationsseite von BusyBox heißt es: „Es kombiniert winzige Versionen vieler gängiger UNIX-Tools in einer kleinen ausführbaren Datei. Es bietet eine Alternative zu den meisten Tools, die Sie normalerweise in Tools wie GNU Fileutils und Shellutils sehen würden. BusyBox Die Tools in BusyBox sind im Allgemeinen weniger selektiver als ihre voll ausgestatteten GNU-Gegenstücke; die enthaltenen Optionen bieten jedoch die erwartete Funktionalität und das Verhalten, die mit denen der GNU-Gegenstücke praktisch identisch sind. Die Umgebung ist ziemlich umfassend
Das letzte wichtige Tool ist ein BSP, das speziell für das Motherboard entwickelt wurde, das mit der Ziel-MCU oder dem Prozessor des Projekts ausgestattet ist.BSP enthält vorkonfigurierte Tools sowie einen Bootloader zum Laden des Betriebssystems auf das Motherboard. Es stellt außerdem Quellcode für den Kernel und die Gerätetreiber bereit (siehe Abbildung 1).
1) Die Bootloader-Firmware (U-Boot im Beispielprojekt) läuft im integrierten Flash-Speicher der Ziel-MCU (kein externer Speicher erforderlich) und führt nach dem Einschalten/Reset alle notwendigen Initialisierungsarbeiten aus, einschließlich der Einrichtung des serielle Schnittstelle und externe Nutzung des Speichercontrollers für den Speicherzugriff (RAM).
2) U-Boot überträgt das Linux-Image vom externen Flash in den externen RAM und übergibt die Kontrolle an den Kernel-Einstiegspunkt im RAM. Linux-Images können komprimiert werden, um Flash-Speicherplatz zu sparen, allerdings auf Kosten der Dekomprimierungszeit beim Booten.
3) Linux bootet und installiert ein RAM-basiertes Dateisystem (initramfs) als Root-Dateisystem. Wenn das Projekt erstellt wird, wird das Initramfs mit den erforderlichen Dateien und Verzeichnissen gefüllt und dann einfach mit dem Kernel verknüpft.
4) Führen Sie unter dem Linux-Kernel /sbin/init aus. Das Programm /sbin/init initialisiert das System gemäß der Beschreibung der Konfigurationsdatei in /etc/inittab.
5) Sobald der Initialisierungsprozess die Ausführung auf Run-Ebene und die Befehle in /sbin/init abgeschlossen hat, startet er einen Anmeldevorgang.
6) Die Ausführung der Shell-Initialisierungsdatei /etc/profile markiert den Abschluss des Startvorgangs.
Sie können die Startzeit erheblich verkürzen und die Gesamtleistung verbessern, indem Sie die In-Place-Ausführung (ExecuteInPlace – XIP) aktivieren, eine Methode zum Ausführen von Code aus dem Flash-Speicher. Normalerweise wird Linux-Code vom Flash-Speicher in den externen Speicher geladen und dann vom externen Speicher ausgeführt. Durch die Ausführung aus dem Flash-Speicher wird weniger Speicher benötigt, da dieser Schritt nicht mehr kopiert wird und der Nur-Lese-Speicher keinen Programmplatz mehr beansprucht.
Das obige ist der detaillierte Inhalt vonMehrere Schritte für die Entwicklung eines Embedded-Linux-Projekts. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!