💻 C und Assembler mit Raspberry Pi

Grundlegendes zu C

Die Programmiersprache C

C (benannt als Nachfolger der Programmiersprache B) ist eine universelle, strukturierte Programmiersprache, die sich durch ihre Nähe zur Hardware und ihre hohe Ausführungsgeschwindigkeit auszeichnet. Sie wurde zwischen 1969 und 1972 von Dennis Ritchie an den AT&T Bell Laboratories entwickelt, um das Betriebssystem Unix effizient und portabel zu programmieren. C repräsentiert die dritte Generation der Programmiersprachen und schlägt die Brücke zwischen der hardwarenahen Assembler-Programmierung und modernen Hochsprachen.

Ein wesentlicher Vorteil von C liegt in der Kombination zweier Welten: Während Entwickler komplexe Datenstrukturen und Kontrollstrukturen (wie Schleifen oder Verzweigungen) in lesbarem Code formulieren können, erlaubt C durch Zeiger (Pointer) und direkten Speicherzugriff eine punktgenaue Steuerung der Ressourcen. Der geschriebene C-Code wird durch einen Compiler (wie gcc oder clang) in Maschinencode übersetzt. Im Gegensatz zu hochabstrakten Sprachen wie Python oder Java gibt es in C keine automatische Speicherbereinigung (Garbage Collection) – der Programmierer behält die volle Kontrolle, trägt aber auch die Verantwortung für die Speicherverwaltung.

Da C sehr effizient ist und kaum Abstraktionsoverhead mit sich bringt, bildet es bis heute das Fundament der modernen Softwareentwicklung. Betriebssystem-Kerne (wie der Linux-Kernel oder Windows), Gerätetreiber, Datenbanken und eingebettete Systeme (Embedded Systems) sind größtenteils in C geschrieben. Auch viele spätere Sprachen wie C++, C#, Java oder PHP haben ihre Syntax direkt an C angelehnt.

C auf der ARM-Architektur

In der Welt der ARM-Prozessoren nimmt C eine Schlüsselrolle ein. Da Assembler-Code sehr spezifisch für eine bestimmte Befehlssatzarchitektur ist, erfordert das Schreiben größerer Programme in Assembler enormen Aufwand. C bietet hier den idealen Kompromiss: Der Code ist weitgehend plattformunabhängig schreibbar, lässt sich aber durch ARM-optimierte Compiler in extrem effizienten Maschinencode übersetzen.

Auf den Systemen Raspberry Pi 4 und Raspberry Pi 5 greifen C und ARM-Assembler perfekt ineinander. Viele hardwarenahe Anwendungen nutzen C als Hauptsprache und binden nur für extrem zeitkritische oder prozessorspezifische Abschnitte kurzen Assembler-Code ein (Inline-Assembler).

Um C-Programme für den Raspberry Pi zu schreiben und zu übersetzen, nutzen wir das GCC-Toolset (GNU Compiler Collection). Der Compiler übersetzt den C-Code dabei oft in einem Zwischenschritt intern in ARM-Assemblercode, bevor die eigentliche Binärdatei erzeugt wird. So lässt sich am Beispiel von C hervorragend nachvollziehen, wie abstrakt definierte Befehle auf die tatsächliche Mikroarchitektur des Broadcom BCM2711 (ARMv8 / Raspberry Pi 4) oder BCM2712 (ARMv8.2-A / Raspberry Pi 5) abgebildet werden.

In den folgenden Abschnitten werden wir die Entwicklungsumgebung für C einrichten und erste Programme erstellen, die zeigen, wie C direkt mit den Hardware-Ressourcen des Raspberry Pi interagiert.