No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

No se trata de lo que quieres comprar, sino de quién quieres ser. Aprovecha el precio especial.

Antes: $249

Currency
$209

Paga en 4 cuotas sin intereses

Paga en 4 cuotas sin intereses
Suscríbete

Termina en:

14 Días
11 Hrs
24 Min
27 Seg

FreeRTOS con ESP32

15/30
Recursos

Aportes 11

Preguntas 1

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

Dos tips utiles por si a alguien le hacen falta:

  1. Guardar el archivo en vcode cada vez que hacemos cambios o antes de compilar.

  2. Para salir del modo monitor presionar ctrl +]

Les comparto mi código, hice una modificación para que se ejecute la tarea solo durante un minuto

#include <stdio.h>
#include <time.h>
#include <unistd.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"

TaskHandle_t taskHandle1 = NULL;

void task1(void *args) {
    int count = 0;
    time_t start, current;
    double elapsed ;    // Tiempo transcurrido en segundos
    int duration = 60;  // Duración total de la tarea en segundos

    // Obtiene el tiempo de inicio
    time(&start);
    while(1) {
        time(&current);

        // Calcula el tiempo transcurrido
        elapsed = difftime(current, start);

        count++;
        if (elapsed >= duration) {
            printf("End task1... bye\n");
            vTaskDelete(NULL);
        }

        // Muestra el tiempo restante cada 10 segundos
        if ((int)elapsed % 10 == 0) {
            printf("Tiempo restante: %d segundos\n", duration - (int)elapsed);
            printf("Ejecuciones: %d veces\n", count);
        }
    }
}

void app_main(void)
{
    xTaskCreate(task1, "Task1", 4096, NULL, 10,  &taskHandle1);
}

Este código en lenguaje C utiliza las librerías FreeRTOS para crear una tarea llamada “task1” que se ejecutará en un microcontrolador o microprocesador que tenga soporte para FreeRTOS.

La función “task1” es una tarea que incrementa una variable “count” en cada iteración de un bucle while infinito, e imprime el valor de esa variable en la consola utilizando la función “printf” de la librería estándar de C. Después, verifica si la variable “count” ha superado un valor de 5 y en ese caso, elimina la tarea actual utilizando la función “vTaskDelete”.

La función “app_main” es la función principal del programa y es donde se crea la tarea “task1” utilizando la función “xTaskCreate”. Esta función toma como argumentos el nombre de la tarea, el tamaño de la pila de la tarea (en este caso 4096 bytes), el argumento que se pasará a la tarea (en este caso NULL), la prioridad de la tarea (en este caso 10), y un puntero a una variable “TaskHandle_t” que se utilizará para hacer referencia a la tarea creada.

En resumen, este código crea una tarea “task1” que se ejecutará indefinidamente, incrementando una variable “count” y mostrando su valor en la consola hasta que esa variable supera un valor de 5. La tarea se elimina en ese momento y el programa termina.

Comandos para el IDF Monitor <https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-guides/tools/idf-monitor.html>

Tengo la v5.0.2 del ESP IDF y cuándo escribía idf.py build mostraba que tenía un error en el archivo CMakeLists.txt. Esto era porque escribía el comando dentro de la carpeta main, Procuren ejectutar sus comandos de compilación dentro de la carpeta del proyecto ya que ambas carpetas tienen archivos de configuración CMake, uno para el proyecto y otro para el código.

Comarto mi codigo:

#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"

TaskHandle_t taskHandle1 = NULL;

void task1(void *args) {
    int count = 0;
    while(1){
        count++;
        printf("Task 1, count %d \n", count);
        if (count > 5){
            vTaskDelete(NULL);
        }
    }
}

void app_main(void)
{
    xTaskCreate(task1, "Task1", 4096, NULL, 10,  &taskHandle1);

}

Comando para la el IDF Monitor <https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-guides/tools/idf-monitor.html>

Agregue un vTaskDelay de 500 milisegundos

#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "time.h"

TaskHandle_t taskHandle_1;
const TickType_t taskDelay = 500 / portTICK_PERIOD_MS;
time_t elapsed_time;
int counter = 0;

void task_1(void *args)
{
    while (true)
    {
        time(&elapsed_time);
        printf("Task 1 counter: %d seconds: %lld\n", counter, elapsed_time);
        counter++;
        vTaskDelay(taskDelay);

        if (counter > 50)
        {
            printf("Finalizando la tarea");
            vTaskDelete(taskHandle_1);
        }

    }
}

void app_main(void)
{
    xTaskCreate(
        task_1,         //Nombre de la funcion que implementa la tarea
        "Tarea_1",      //Nombre descriptivo de la tarea con fines de debugging
        4096,           //El tamaño del task stack en bytes
        NULL,           //pointer a un parametro cuando la tarea esta siendo creada
        10,             //Prioridad de la tarea un numero
        &taskHandle_1   //apuntador para referenciar la tarea. 
    );
}

Les comparto mi código con algunos cambios usando la librería esp\_log.h para imprimir los mensajes en diferentes colores: ```js //importamos las librerias necesarias #include <stdio.h> #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "esp_log.h" //declaramos las variables globales static const char* TAG = "ESP32"; TaskHandle_t task1_handle; void task1(void* args) { int count = 0; while (true) { count++; if (count > 5) { ESP_LOGE(TAG, "task1 deleted!"); vTaskDelete(NULL); } ESP_LOGW(TAG, "task1 executed %u times", count); vTaskDelay(pdMS_TO_TICKS(500)); } } //------------------------------------------- void app_main(void) { xTaskCreate(task1, "task1", 2048, NULL, 5, &task1_handle); } ```//importamos las librerias necesarias#include \<stdio.h>#include "freertos/FreeRTOS.h"#include "freertos/task.h"#include "esp\_log.h" //declaramos las variables globalesstatic const char\* TAG = "ESP32";*TaskHandle\_t* task1\_handle; void task1(void\* *args*) {   int count = 0;    while (true) {      count++;      if (count > 5) {         ESP\_LOGE(TAG, "task1 deleted!");         vTaskDelete(NULL);      }      ESP\_LOGW(TAG, "task1 executed %u times", count);      vTaskDelay(pdMS\_TO\_TICKS(500));   }}//------------------------------------------- void app\_main(void) {   xTaskCreate(task1, "task1", 2048, NULL, 5, \&task1\_handle);}
para saber cuales son los parámetros de freeRTOS como por ejemplo la máxima longitud en el nombre de una tarea, la frecuencia de los ticks, el mínimo stack de memoria y demás, pueden dar ctrl+click izquierdo sobre la librería de freeRTOS y luego buscar la linea 65 donde se incluye el archivo freeRTOSConfig.h que es indispensable para cualquier proyecto con freeRTOS. finalmente dan nuevamente ctrl + click izquierdo para que vs code los lleve a ese archivo de configuración. también les recomiendo ampliamente leer la documentación oficial de freeRTOS para tener mas claro los conceptos de este kernel <https://www.freertos.org/a00110.html>
personalmente me gusta usar mas la extensión de vs code que la instalación directa, asi evito usar la consola de comandos. algo a tener en cuenta, la ruta donde se aloja el proyecto no debe tener espacio en los nombres ni caracteres especiales, sino la compilación fallara