Heim > System-Tutorial > LINUX > Hauptteil

Kann Linux auf einer 8-Bit-MCU ausgeführt werden?

WBOY
Freigeben: 2024-02-05 18:18:02
nach vorne
745 Leute haben es durchsucht

In Mikrocontroller-Foren fragen Anfänger oft, ob auf ihren kümmerlichen 8-Bit-Mikrocontrollern Linux laufen kann. Diese Fragen lösen oft schallendes Gelächter aus. In Linux-Foren fragen wir oft nach den Mindestanforderungen für die Ausführung von Linux. Die gängige Antwort lautet, dass Linux eine 32-Bit-Architektur und eine MMU (Memory Management Unit) sowie mindestens 1 MB RAM benötigt, um den Kernel zu erfüllen.

Dieses Projekt zielt jedoch darauf ab, diese Wahrnehmungen zu zerstören (und es ist ihm auch gelungen). Das im Bild unten gezeigte Entwicklungsboard basiert auf ATmega1284P. Ich (ein Ausländer) habe auch ein Entwicklungsboard auf Basis von ATmega644a erstellt, was ebenfalls erfolgreich war. Dieses Entwicklungsboard verwendet keine anderen Prozessoren und kann den Linux 2.6.34-Kernel booten. Tatsächlich kann es sogar einen vollständigen Ubuntu-Stack ausführen, einschließlich X (wenn Sie bereit sind, auf den Start zu warten) und der Gnome-Desktop-Umgebung.

Linux是否能在 8 位 MCU 上运行?

▍RAM (Random Access Memory)

Ja, das stimmt, eine vollständige Linux-Installation erfordert mehrere Megabyte RAM und eine 32-Bit-CPU mit einer MMU. Dieses Projekt hat es in sich. Lassen Sie uns zunächst auf den RAM zugreifen. Wie Sie sehen können, befindet sich in der Schaltung ein antikes 30-poliges SIMM-Speichermodul. Dies ist, was einst 80286-basierte PCs verwendeten. Es ist mit dem ATmega verbunden und ich schreibe Code, um darauf zuzugreifen und es gemäß den Spezifikationen zu aktualisieren (SDRAM benötigt eine konstante Aktualisierungsrate, um Datenverluste zu vermeiden).

Wie schnell ist es? Der Aktualisierungsinterrupt erfolgt alle 62 ms und nimmt 1,5 ms in Anspruch, sodass er weniger als 3 % der CPU beansprucht. Greifen Sie zur Vereinfachung der Programmierung byteweise auf den RAM zu. Die dadurch erzeugte maximale Bandbreite beträgt etwa 300 KBit/s.

Linux是否能在 8 位 MCU 上运行?

***▍*Speicher

Damit RAM im Ruhezustand funktioniert, müssen wir uns um zwei Dinge kümmern. Lagerung ist kein Problem, das allzu schwer zu lösen ist. Es ist sehr einfach, über SPI mit der SD-Karte zu interagieren, und ich habe dies in meinem Projekt getan. Eine 1-GB-SD-Karte funktioniert einwandfrei, für dieses spezielle Dateisystem (Ubuntu Jaunty) sind jedoch 512 MB ausreichend.

ATmega hat ein Hardware-SPI-Modul, aber aus irgendeinem Grund funktionierte es nicht ganz reibungslos, also habe ich die Schnittstelle etwas entfernt. Es ist immer noch groß genug – etwa 200 KBit/s. Es macht auch für das Projekt absolut Sinn – es kann auf jedem Mikrocontroller mit genügend Pins implementiert werden, ohne dass zusätzliche Hardwaremodule verwendet werden müssen.

***▍*CPU (Zentraleinheit)

