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: 2002
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: 2002
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: 2002
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: 2002
Registrado: Vie Mar 20, 2009 5:58 pm

Re: Curso freeRTOS & ESP32

Notapor biblioman » Jue May 04, 2017 4:08 pm

5º Ejemplo: ADC1 & UART1
Código: Seleccionar todo
/* Este ejemplo lee el valor del ADC1 y lo muestra convertido en voltaje en un LCD
*/
//Incluimos los archivos de cabecera necesarios para el ejemplo
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_system.h"
#include "nvs_flash.h"
#include "freertos/queue.h"
#include "freertos/heap_regions.h"
#include "driver/uart.h"
#include "esp_log.h"
#include "driver/gpio.h"
#include "driver/adc.h"
#include "soc/uart_struct.h"

//Definimos las etiquetas que utilizaremos en el ejemplo
#define ADC1_TEST_CHANNEL (4)

#define TXD  (4)
#define RXD  (5)
#define RTS  (18)
#define CTS  (19)

#define BUF_SIZE (1024)

#define TAM_COLA_LECTURA 1 /*1 mensajes*/
#define TAM_MSG_LECTURA 2 /*Cada Mensaje 1 Entero (2 bytes)*/
#define TAM_COLA_VOLTAJE 1 /*1 mensajes*/
#define TAM_MSG_VOLTAJE 5/*Cada Mensaje 5 caracteres de 1 byte cada uno*/

//creamos como variables globales los manejadores de las dos colas que utilizaremos para enviar datos entre tareas
xQueueHandle cola_Lectura;
xQueueHandle cola_Voltaje;

//tarea para leer el ACD1
void adc1task(void* arg)
{
    //inicializamos el convertidor Analógico/Digital (ADC)
    adc1_config_width(ADC_WIDTH_12Bit);
    adc1_config_channel_atten(ADC1_TEST_CHANNEL,ADC_ATTEN_11db);
    int valor;
    while(1){
       valor=adc1_get_voltage(ADC1_TEST_CHANNEL);
       if (xQueueSendToBack(cola_Lectura, &valor,1000/portTICK_RATE_MS)!=pdTRUE){//1seg--> Tiempo max. que la tarea está bloqueada si la cola está llena
                printf("error de escritura\n");
       }
       else{
          // printf("El valor de adc1 es:%d\n",valor);
       }

    }
}

//Tarea que recibe los datos de tipo entero del ACD1 los convierte a un tipo float y luego a una cadena de caracteres.
void convierteDatos(void *pvParameter)
{
   int dato;
   char String[5];
   float T=0.00;
    while(1){
    if(xQueueReceive(cola_Lectura,&dato,1000/portTICK_RATE_MS)==pdTRUE) {//1s --> Tiempo max. que la tarea está bloqueada si la cola está vacía
       T= (3.3*dato)/4095;
        sprintf(String,"%1.2f\r",T);


             } else{
                printf("Fallo al leer la cola de lectura del ADC1");

        }

    //Enviamos los datos convertidos a la cola_Voltaje
    if (xQueueSendToBack(cola_Voltaje, &String,1000/portTICK_RATE_MS)!=pdTRUE){//2seg--> Tiempo max. que la tarea está bloqueada si la cola está llena
         printf("error al escribir en la cola_Voltaje\n");

    }
    printf("El valor de adc1 es:%d\n",dato);
   // printf ("%1.2f\n",T);
     vTaskDelay(500 / portTICK_RATE_MS);

    }
}

//Tarea para enviar el valor del voltaje a través de la UART1 al microcontrolador que controla el LCD
static void uart_task()
{
    //Configuración de los parámetros de la UART1
    const int uart_num = UART_NUM_1;
    uart_config_t uart_config = {
        .baud_rate = 9600,
        .data_bits = UART_DATA_8_BITS,
        .parity = UART_PARITY_DISABLE,
        .stop_bits = UART_STOP_BITS_1,
        .flow_ctrl = UART_HW_FLOWCTRL_DISABLE ,
        .rx_flow_ctrl_thresh = 122,
    };
    uart_param_config(uart_num, &uart_config);
    //Set pines UART1 (TX: IO4, RX: I05, RTS: IO18, CTS: IO19)
    uart_set_pin(uart_num, TXD, RXD, RTS, CTS);
    //Instalamos el driver para la UART
    uart_driver_install(uart_num, BUF_SIZE * 2, 0, 0, NULL, 0);

   //Cadena constante para mostrar en la primera fila de caracteres del LCD
     char* data = "Lectura ADC1        V= ";
     char Rx [6];
    while(1) {
         if(xQueueReceive(cola_Voltaje,&Rx,10000/portTICK_RATE_MS)==pdTRUE) {//10s --> Tiempo max. que la tarea está bloqueada si la cola está vacía
          //Escribimos los datos en la UART1
         uart_write_bytes(uart_num, (const char*)data, strlen(data));
         uart_write_bytes(uart_num, (char*)Rx, strlen(Rx));
          }
    }
}


void app_main()
{
    //Creamos las dos colas que utilizaremos en el programa para comunicar datos entre las tareas
   cola_Lectura= xQueueCreate(TAM_COLA_LECTURA, TAM_MSG_LECTURA);
   cola_Voltaje= xQueueCreate(TAM_COLA_VOLTAJE, TAM_MSG_VOLTAJE);

   //Creamos las tareas del programa
    xTaskCreate(adc1task, "adc1task", 1024*3, NULL, 5, NULL);
    xTaskCreate(convierteDatos, "convierteDatos", 1024*3, NULL, 10, NULL);
    xTaskCreate(uart_task, "uart_task", 1024, NULL, 5, NULL);
}


https://www.dropbox.com/s/70rli0jj763m40d/ESP32_UART1.png?dl=0
Video del ejemplo:
Avatar de Usuario
biblioman
Usuario Nivel 10
 
Mensajes: 2002
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