Wie führe ich ein C-Programm ohne Betriebssystem auf dem Raspberry Pi aus?
Lesezeit: 6 Minuten
watswat5
Ich würde gerne mit dem Raspberry Pi für einige verschiedene eingebettete Anwendungen auf niedriger Ebene experimentieren. Das einzige Problem ist, dass Raspberry Pi im Gegensatz zu den verfügbaren AVR- und PIC-Mikrocontroller-Boards normalerweise ein Betriebssystem (wie Raspbian) ausführt, das die CPU-Zeit auf alle laufenden Programme verteilt und es für bestimmte Echtzeitanwendungen unpraktisch macht.
Ich habe das kürzlich gelernt, vorausgesetzt, Sie haben einen Bootloader wie GRUB installiert, der ein C-Programm auf x86 ausführt (in Form eines Kernels) erfordert sehr wenig Einrichtung, nur ein Assemblerprogramm zum Aufrufen der Hauptfunktion und des eigentlichen C-Codes.
Gibt es eine Möglichkeit, dies mit einem Raspberry Pi zu erreichen? Es wäre eine großartige Möglichkeit, etwas über die Low-Level-ARM-Programmierung zu lernen, und es hat bereits ein paar komplexe Peripheriegeräte, mit denen man herumspielen kann (USB, Ethernet usw.).
Wenn Sie nicht einmal einen minimalen Linux-Kernel verwenden, müssten Sie dann nicht am Ende eine ganze Reihe von Kernel-Funktionen schreiben, nur um mit allen Peripheriegeräten zu interagieren?
– Wut
24. April 2015 um 2:51 Uhr
Nicht wirklich. Es hängt davon ab, was Sie tun möchten. Wenn Sie nur ein Licht blinken lassen möchten, brauchen Sie wirklich nicht viel Code. Aber mit USB, Ethernet usw. zu sprechen, wäre eine Menge Arbeit.
– Jo
24. April 2015 um 2:53 Uhr
Können Sie nicht einfach ein paar leichtgewichtige Echtzeitbetriebssysteme ausprobieren, bevor Sie eine Entscheidung treffen?
– Benutzer3528438
24. April 2015 um 2:57 Uhr
solltest du auschecken raspberrypi.stackexchange.com/questions/1408/… bevor Sie das Betriebssystem löschen. Auf PICs usw. läuft kein Betriebssystem, weil Sie oft keinen Platz dafür haben! auf dem Pi, und es gibt Möglichkeiten, in Echtzeit zu laufen
– Keith Nicholas
24. April 2015 um 3:23 Uhr
@KeithNicholas, es gibt viele Gründe, kein Betriebssystem auszuführen. Sie können Zyklen nicht genau zählen oder etwas mit Zyklusgenauigkeit entwickeln, wenn Sie das Betriebssystem um Erlaubnis bitten müssen.
– cbmeeks
15. August 2017 um 13:03 Uhr
Ciro Santilli OurBigBook.com
Vollautomatisches Beispiel für einen minimalen Bare-Metal-Blinker
Getestet auf Ubuntu 16.04-Host, Raspberry Pi 2.
https://github.com/dwelch67/raspberrypi ist das umfassendste Beispielset, das ich bisher gesehen habe (zuvor in dieser jetzt gelöschten Antwort erwähnt), aber dies ist eine minimale, einfach einzurichtende Hallo-Welt, damit Sie schnell loslegen können.
Verwendungszweck:
Legen Sie die SD-Karte in den Host ein
Machen Sie das Bild:
./make.sh /dev/mmblck0 p1
Wo:
/dev/mmblck0 ist das Gerät der SD-Karte
p1 ist die erste Partition des Geräts (/dev/mmblck0p1)
Hier beschreibe ich einige Bare-Metal-QEMU-Setups, die von Interesse sein könnten: Wie erstellt man Bare-Metal-ARM-Programme und führt sie auf QEMU aus? Das Schreiben auf den UART ist der einfachste Weg, um eine Ausgabe von QEMU zu erhalten.
Wie gut QEMU den Raspberry Pi simuliert, lässt sich teilweise aus: How to emulate Raspberry Pi Raspbian with QEMU? Da sogar das Linux-Terminal auftaucht, ist es wahrscheinlich, dass Ihr Baremetal-Zeug auch funktioniert.
Bonus
Hier ist ein x86-Beispiel für Neugierige: Wie führt man ein Programm ohne Betriebssystem aus?
Obwohl Bare Metal auf dem Pi möglich ist, würde ich es vermeiden, da Linux so leichtgewichtig wird und eine ganze Reihe von Dingen für Sie erledigt.
Nach alledem würde ich einfach Ihre bevorzugte eingebettete Linux-Distribution laden (RT-gepatcht könnte je nach Ihren Anforderungen bevorzugt werden) und es als gut bezeichnen.
Danke für die Information. Ich werde wahrscheinlich vorerst die Bare-Metal-Programmierung verwenden, da das Projekt keine Zeitbeschränkungen hat, aber ich werde die eingebettete Linux-Distribution im Auge behalten!
– watswat5
24. April 2015 um 3:18 Uhr
Leider wurde Valvers offline genommen, weil es zu nützlich war. Sie müssen jetzt über den Google-Cache darauf zugreifen :/
– Eule
5. März 2019 um 15:03 Uhr
https://www.cl.cam.ac.uk/projects/raspberrypi/tutorials/os/ ist ein großartiges Tutorial, und da sie Ihnen sagen werden, dass der beste schnelle und schmutzige Weg, Code auf Bare Metal auszuführen, darin besteht, eine Linux-Distribution zu entführen, kompilieren Sie dazu einfach in kernel.img (mit den entsprechenden Architekturoptionen) und verwenden Sie es es, um das vorhandene in der Linux-Distribution zu ersetzen, nur für diesen Abschnitt des Tutorials, zu dem Sie gehen können: https://www.cl.cam.ac.uk/projects/raspberrypi/tutorials/os/ok01.html#pitime
Der Pi ist möglicherweise etwas suboptimal für das, was Sie tun möchten, da das SoC-Design so ist, dass die ARM-CPU ein Bürger zweiter Klasse ist – was bedeutet, dass es einige Reifen gibt, durch die man springen muss, um ein Bare-Metal-Programm darauf laufen zu lassen.
Allerdings könnte man ein bisschen schummeln und das nutzen U-Boot-API um Ihnen Zugriff auf einige der Funktionen zu geben, die U-Boot bietet, aber in der Lage zu sein, Ihre eigenen Funktionen nebenbei hinzuzufügen.
14004100cookie-checkWie führe ich ein C-Programm ohne Betriebssystem auf dem Raspberry Pi aus?yes
Wenn Sie nicht einmal einen minimalen Linux-Kernel verwenden, müssten Sie dann nicht am Ende eine ganze Reihe von Kernel-Funktionen schreiben, nur um mit allen Peripheriegeräten zu interagieren?
– Wut
24. April 2015 um 2:51 Uhr
Nicht wirklich. Es hängt davon ab, was Sie tun möchten. Wenn Sie nur ein Licht blinken lassen möchten, brauchen Sie wirklich nicht viel Code. Aber mit USB, Ethernet usw. zu sprechen, wäre eine Menge Arbeit.
– Jo
24. April 2015 um 2:53 Uhr
Können Sie nicht einfach ein paar leichtgewichtige Echtzeitbetriebssysteme ausprobieren, bevor Sie eine Entscheidung treffen?
– Benutzer3528438
24. April 2015 um 2:57 Uhr
solltest du auschecken raspberrypi.stackexchange.com/questions/1408/… bevor Sie das Betriebssystem löschen. Auf PICs usw. läuft kein Betriebssystem, weil Sie oft keinen Platz dafür haben! auf dem Pi, und es gibt Möglichkeiten, in Echtzeit zu laufen
– Keith Nicholas
24. April 2015 um 3:23 Uhr
@KeithNicholas, es gibt viele Gründe, kein Betriebssystem auszuführen. Sie können Zyklen nicht genau zählen oder etwas mit Zyklusgenauigkeit entwickeln, wenn Sie das Betriebssystem um Erlaubnis bitten müssen.
– cbmeeks
15. August 2017 um 13:03 Uhr