2.2 vTaskDelay vs vTaskDelayUntil

3. 2.2 vTaskDelay vs vTaskDelayUntil

vTaskDelay : attend N ticks depuis l'appel. La période réelle dépend du temps d'exécution de la tâche → drift progressif.

// Problème : si read_sensor() prend 100 ms, la période réelle est 1100 ms
void task_sensor_bad(void *pv) {
    while (1) {
        read_sensor();                           // 100 ms
        vTaskDelay(pdMS_TO_TICKS(1000));         // 1000 ms
        // période totale : 1100 ms — dérive à chaque cycle
    }
}

vTaskDelayUntil : attend jusqu'à un instant absolu. La période est rigoureusement constante, indépendamment du temps d'exécution.

void task_sensor_good(void *pv) {
    TickType_t xLastWakeTime = xTaskGetTickCount();
    const TickType_t xPeriod = pdMS_TO_TICKS(1000);

    while (1) {
        read_sensor();  // peu importe la durée (< xPeriod !)
        vTaskDelayUntil(&xLastWakeTime, xPeriod);
        // période exacte : 1000 ms, sans dérive
    }
}

Règle : Utiliser vTaskDelayUntil pour tout ce qui est périodique et critique (acquisition capteurs, boucles de contrôle PID).

Se connecter pour suivre votre progression.