No tienes acceso a esta clase

隆Contin煤a aprendiendo! 脷nete y comienza a potenciar tu carrera

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 鈥渢ask1鈥 que se ejecutar谩 en un microcontrolador o microprocesador que tenga soporte para FreeRTOS.

La funci贸n 鈥渢ask1鈥 es una tarea que incrementa una variable 鈥渃ount鈥 en cada iteraci贸n de un bucle while infinito, e imprime el valor de esa variable en la consola utilizando la funci贸n 鈥減rintf鈥 de la librer铆a est谩ndar de C. Despu茅s, verifica si la variable 鈥渃ount鈥 ha superado un valor de 5 y en ese caso, elimina la tarea actual utilizando la funci贸n 鈥渧TaskDelete鈥.

La funci贸n 鈥渁pp_main鈥 es la funci贸n principal del programa y es donde se crea la tarea 鈥渢ask1鈥 utilizando la funci贸n 鈥渪TaskCreate鈥. 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 鈥淭askHandle_t鈥 que se utilizar谩 para hacer referencia a la tarea creada.

En resumen, este c贸digo crea una tarea 鈥渢ask1鈥 que se ejecutar谩 indefinidamente, incrementando una variable 鈥渃ount鈥 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.

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);

}

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