Curso freeRTOS & ESP32

Placas y sistemas de desarrollo con tecnología empotrada

Curso freeRTOS & ESP32

Notapor biblioman » Sab Abr 01, 2017 5:18 pm

Hola a tod@s. Aquí iré dejando los ejemplos que vaya haciendo con freeRTOS y los ESP32.

1º Ejemplo con tareas
Código: Seleccionar todo
/* 1º Ejemplo básico con tareas.
*/
#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_system.h"
#include "nvs_flash.h"

void tarea1(void *pvParameter)
{
    while(1) {
      printf("Ejecutando tarea 1\n");
        vTaskDelay(1000 / portTICK_PERIOD_MS);

    }
    vTaskDelete(NULL);
}

void tarea2(void *pvParameter)
{
    while(1) {
       printf("Ejecutando tarea 2\n");
        vTaskDelay(1000 / portTICK_PERIOD_MS);

    }
    vTaskDelete(NULL);
}

void tarea3(void *pvParameter)
{
    while(1) {
      printf("Ejecutando tarea 3\n");
        vTaskDelay(1000 / portTICK_PERIOD_MS);

    }
    vTaskDelete(NULL);
}

void tarea4(void *pvParameter)
{
    while(1) {
       printf("Ejecutando tarea 4\n");
        vTaskDelay(1000 / portTICK_PERIOD_MS);

    }
    vTaskDelete(NULL);
}



void app_main()
{
    nvs_flash_init();
    xTaskCreate(&tarea1, "tarea1", 1024, NULL, 1, NULL);
    xTaskCreate(&tarea2, "tarea2", 1024, NULL, 2, NULL);
    xTaskCreate(&tarea3, "tarea3", 1024, NULL, 3, NULL);
    xTaskCreate(&tarea4, "tarea4", 1024, NULL, 4, NULL);


    //vTaskStartScheduler();
}



Video del ejemplo:
Avatar de Usuario
biblioman
Usuario Nivel 10
 
Mensajes: 2000
Registrado: Vie Mar 20, 2009 5:58 pm

Re: freeRTOS & ESP32

Notapor biblioman » Sab Abr 08, 2017 6:20 pm

2º Ejemplo: uso de colas para comunicar datos entre tareas
Código: Seleccionar todo
/* 1º Ejemplo colas.
*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "esp_system.h"
#include "nvs_flash.h"

#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "freertos/queue.h"
#include "freertos/heap_regions.h"

#define TAM_COLA 20 /*20 mensajes*/
#define TAM_MSG 7 /*Cada Mensaje 7 caracteres*/

xQueueHandle cola_Mensaje;

void escribe1(void *pvParameter)
{
    char cadena[7];
    while(1) {
    strcpy (cadena, "Tarea1\n");
      if (xQueueSendToBack(cola_Mensaje, &cadena,2000/portTICK_RATE_MS)!=pdTRUE){//2seg--> Tiempo max. que la tarea está bloqueada si la cola está llena
         printf("error escribe1\n");

    }
      vTaskDelay(2000 / portTICK_RATE_MS);
 }
}
void escribe2(void *pvParameter)
{
    char cadena[7];
    while(1) {

       strcpy (cadena, "Tarea2\n");
       if (xQueueSendToBack(cola_Mensaje, &cadena,2000/portTICK_RATE_MS)!=pdTRUE){
          printf("error escribe2\n");
    }
       vTaskDelay(2000 / portTICK_RATE_MS);
 }

}

void escribe3(void *pvParameter)
{
    char cadena[7];
    while(1) {
       strcpy (cadena, "Tarea3\n");
       if (xQueueSendToBack(cola_Mensaje, &cadena,2000/portTICK_RATE_MS)!=pdTRUE){
          printf("error escribe3\n");
          }
       vTaskDelay(2000 / portTICK_RATE_MS);
       }
    }

void lee1(void *pvParameter)
{
   int i;
   char Rx[7];
   while(1) {

    if(xQueueReceive(cola_Mensaje,&Rx,10000/portTICK_RATE_MS)==pdTRUE) {//10s --> Tiempo max. que la tarea está bloqueada si la cola está vacía

         for(i=0; i<strlen(Rx); i++)
           {
             printf("%c",Rx[i]);
           }

          } else{
             printf("Fallo al leer la cola");

     }

   }
}


void app_main() {

    nvs_flash_init();

    cola_Mensaje= xQueueCreate(TAM_COLA, TAM_MSG);

    xTaskCreate(&lee1,     "lee1",     1024, NULL, 5, NULL);
    xTaskCreate(&escribe1, "escribe1", 1024, NULL, 1, NULL);
    xTaskCreate(&escribe2, "escribe2", 1024, NULL, 1, NULL);
    xTaskCreate(&escribe3, "escribe3", 1024, NULL, 1, NULL);


}




Video del ejemplo:
Avatar de Usuario
biblioman
Usuario Nivel 10
 
Mensajes: 2000
Registrado: Vie Mar 20, 2009 5:58 pm

Re: freeRTOS & ESP32

Notapor biblioman » Dom Abr 16, 2017 11:47 am

3º Ejemplo: Interrupciones y semáforos binarios para sincronizar tareas
Código: Seleccionar todo
/* 3. ejemplo Interrupciones y semáforo binario para sincronizar tareas.
*/
#include <stdio.h>

