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