[LINUX] Port FreeRTOS auf Raspberry Pi 4B

Einführung

Als ich Unikernel auf gute Weise in ein eingebettetes System integrieren wollte, brauchte ich Geräte, auf denen RTOS und Linux gleichzeitig ausgeführt werden konnten, und portierte sie daher, wie der Titel schon sagt.

Ich bin der Meinung, dass es beim Portieren für Raspberry Pi viele FreeRTOS-unabhängige Boot-Konfigurationen gibt, aber dieses Mal können Sie mit FreeRTOS gleichzeitig mit Linux booten, nachdem Sie von U-Boot gestartet haben.

Es wäre sehr einfach, wenn Sie einen i.MX8M- oder ZynqMP-SoC mitbringen würden, der bereits über eine Implementierung verfügt, auf der RTOS und Linux gleichzeitig ausgeführt werden. Wenn Sie jedoch einen Raspelkuchen verwenden, sollten Sie Geld sparen und Wissen erwerben.

Repository

Es kann hier gefunden werden (https://github.com/TImada/raspi4_freertos). Informationen zum Erstellen und Verwenden finden Sie unter "README.md".

Die Basisimplementierung ist @eggmans FreeRTOS für Raspberry Pi 3. Vielen Dank für die Bemühungen unserer Vorgänger m (_ _) m.

Über die Transplantation

Was hat sich gegenüber der Basisimplementierung geändert?

  1. Da es sich um "Booten von U-Boot" und "gleichzeitiges Booten unter Linux" handelt, wird die Startroutine so geändert, dass sie von EL2 aus funktioniert.
  2. Die FreeRTOS-Binärdatei wurde so geändert, dass sie auf CPU-Kern Nr. 3 funktioniert (CPU-Kern Nr. 0-2 ist für Linux).
  3. Raspberry Pi 4B kann jetzt GIC als Interrupt-Controller verwenden. Ändern Sie die Verwendung
  4. UART wurde geändert, um UART2 (von PL011) zu verwenden (UART1 ist für Linux)
  5. Es wurde eine Routine hinzugefügt, um GIC-Konfigurationsänderungen von Linux zu verarbeiten, damit sie gleichzeitig mit Linux gestartet werden kann.
  6. Aktualisieren Sie die FreeRTOS-Kernelversion auf Version 10.3.0

Implementierungstipps

Binärer Kick auf CPU-Kern # 3

Wie im Kommentarartikel zum Raspberry Pi-Stub-Code ausführlich beschrieben, beträgt der Speicherbereich bis zu 0xD8 - 0xF7 8 Byte. Jedes ist mit "spin_cpuX: X = 0,1,2,3" gekennzeichnet. Wenn Sie die Binärdatei mit CPU-Kern Nr. 3 starten möchten, schreiben Sie die Startadresse der Vektortabelle in spin_cpu3 (= Adresse 0xF0) und geben Sie den SEV-Befehl aus. Der CPU-Kern Nr. 3 funktioniert dann ordnungsgemäß.

Bei dieser Portierung habe ich das Schreiben der Vektortabellenadresse an die Adresse 0xF0 dem Befehl u-boot mw überlassen, aber wenn dieser Befehl auf dem CPU-Kern # 0 ausgeführt wird, bleibt das Schreibergebnis im Cache und wird im physischen Speicher gespeichert. Es gab eine Situation, in der es nicht reflektiert wurde (Alee ...). Der CPU-Kern Nr. 3 setzt den Programmzähler, indem er den Wert an der Adresse 0xF0 betrachtet. Wenn der Wert jedoch nicht im physischen Speicher wiedergegeben wird, bleibt der Wert an der Adresse 0xF0 0x0. Zu diesem Zeitpunkt ist im CPU-Kern Nr. 3 ein Stub-Code implementiert, so dass der WFE-Befehl ausgegeben und ein Nickerchen gemacht wird.

Um dieses Problem zu lösen, wäre es schön, wenn der Befehl dcache flush von u-boot verwendet werden könnte, aber der in Ubuntu 20.04 LTS für Raspberry Pi 4B enthaltene u-boot hatte diesen Befehl nicht, also u-boot Ich musste neu kompilieren ...

Gleichzeitiger Start unter Linux

Wenn Sie Linux nach dem Aufrufen des FreeRTOS-Beispiels über die U-Boot-Eingabeaufforderung starten, legt Linux GIC für Linux fest und die zuvor in FreeRTOS festgelegte GIC-Konfiguration wird überschrieben (insbesondere das Problem). Es war eine Neufassung der GIC Distributor-Einstellungen von Linux. In diesem Fall werden der Tick-Timer und die UART-Interrupts nicht aktiviert.

Deshalb habe ich dieses Mal einen Mechanismus auf der FreeRTOS-Seite implementiert, um zu erkennen, wann Linux die GIC-Verteilereinstellung beendet, und FreeRTOS setzt die GIC-Einstellung erneut zurück, nachdem Linux die GIC-Einstellung abgeschlossen hat. Erkennungsmechanismus ist ein erdschleifender x2-Prozess. Irgendwann müssen wir die Methode überdenken.

Code-Implementierung für UART2 (PL011)

Wenn Sie damit vertraut sind, haben Sie es möglicherweise bereits bemerkt. Wenn Sie UART1 (Mini-UART) auf der FreeRTOS-Seite verwenden, müssen Sie sich nicht um die Implementierung von UART2 kümmern, da UART1 bereits in der Basisimplementierung enthalten war.

Ja, natürlich wusste ich es, aber ich habe es gewagt. Lächeln.

Nächster Meilenstein

Portiert remoteproc / rpmsg, damit Linux und FreeRTOS kommunizieren können.

Recommended Posts

Port FreeRTOS auf Raspberry Pi 4B
Ich habe mit Raspberry Pi gesprochen
Einführung von PyMySQL in Himbeer-Pi3
Himbeere pi 1 Modell b, Python
Himbeer pi 1 Modell b, knotenroter Teil 17
Ausgabe von Raspberry Pi an Line
[Raspberry Pi] Python wurde standardmäßig in Python3 geändert
Schließen Sie zwei USB-Kameras an Raspberry Pi 4 an
USB-Boot auf Raspberry Pi 4 Model B.
Erstellen Sie eine OpenCV-Python-Umgebung auf Raspberry Pi B +
So installieren Sie NumPy auf Raspeye
Warum DetectMultiScale () auf Raspberry Pi B + langsam ist
Verwendung von Raspeye Pie Camera Python
Einführung von Ceph mit Kubernetes auf Raspberry Pi 4B (ARM64)
Verbinden Sie Ihren Raspberry Pi mit Blynk mit Ihrem Smartphone
Stellen Sie mit Python auf Raspberry Pi eine Verbindung zu MySQL her
GPS-Tracking mit Raspeye 4B + BU-353S4 (Python)
Vom Einrichten des Raspberry Pi bis zur Installation der Python-Umgebung
Memo zur Migration von Djangos DB von SQLite3 nach MySQL auf Docker auf Raspberry Pi 4B
Führen Sie die LED-Matrix interaktiv mit Raspberry Pi 3B + auf Slackbot aus
Was ist Raspberry Pi?
Einfaches IoT, um mit Raspeye und MESH zu beginnen
GPGPU mit Raspberry Pi
Stellen wir uns den Raum mit Raspeltorte vor, Teil 1
Verwendung von Raspeye Relay Module Python
Pigpio auf Himbeer-Pi
Raspberry Pi Videokamera
Raspberry Pi Schlechtes Wissen
Lass uns Raspberry Pi machen?
USB-Boot mit Raspberry Pi 4 Modell B (3) LVM Edition
Steuern Sie das Ein- und Ausschalten des USB-Anschlusses des Raspberry Pi
DigitalSignage mit Raspberry Pi
Raspberry Pi 4 Setup-Hinweise
Ausgabe auf "7 Segment LED" mit Python mit Raspberry Pi 3!
Cython auf Raspberry Pi
Einfache Einführung in Home Hack mit Raspberry Pi und discord.py
Aktualisieren Sie Raspberry Pi Python mit pyenv auf 3.7 oder höher
[Hinweis] Installieren von VMware ESXi auf Arm Fling auf Raspeye 4B
[Raspberry PI & Garmin GLO] Bis Bluetooth GPS mit Raspberry PI & Garmin GLO verbunden ist
Führen Sie den Python-Beispielcode BNO055 mit I2C (Raspberry Pi 3B) aus.
Ich möchte Interrupts auf dem Raspberry Pi deaktivieren (≒ DI / EI)
Ich habe versucht, [eine bestimmte Aufgabe] mit einem Raspeltorte zu automatisieren
getrpimodel: Erkennen Sie das Himbeer-Pi-Modell (A, B, B +, B2, B3 usw.) mit Python
Ändern Sie die Meldung, die beim Anmelden bei Raspberry Pi angezeigt wird
So erhalten Sie die Temperatur vom SwitchBot-Thermo-Hygrometer mit Himbeer-Pi
[Raspberry Pi] Minimales Memo zur Erstellung von Gerätetreibern zur Ausgabe von GPIO
Verbinden Sie Raspberry Pi mit "Python" mit der Alibaba Cloud IoT Platform
Ich habe die Daten von Raspberry Pi an GCP gesendet (kostenlos)
Innenüberwachung mit Raspberry Pi
Mutter pflanzt mit Raspberry Pi
Installation von Raspberry Pi OS (Raspbian)
Raspeye + Python + OpenGL-Memo
Raspbian Grundeinstellungen (Raspberry Pi 4)
Pyenv auf Raspberry Pi eingeführt
Verwenden Sie NeoPixel mit Himbeerkuchen
Installieren Sie OpenCV4 auf Raspberry Pi 3