1.4 Premier projet : dual-task blink + log

5. 1.4 Premier projet : dual-task blink + log

Objectif : deux tâches tournent simultanément — une clignote une LED, l'autre écrit sur la console série.

// src/main.c
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/gpio.h"
#include "esp_log.h"

#define LED_PIN     GPIO_NUM_2
#define TAG_BLINK   "BLINK"
#define TAG_LOG     "LOG"

void task_blink(void *pvParameters) {
    gpio_reset_pin(LED_PIN);
    gpio_set_direction(LED_PIN, GPIO_MODE_OUTPUT);

    while (1) {
        gpio_set_level(LED_PIN, 1);
        vTaskDelay(pdMS_TO_TICKS(500));
        gpio_set_level(LED_PIN, 0);
        vTaskDelay(pdMS_TO_TICKS(500));
    }
    // vTaskDelete(NULL); — jamais atteint, mais bonne pratique de le mentionner
}

void task_serial_log(void *pvParameters) {
    uint32_t count = 0;

    while (1) {
        ESP_LOGI(TAG_LOG, "Iteration: %" PRIu32, count++);
        vTaskDelay(pdMS_TO_TICKS(1000));
    }
}

void app_main(void) {
    xTaskCreate(task_blink,      "blink",  2048, NULL, 5, NULL);
    xTaskCreate(task_serial_log, "logger", 2048, NULL, 5, NULL);
    // app_main peut se terminer — les tâches continuent
}

Signature de xTaskCreate :

BaseType_t xTaskCreate(
    TaskFunction_t  pvTaskCode,    // pointeur vers la fonction tâche
    const char     *pcName,        // nom (debug seulement, 16 chars max)
    uint32_t        usStackDepth,  // taille pile en BYTES sur ESP-IDF
                                   // ⚠️ Différence ESP-IDF vs vanilla FreeRTOS :
                                   //    vanilla utilise des MOTS (1 mot = 4 bytes),
                                   //    ESP-IDF utilise des BYTES directement.
    void           *pvParameters,  // paramètre passé à la tâche
    UBaseType_t     uxPriority,    // priorité (0 = plus basse, configMAX_PRIORITIES-1)
    TaskHandle_t   *pxCreatedTask  // handle optionnel (NULL si inutile)
);

Exercice : Modifier task_blink pour accepter la période de clignotement en paramètre via pvParameters. Créer deux instances avec des périodes différentes (200 ms et 800 ms).

// Indice : passer un uint32_t comme paramètre
uint32_t period_fast = 200;
uint32_t period_slow = 800;
xTaskCreate(task_blink, "blink_fast", 2048, (void*)&period_fast, 5, NULL);
xTaskCreate(task_blink, "blink_slow", 2048, (void*)&period_slow, 5, NULL);

// Dans task_blink :
uint32_t period_ms = *((uint32_t*)pvParameters);
vTaskDelay(pdMS_TO_TICKS(period_ms));

Soumettez votre main.c modifié avec une capture de la sortie série montrant les deux LEDs clignotant à des rythmes différents (ou une photo de la board si vous avez deux LEDs câblées).

Se connecter pour suivre votre progression.