Raspberry Pi RP2040 OS real en tiempo real
Proyecto de aprendizaje para crear un soporte de sistema operativo preventivo en tiempo real para el RP2040. El código de Scheduler está escrito en C para permitir una fácil experimentación. Las capacidades actuales incluyen:
Con derecho preferente
Prioridad del hilo
Esperas/retrasos
Rendimiento cooperativo
Mutexes
Comprobaciones de pila (punto de ruptura de problemas)
Los tiempos de cambio de contexto en el PICO de 125MHz con cuatro hilos son:
Sin optimizaciones
| Tiempo de contexto |
|---|
| Sin colección de estadísticas: | 5.8 nosotros |
| Con estadísticas coleccionadoras: | 9.3 nosotros |
| Con estadísticas/cheques de pila: | 9.9 nosotros |
El código de ejemplo tiene una salida simple "superior" cada dos segundos al puerto serie. Los valores CTX = son el porcentaje de tiempo dedicado al interruptor de contexto. Util = es el porcentaje de tiempo dedicado a un hilo e inactivo = porcentaje gastado en uno de los hilos inactivos de núcleos.
El indicador de estado S o es simplemente: W-Waiting, R-Running, Z-Zombied o Hilo devuelto.
Tiempo de pared 0:56:38
CPU0 CTX = 0.095%, Util = 1.229% inactivo = 98.771%
CPU1 CTX = 0.074%, Util = 0.081% inactivo = 99.919%
Thrd nombre s pri cpu lastcpu
0 Red LED W 100 0.001% 1
1 LED verde W 100 0.011% 0
2 Informe R 255 1.115% 0
3 spinner z 150 0.000% 0
La implementación actual consta de tres archivos y un ejemplo principal:
RP2040Os.H encabezado de os
RP2040OS.C Implementación en C
Función de implementación de FURC.S en el ensamblaje
Main.c Ejemplo
Un caso de uso simple para iniciar dos hilos:
#Include "RP2040.H"
static uint32_t Blink1stack [128];
void Blink1 () {
while (verdadero) {
setGPIO (LED_PIN1);
demora (300);
CLRGPIO (LED_PIN1);
demora (300);
}
}
static uint32_t Blink2stack [128];
void Blink2 () {
while (verdadero) {
setGPIO (LED_PIN2);
demora (300);
CLRGPIO (LED_PIN2);
demora (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 ("LED verde", Blink2, Blink2Stack, SizeOf (Blink2Stack), 100);
setUpSched (); // sin devolución
}
### Tamaños de pila
Tenga en cuenta que cuantas más funciones de biblioteca llame, más espacio de pila podrá necesitar. Por ejemplo, el uso de la función PrintF requerirá más de 256 valores de 32 bits en una pila para manejar los requisitos de memoria de las funciones. Si la unidad debajo de la prueba está conectada a un depurador, el stack_watch se puede activar y activará un BKPT (punto de interrupción) en el depurador si alguno de los valores de la protección de pila se modifica, lo que indica una posible condición de desbordamiento.
### Osconfig.h
Este archivo le permite personalizar cómo funciona el planificador. Por defecto, se establece en las especificaciones RP2040 o dos núcleos. Configuración de User_Tasks en la cantidad correcta de su aplicación minimizará la cantidad de memoria utilizada. La información adicional de los hilos, como los nombres, las estadísticas y el monitoreo de la pila, también consumen un poco más de memoria, pero puede ser muy útil con la depuración.
El contextsw_pin se puede usar con un osciloscopio para ver los interruptores de contexto en tiempo real.
Edificio
Exportar pico_sdk_path = ruta a tu pico-sdk
Copie el $ pico_sdk_path/external/pico_sdk_import.cmake en el directorio principal.
$> Mkdir Build
$> CD Build
$> cmake .. -dcmake_build_type = debug
$> hacer