MicroKernels - FreeRTOS
Contexto
Como parte de la asignatura de microkernels tengo que desarrollar distintos "mini" proyectitos con RTOS (Real Time Operating Systems). Específicamente con FreeRTOS. La verdad es que voy a contrareloj por varios motivos, respecto al cronograma de trabajo llevo un par de días de retraso y se notan y respecto a mi vida personal, tengo un hito este sábado (23/11/2024).
Creo que la mejor forma de estructurar cada proyecto es darle un nombre, poner los requisitos, describir grosso-modo como lo he resuelto, con alguna imagen, trozos de código útiles, vídeo, setup, y el proyecto completo.
Así que manos a la obra, pero primero un "Ah shit, here we go again".
"EC3 - Parpadeos locos"
Esta actividad la he titulado parpadeos locos. El objetivo es hacer que placa MSP430F529, la cual tiene dos leds, se pueda controlar mediante una pequeña interfaz de comandos y los dos botones que tiene.
Los requisitos son los siguientes:
- Blinking
- Tenemos que implemetar
- StopBlink
- CancelBlink
Blinking
StopBlink
CancelBlink
"EF3 - La alarma y la secundaria"
Material
- 1 x ESP-WROVER-KIT_V4.1
- 1 x botón
- 1 x potenciómetro
- Proyecto de partida
Archivo base
- Añadir
- Añadir
- Añadir
EF31 - Añadir un comando blink
Especificaciones
- Implementar el comando "blink" con la siguiente estructura: blink [red|green|blue] [veces] [frecuencia]
- El tiempo de encendido (ON) y apagado (OFF) del LED será simétrico, siendo cada uno de estos tiempos la mitad del periodo de parpadeo.
- Debe funcionar con los 3 LEDs (rojo, verde, azul).
Modificaciones
- File: console_example_main.c
- Variables & Macros
He añadido una cola para comunicar la tarea que gestiona la interfaz de comandos con la que gestiona los parpadeos.
#define BLINK_QUEUE_SIZE 20 /* Tamaño de la cola */ QueueHandle_t BlinkQueue;
- Task: Blink
He definido una n
static void Blink( void *pvParameters ){ uint8_t ColorLed[3] = {BLINK_GPIO_1, BLINK_GPIO_2,BLINK_GPIO_3}; float semiperiodo; BlinkConfig led; while(1) { xQueueReceive(BlinkQueue, &led, portMAX_DELAY); semiperiodo = 1/(2*led.frecuencia); while(led.veces > 0){ /* Blink off (output low) */ gpio_set_level(ColorLed[led.color], 1); vTaskDelay(semiperiodo*configTICK_RATE_HZ); /* Blink on (output high) */ gpio_set_level(ColorLed[led.color], 0); vTaskDelay(semiperiodo*configTICK_RATE_HZ); led.veces--; } } }
- Main
En el main he añadido
void app_main(void){ /* ... a lot of code ... */ BlinkQueue = xQueueCreate(BLINK_QUEUE_SIZE,sizeof(BlinkConfig)); if (BlinkQueue == NULL){ while(1); } if (xTaskCreate( Blink, "Blink", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY+1, NULL )!=pdPASS){ printf("No se pudo crear la tarea GreenLedBlink"); } while(true) { /* ... a lot of code ... */ } }
- Variables & Macros
EF32 - Implementación de un sistema de alarma
"EC4 - Lo imposible"
EF31 - Añadir un comando blink
Material
- 1 x ESP-WROVER-KIT_V4.1
- 1 x botón
- 1 x potenciómetro
- Proyecto de partida
Código de partida
Especificaciones
Las especificaciones son las siguientes:
- Implementar el comando "blink" con la siguiente estructura: blink [red|green|blue] [veces] [frecuencia]
- El tiempo de encendido (ON) y apagado (OFF) del LED será simétrico, siendo cada uno de estos tiempos la mitad del periodo de parpadeo.
- Debe funcionar con los 3 LEDs (rojo, verde, azul).
Modificaciones
- File: console_example_main.c
- Variables & Macros
#define BLINK_QUEUE_SIZE 20 /* Tamaño de la cola */ QueueHandle_t BlinkQueue;
- Task: Blink
He definido una n
static void Blink( void *pvParameters ){ uint8_t ColorLed[3] = {BLINK_GPIO_1, BLINK_GPIO_2,BLINK_GPIO_3}; float semiperiodo; BlinkConfig led; while(1) { xQueueReceive(BlinkQueue, &led, portMAX_DELAY); semiperiodo = 1/(2*led.frecuencia); while(led.veces > 0){ /* Blink off (output low) */ gpio_set_level(ColorLed[led.color], 1); vTaskDelay(semiperiodo*configTICK_RATE_HZ); /* Blink on (output high) */ gpio_set_level(ColorLed[led.color], 0); vTaskDelay(semiperiodo*configTICK_RATE_HZ); led.veces--; } } }
- Main
En el main he añadido
void app_main(void){ /* ... a lot of code ... */ BlinkQueue = xQueueCreate(BLINK_QUEUE_SIZE,sizeof(BlinkConfig)); if (BlinkQueue == NULL){ while(1); } if (xTaskCreate( Blink, "Blink", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY+1, NULL )!=pdPASS){ printf("No se pudo crear la tarea GreenLedBlink"); } while(true) { /* ... a lot of code ... */ } }
- Variables & Macros