Lass die LED leuchten (PI5)

Aus C und Assembler mit Raspberry
Version vom 3. Juli 2024, 07:35 Uhr von Satyria (Diskussion | Beiträge) (Die Seite wurde neu angelegt: „Mit den zuvor erstellten Makefile und Linker-Script haben wir eine Basis geschaffen, um ein sinnvolles Programm zu entwickeln. Unser Ziel ist es, die fest eingebaute LED des Raspberry Pi zum Blinken zu bringen. Ich werde jeden Schritt erklären, warum er in diesem Projekt so implementiert wurde. === Vorbereitung des Verzeichnisses === Erstelle zunächst ein neues Verzeichnis, z.B. LED, und platziere darin das Makefile und die Datei linker.ld. Erzeuge au…“)
(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)

Mit den zuvor erstellten Makefile und Linker-Script haben wir eine Basis geschaffen, um ein sinnvolles Programm zu entwickeln. Unser Ziel ist es, die fest eingebaute LED des Raspberry Pi zum Blinken zu bringen. Ich werde jeden Schritt erklären, warum er in diesem Projekt so implementiert wurde.

Vorbereitung des Verzeichnisses

Erstelle zunächst ein neues Verzeichnis, z.B. LED, und platziere darin das Makefile und die Datei linker.ld. Erzeuge auch das Verzeichnis include innerhalb von LED, um unsere Header-Dateien zu organisieren.

Programmierung des Startverhaltens des Raspberry Pi

Hierzu erstellen wir die Datei "boot.S":

//
// boot.S
//

#include “config.h”

.section .init  // Ensure the linker places this at the beginning of the kernel image
.global _start  // Execution starts here

_start:
	ldr	x0, =MEM_KERNEL_STACK
	mov	sp, x0			// init its stack	
	b sysinit

Erklärung:

#include "config.h": Inkludiert die Konfigurationsdatei, in der wir benötigte Parameter definieren.

.section .init: Definiert einen Abschnitt, der am Anfang des Kernel-Images platziert wird.

.global _start: Deklariert _start als global, damit es von allen Programmteilen verwendet werden kann.

_start:: Label, das den Startpunkt der Ausführung markiert.

ldr x0, =MEM_KERNEL_STACK: Lädt die Adresse von MEM_KERNEL_STACK in das Register x0, wie es in config.h definiert ist.

mov sp, x0: Initialisiert den Stack-Zeiger SP.

b sysinit: Springt zur Funktion sysinit, die später implementiert wird.

Dies ist der erste Programmteil, den wir als boot.S speichern. Die ersten drei Zeilen dienen als Kommentar, um den Abschnitt des Codes zu kennzeichnen.

In der nächsten Phase werden wir die Funktion sysinit implementieren, um das System weiter zu initialisieren.