#include "driver/gpio.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_system.h"
#include "freertos/semphr.h"


#define ESP_INTR_FLAG_DEFAULT 0
#define PIN_PULSADOR 13

//creo el manejador para el semáforo como variable global
SemaphoreHandle_t xSemaphore = NULL;

// Rutina de interrupción, llamada cuando se presiona el pulsador
void IRAM_ATTR pulsador_isr_handler(void* arg) {

    // da el semáforo para que quede libre para la tarea pulsador
   xSemaphoreGiveFromISR(xSemaphore, NULL);
}

void init_GPIO(){
   //configuro el PIN_PULSADOR como un pin GPIO
   gpio_pad_select_gpio(PIN_PULSADOR);
   // seleciono el PIN_PULSADOR como pin de entrada
   gpio_set_direction(PIN_PULSADOR, GPIO_MODE_INPUT);
   // instala el servicio ISR con la configuración por defecto.
   gpio_install_isr_service(ESP_INTR_FLAG_DEFAULT);
   // añado el manejador para el servicio ISR
   gpio_isr_handler_add(PIN_PULSADOR, pulsador_isr_handler, NULL);
   // habilito interrupción por flanco descendente (1->0)
   gpio_set_intr_type(PIN_PULSADOR, GPIO_INTR_NEGEDGE);

}

void task_pulsador(void* arg) {

   while(1) {

      // Espero por la notificación de la ISR
      if(xSemaphoreTake(xSemaphore,portMAX_DELAY) == pdTRUE) {
         printf("Pulsador presionado!\n");

      }
   }
}

void app_main()
{
   //llamo a la función init_GPIO()
   init_GPIO();

   // se crea el semáforo binario
   xSemaphore = xSemaphoreCreateBinary();

   // creo la tarea task_pulsador
   xTaskCreate(task_pulsador, "task_pulsador", 2048, NULL, 5, NULL);

}


Vídeo del ejemplo:
Avatar de Usuario
biblioman
Usuario Nivel 10
 
Mensajes: 2000
Registrado: Vie Mar 20, 2009 5:58 pm

Re: Curso freeRTOS & ESP32

Notapor biblioman » Dom Abr 23, 2017 9:21 am

4º Ejemplo: Mutex
Código: Seleccionar todo
/* 1º Ejemplo para compartir recursos con MUTEX.
*/
#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_system.h"
#include "freertos/semphr.h"

xSemaphoreHandle xMutex;

void tarea1(void *pvParameter)
{
    while(1) {
     if( xMutex!= NULL )
      {
       if (xSemaphoreTake( xMutex, portMAX_DELAY )==pdTRUE)
       {

        printf("*****************************************************************************************************\n");
        printf("Ejecutando tarea 1 \n");
        printf("**************************************************************************************************** \n");
       }
       xSemaphoreGive(xMutex);

    }
        vTaskDelay(1000 / portTICK_PERIOD_MS);

    }

}
void tarea2(void *pvParameter)
{
    while(1) {
      if( xMutex!= NULL )
       {
        if (xSemaphoreTake( xMutex, portMAX_DELAY )==pdTRUE)
         {
         /* Se toma el Mutex si está disponible*/
         printf("#####################################################################################################\n");
          printf("Ejecutando tarea 2 \n");
         printf("#####################################################################################################\n");
          }
         /* Se da el Mutex para que otra tarea lo pueda usar*/
        xSemaphoreGive(xMutex);
       }
        vTaskDelay(1000 / portTICK_PERIOD_MS);

    }

}


void tarea3(void *pvParameter)
{
    while(1) {
      if( xMutex!= NULL )
       {
       if (xSemaphoreTake( xMutex, portMAX_DELAY )==pdTRUE)
         {

          printf("=====================================================================================================\n");
          printf("Ejecutando tarea 3 \n");
          printf("=====================================================================================================\n");
         }
         xSemaphoreGive(xMutex);
       }
        vTaskDelay(1000 / portTICK_PERIOD_MS);

    }

}
void tarea4(void *pvParameter)
{
    while(1) {
     if( xMutex!= NULL )
      {
       if (xSemaphoreTake( xMutex, portMAX_DELAY )==pdTRUE)
         {
         printf("-----------------------------------------------------------------------------------------------------\n");
         printf("Ejecutando tarea 4 \n");
         printf("------------------------------------------------------------------------------------------------------\n");
         }
        xSemaphoreGive(xMutex);
      }
        vTaskDelay(1000 / portTICK_PERIOD_MS);

    }

}


void app_main()
{

    //Se crea el Mutex
    xMutex = xSemaphoreCreateMutex();

    //Se crean las tareas
    xTaskCreate(&tarea1, "tarea1", 1024, NULL, 5, NULL);
    xTaskCreate(&tarea2, "tarea2", 1024, NULL, 5, NULL);
    xTaskCreate(&tarea3, "tarea3", 1024, NULL, 5, NULL);
    xTaskCreate(&tarea4, "tarea4", 1024, NULL, 5, NULL);

}



Video del ejemplo:
Avatar de Usuario
biblioman
Usuario Nivel 10
 
Mensajes: 2000
Registrado: Vie Mar 20, 2009 5:58 pm


Volver a Sistemas Embebidos

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado

cron