Home Blog Movies Projects

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".

ah_shit_here_we_go_again.jpg

"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:

  1. Blinking
    • Tenemos que implemetar
  2. StopBlink
  3. CancelBlink

Blinking

StopBlink

CancelBlink

"EF3 - La alarma y la secundaria"

Material

Archivo base

  • Añadir
  • Añadir
  • Añadir

EF31 - Añadir un comando blink

Especificaciones

  1. Implementar el comando "blink" con la siguiente estructura: blink [red|green|blue] [veces] [frecuencia]
  2. 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.
  3. 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 ...  */
        }
      }
      

EF32 - Implementación de un sistema de alarma

"EC4 - Lo imposible"

EF31 - Añadir un comando blink

Material

Código de partida

Especificaciones

Las especificaciones son las siguientes:

  1. Implementar el comando "blink" con la siguiente estructura: blink [red|green|blue] [veces] [frecuencia]
  2. 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.
  3. 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 ...  */
        }
      }
      

EF32 - Implementación de un sistema de alarma