Alles, was übrig bleibt, sind die 32-Bit-CPU- und MMU-Anforderungen. Allerdings verfügt der AVR nicht über eine MMU und ist 8-Bit. Um diese Schwierigkeit zu überwinden, habe ich einen ARM-Emulator geschrieben. ARM ist die Architektur, mit der ich am besten vertraut bin, und sie ist so einfach, dass ich problemlos einen Emulator dafür schreiben kann. Warum eins schreiben statt eines zu portieren?

Nun, es macht keinen Spaß, den Code von jemand anderem zu portieren, außerdem sehe ich keine dokumentierte Dokumentation zur einfachen Portierung von Emulatoren auf 8-Bit-Geräte. Ein Grund: Das Beharren des AVR-Compilers auf 16 Bits für die Verarbeitung von Ganzzahlen führt zu Problemen mit einfachen „(1 Linux是否能在 8 位 MCU 上运行?

***▍*Andere Funktionen

Das Board kommuniziert über eine serielle Schnittstelle mit der realen Welt. Derzeit ist es über eine serielle Schnittstelle mit einem Minicom verbunden, das auf meinem PC läuft, aber eine alternative Verbindung, die es testen könnte, wäre eine Tastatur und ein Zeichen-LCD, die an den Schaltkreis angeschlossen sind und es völlig eigenständig machen würden. Auf der Platine befinden sich zwei weitere LEDs. Sie zeigen den Zugriff auf die SD-Karte an. Einer repräsentiert den Lesevorgang und der andere repräsentiert den Schreibvorgang. Auf der Platine befindet sich auch ein Knopf. Wenn Sie diese Taste 1 Sekunde lang gedrückt halten, wird die serielle Schnittstelle aus der aktuell effektiven Geschwindigkeit der emulierten CPU herausgenommen. Die Hauptfrequenz des AVR beträgt 24 MHz (eine leichte Übertaktung über die ursprünglichen 20 MHz).

***▍*Wie schnell ist es?

uARM hat definitiv keinen Rate-Daemon. Das Starten der BASH-Eingabeaufforderung („init=/bin/bash“-Kernel-Befehlszeile) dauerte etwa zwei Stunden. Dann hat es mehr als 4 Stunden gedauert, das gesamte Ubuntu zu starten („exec init“ und dann einloggen). Das Starten von X dauert länger. Die effektive emulierte CPU-Geschwindigkeit beträgt etwa 6,5 ​​kHz, was ungefähr dem entspricht, was man bei der Emulation einer 32-Bit-CPU und MMU auf einem dürftigen 8-Bit-Mikrocontroller erwarten würde. Seltsamerweise ist das System nach dem Hochfahren einigermaßen benutzbar. Sie können einen Befehl eingeben und innerhalb einer Minute eine Antwort erhalten. Das bedeutet, dass Sie es tatsächlich verwenden können. Ich habe damit heute zum Beispiel meine SD-Karte formatiert. Er ist definitiv nicht der Schnellste, aber meiner Meinung nach ist er wahrscheinlich der günstigste, langsamste, am einfachsten von Hand zusammenzubauende PC, hat die geringste Teileanzahl und ist der Linux-PC mit der niedrigsten Preisklasse. Die Leiterplatte wird mithilfe von Drähten von Hand verlötet, ohne dass eine Leiterplatte (PCB) erforderlich ist.

***▍*Details zum Emulator?

Der Emulator ist recht modular aufgebaut, sodass er nach Belieben erweitert werden kann, um andere SoC- (System on Chip) und Hardwarekonfigurationen zu emulieren. Die simulierte CPU ist ARMv5TE. Vor einiger Zeit habe ich begonnen, an der Unterstützung von ARMv6 zu arbeiten, diese ist jedoch noch nicht abgeschlossen (wie aus dem Code hervorgeht), da sie nicht unbedingt benötigt wird. Der simulierte SoC ist PXA255.

Aufgrund des modularen Aufbaus können Sie die SoC.c-Datei ersetzen und einen komplett neuen SoC mit demselben ARMv5TE-Kern kompilieren oder den Kern oder die Peripheriegeräte nach Ihren Wünschen austauschen. Das ist Absicht, ich meine, dieser Code ist auch ein ziemlich gutes Beispiel dafür, wie ein ARM-SoC funktioniert. Der Code des CPU-Emulators selbst ist nicht besonders ordentlich, es handelt sich also um einen CPU-Emulator. Das wurde vor ein paar Jahren in über 6 Monaten Freizeit geschrieben und dann beiseite gelegt. Es wurde kürzlich speziell für dieses Projekt wiederbelebt. Der Emulator implementiert i-cache, um die Geschwindigkeit zu verbessern. Dies gibt dem AVR große Hilfe, da er im Gegensatz zu meinem externen RAM mit über 5 MB pro Sekunde auf den internen Speicher zugreifen kann. Ich bin noch nicht dazu gekommen, D-Cache (Daten-Caching) zu implementieren, aber es steht auf meiner To-Do-Liste. Der Zugriff auf Blockgeräte wird nicht als SD-Geräte emuliert. Dies erwies sich als zu langsam. Stattdessen gibt es ein paravirtualisiertes Festplattengerät (pvdisk, siehe pvDisk.tar.bz2, GPL-lizenziert), das ich mit einem ungültigen Opcode geschrieben habe, um den Emulator zu laden und auf die Festplatte zuzugreifen. Die Ramdisk (virtuelle Festplatte) in meinem Image lädt diese PVDisk und ändert dann das Stammverzeichnis in /dev/pvd1.

ramdisk ist in „rd.img“ enthalten. Der „Maschinentyp“, den ich verwende, ist PalmTE2. Warum? Da ich mit dieser Hardware sehr vertraut bin, ist es der erste Typ einer PXA255-Maschine, den ich gesehen habe.

***▍*Hypercall?

Es gibt einige Dienste, bei denen Sie mithilfe eines speziellen Opcodes Anfragen an den Emulator stellen können. In ARM ist es 0xF7BBBBBB, in Thumb ist es 0xBBBB. Diese wurden ausgewählt, weil sie in einem Bereich liegen, in dem ARM-Garantien nicht definiert sind. Die Hypercall-Nummer wird im Register R12 übergeben, die Parameter werden in den Registern R0-R3 übergeben und der Rückgabewert wird in R0 platziert.

Anruf:

· 0 = Simulation stoppen

· 1 = Dezimalzahl drucken

· 2 = Druckzeichen

· 3 = RAM-Größe ermitteln

· 4 = Geräteoperation blockieren (R0 = Operation, R1 = Sektornummer). Beachten Sie, dass diese nicht in den emulierten RAM schreiben, sondern einen anderen Hyperaufruf verwenden, um den internen Puffer des Emulators, auf den der emulierte Benutzer zugreift, Wort für Wort zu füllen. Ich wollte DMA implementieren, bin aber noch nicht dazu gekommen.

Bedienung:

· 0 = Informationen abrufen (wenn die Sektornummer 0 ist, wird die Anzahl der Sektoren zurückgegeben; wenn die Sektornummer 1 ist, wird die Sektorgröße in Bytes zurückgegeben)
· 1 = Sektor gelesen
· 2 = Sektor schreiben

· 5 = Gerätepufferzugriff blockieren (R0 = Werteingang/Wertausgang, R1 = Anzahl der Wörter, R2 = 1, wenn geschrieben, 0 sonst)

***▍*Daumenstütze?

Volle Unterstützung für Thumb. Ich habe ein wenig geschummelt und jede Thumb-Anweisungszeichenfolge (instr) in die entsprechende ARM-Anweisungszeichenfolge dekodiert und ausgeführt, anstatt die ARM-Emulatorfunktionen zu verwenden. Es ist nicht so schnell wie das Original, aber es ist einfach und der Code ist klein. Es ist möglich, eine 256-KB-Nachschlagetabelle zu verwenden, aber ich bin der Meinung, dass 256 KB zu groß für den Flash-Speicher des Mikrocontrollers sind. Einige Thumb-Anweisungen können nicht in ARM-Anweisungen konvertiert werden, sondern werden stattdessen korrekt verarbeitet.

Ich möchte eins bauen!

Für nichtkommerzielle Zwecke können Sie dies durchaus tun. Die Verkabelungsmethode ist wie folgt:

· RAMs DQ0-DQ7 sind mit AVRs C0-C7 verbunden

· RAMs A0-A7 verbinden AVRs A0-A7

· RAMs A8-A11 verbinden AVRs B0-B3

· RAM nRAM nRAS nCAS nWE verbinden AVR D7 B4 B5

· SDs DI SCK DO verbindet AVRs B6 B7 D6

· Der Lese-/Schreibzugriff der LED ist mit D2 D3 des AVR verbunden (andere Pins der LED sind mit Masse verbunden);

· Der Taster ist mit D4 des AVR verbunden (andere Pins sind mit Masse verbunden).

Linux是否能在 8 位 MCU 上运行?RAM kann ein beliebiges 30-Pin-16-MB-SIMM sein, das mit einer CAS-vor-RAS-Aktualisierungsrate von 4000 Zyklen alle 64 Millisekunden ausgeführt werden kann. Das von mir verwendete (OWC) kann für ein paar Dollar online gekauft werden. Der Schaltplan ist hier abgebildet, zum Vergrößern anklicken.

**

*▍*Quellcode?

Dieser Code ist etwas chaotisch, funktioniert aber (der Code kann in China nicht heruntergeladen werden). Um den Emulator auf Ihrem PC einzurichten und auszuprobieren, geben Sie „make“ ein. Zum Ausführen verwenden Sie „./uARM DISK_IMAGE“. Um die optimierte PC-Version zu erstellen, verwenden Sie „make BUILD=opt“. Um eine lauffähige Version von AVR zu erstellen, verwenden Sie „make BUILD=avr“. Jetzt ist es für das Ziel ATmega1284P kompiliert. Um mit ATmega644 als Ziel zu kompilieren, müssen Sie zusätzlich zum Ändern des Makefiles die Anzahl in icache.h reduzieren, sodass der i-Cache klein genug ist, um mit dem RAM im 644 übereinzustimmen. Im Archiv sind auch die finalen Hex-Dateien für 1284p enthalten.

▍Startvorgang

Um Codeplatz in AVR zu sparen, ist im Emulator fast kein Startcode vorhanden. Tatsächlich umfasst das „ROM“ insgesamt 50 Bytes: 8 Bytes werden verwendet, um den Thumb-Modus auszuwählen, und ein gewisser Thumb-Code liest den ersten Sektor der SD-Karte und springt in den Thumb-Modus (siehe embeddedBoot.c). Der MBR der SD-Karte verfügt über einen weiteren Bootloader (im Thumb-Modus geschrieben). Dieser Bootloader durchsucht den MBR, findet die aktive Partition und lädt deren Inhalt bis zum Ende des RAM. Dann springt es zur Ziel-RAM-Adresse +512 (siehe mbrBoot.c). Hier läuft der dritte und größte Bootloader, ELLE (siehe ELLE.c). Dieser Bootloader verschiebt die Ramdisk, richtet ATAGS ein und ruft den Kernel auf. Ich stelle alle Binärdateien und den Quellcode zur Verfügung, sodass Sie auf Wunsch Ihr eigenes Image erstellen können. Der Bootvorgang ähnelt dem Booten eines PCs. :) Mit dem mitgelieferten Tool mkbooting.sh kann ein funktionierendes Image für die Boot-Partition erstellt werden.

Das obige ist der detaillierte Inhalt vonKann Linux auf einer 8-Bit-MCU ausgeführt werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:lxlinux.net
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage