Raspberry PI RP2040 OS en temps réel
Projet d'apprentissage pour créer un support de système d'exploitation préventif et en temps réel pour le RP2040. Le code du planificateur est écrit en C pour permettre une expérimentation facile. Les capacités actuelles comprennent:
De préemption
Priorité du thread
Attend / retards
Rendement coopératif
Mutex
Chèques de pile (problèmes d'arrêt)
Les temps de commutation de contexte sur le pico 125 MHz avec quatre threads sont:
Pas d'optimisations
| Temps de contexte |
|---|
| Aucune collection de statistiques: | 5.8 US |
| Avec Stats Collecton: | 9.3 US |
| Avec statistiques / chèques de pile: | 9.9 US |
L'exemple de code a une sortie «supérieure» simple toutes les deux secondes au port série. Les valeurs CTX = sont le pourcentage de temps passé dans le commutateur de contexte. Util = est le pourcentage de temps passé dans un thread et inactif = pour cent dépensé dans l'un des cœurs inactifs.
L'indicateur S ou d'état est simplement: W-Waiting, R-Running, Z-Zombied ou Thread Retourné.
Temps de mur 0:56:38
CPU0 CTX = 0,095%, util = 1,229% inactif = 98,771%
CPU1 CTX = 0,074%, util = 0,081% inactif = 99,919%
THRD NAME S PRI CPU LASTCPU
0 LED rouge W 100 0,001% 1
1 LED vert w 100 0,011% 0
2 rapport R 255 1,115% 0
3 Spinner Z 150 0,000% 0
L'implémentation actuelle se compose de trois fichiers et d'un exemple principal:
En-tête RP2040OS.h
Implémentation RP2040OS.C en C
Fonction de mise en œuvre de Func.s en assemblage
Exemple Main.c
Un cas d'utilisation simple pour lancer deux fils:
#include "rp2040.h"
statique uint32_t blink1stack [128];
void blink1 () {
while (true) {
setGpio (LED_PIN1);
Détraves (300);
clrgpio (LED_PIN1);
Détraves (300);
}
}
statique uint32_t blink2stack [128];
void blink2 () {
while (true) {
setGpio (LED_PIN2);
Détraves (300);
clrgpio (LED_PIN2);
Détraves (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);
ConseupSched (); // Pas de retour
}
Tailles de pile ###
Sachez que plus vous appelez la bibliothèque que vous appelez, plus vous avez besoin d'espace de pile. Par exemple, l'utilisation de la fonction printf nécessitera plus de 256 valeurs 32 bits dans une pile pour gérer les exigences de mémoire des fonctions. Si l'unité testée est attachée à un débogueur, la pile_watch peut être activée et déclenchera un BKPT (point d'arrêt) dans le débogueur si l'une des valeurs de la garde de pile est modifiée, indiquant une condition de débordement possible.
### Osconfig.h
Ce fichier vous permet de personnaliser le fonctionnement du planificateur. Par défaut, il est défini sur les spécifications RP2040 ou deux cœurs. La définition de l'User_Tasks sur le montant correct pour votre application minimisera la quantité de mémoire utilisée. Des informations supplémentaires sur le thread telles que la dénomination, les statistiques et la surveillance de la pile consomment également un peu plus de mémoire, mais peuvent être très utiles pour le débogage.
Le contextesw_pin peut être utilisé avec un oscilloscope pour voir les changements de contexte en temps réel.
Bâtiment
exporter pico_sdk_path = chemin vers votre pico-sdk
Copiez les $ pico_sdk_path / external / pico_sdk_import.cmake dans le répertoire principal.
$> mkdir build
$> CD Build
$> cmake .. -dcmake_build_type = débogue
$> faire