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