Raspberry Pi RP2040 Echtzeit -Betriebssystem
Lernprojekt zur Schaffung eines vorbeugenden OS-Supports in Echtzeit für den RP2040. Scheduler -Code ist in C geschrieben, um ein einfaches Experimentieren zu ermöglichen. Die aktuellen Fähigkeiten umfassen:
Präventiv
Priorität der Faden
Wartet/verzögert
Kooperative Ertrag
Mutexes
Stapelüberprüfungen (Ausgaben -Haltepunkt)
Die Kontextschaltzeiten auf dem 125 -MHz -Pico mit vier Threads sind:
Keine Optimierungen
| Kontextzeit |
|---|
| Keine Statistiksammlung: | 5.8 uns |
| Mit Statistiken sammeln: | 9.3 US |
| Mit Statistiken/Stapelprüfungen: | 9.9 US |
Beispielcode hat eine einfache "obere" Ausgabe alle zwei Sekunden zum seriellen Anschluss. Die CTX = -Werte sind der Prozentsatz der Zeit, die im Kontextschalter aufgewendet werden. Util = ist der Prozentsatz der Zeit in einem Faden und in Leerlauf = Prozent in einer der im Leerlaufkerne ausgegebenen Kerne.
Die S- oder Statusanzeige ist einfach: W-Waiting, R-Running, Z-Zombied oder Thread Return.
Wandzeit 0:56:38
CPU0 CTX = 0,095%, Util = 1,229% Leerlauf = 98,771%
CPU1 CTX = 0,074%, Util = 0,081% Leerlauf = 99,919%
Thrd Name S Pri cpu lastCPU
0 Rot LED W 100 0,001% 1
1 grüne LED W 100 0,011% 0
2 Bericht R 255 1.115% 0
3 Spinner Z 150 0,000% 0
Die aktuelle Implementierung besteht aus drei Dateien und einem Hauptbeispiel:
RP2040OS.H OS -Header
RP2040OS.C -Implementierung in c
Func.s Implementierungsfunktion in der Montage
main.c Beispiel
Ein einfacher Anwendungsfall, um zwei Threads zu starten:
#include "RP2040.h"
static uint32_t blink1Stack [128];
void blink1 () {
while (wahr) {
setGpio (LED_PIN1);
Delayms (300);
CLRGPIO (LED_PIN1);
Delayms (300);
}
}
static uint32_t blink2Stack [128];
void blink2 () {
while (wahr) {
setgpio (LED_PIN2);
Delayms (300);
CLRGPIO (LED_PIN2);
Delayms (300);
}
}
int main () {
stdio_init_all ();
gpio_init (led_pin1);
gpio_set_dir (led_pin1, gpio_out);
gpio_init (led_pin2);
gpio_set_dir (led_pin2, gpio_out);
Addthread ("Red LED", Blink1, Blink1Stack, sizeof (Blink1Stack), 100);
Addthread ("Green LED", Blink2, Blink2Stack, sizeof (Blink2Stack), 100);
setupSched (); // keine Rückkehr
}
### Stapelgrößen
Beachten Sie, dass je mehr Bibliotheksfunktionen Sie anrufen, desto mehr Stapelraum benötigen Sie möglicherweise. Die Verwendung der Printf -Funktion erfordert beispielsweise mehr als 256 32 -Bit -Werte in einem Stapel, um die Funktionen des Funktionsspeichers zu erfüllen. Wenn das zu testende Gerät an einem Debugger beigefügt ist, kann der Stack_Watch eingeschaltet werden und löst einen BKPT (Breakpoint) im Debugger aus, wenn einer der Stapelschutzwerte geändert wird, was auf eine mögliche Überlaufbedingung hinweist.
### Osconfig.h
Mit dieser Datei können Sie anpassen, wie der Scheduler funktioniert. Standardmäßig wird es auf die RP2040 -Spezifikationen oder zwei Kerne eingestellt. Durch das Einstellen der user_tasks auf den richtigen Betrag für Ihre Anwendung werden die verwendete Speichermenge minimiert. Zusätzliche Threadinformationen wie Benennung, Statistiken und Stapelüberwachung verbrauchen auch etwas mehr Speicher, können jedoch beim Debuggen sehr hilfreich sein.
Das ContextSW_Pin kann mit einem Oszilloskop verwendet werden, um die Kontextschalter in Echtzeit zu sehen.
Gebäude
Exportieren Sie pico_sdk_path = Pfad zu Ihrem Pico-SDK
Kopieren Sie die $ pico_sdk_path/external/pico_sdk_import.cmake in das Hauptverzeichnis.
$> mkdir Build
$> CD Build
$> cmake .. -dcmake_build_type = debugug
$> mach