vTaskDelay blocks for a duration measured relative to the moment it's called, so the actual period between iterations is your work time plus the delay, and since work time varies, the period drifts and accumulates jitter. vTaskDelayUntil (or its newer xTaskDelayUntil form) instead blocks until an absolute wake time that you advance by a fixed increment each iteration, so the task wakes on a precise, fixed cadence regardless of how long the work took (as long as it fits within the period). It matters for anything that must run at a steady rate, a control loop sampling a sensor and updating an actuator every 10 ms, a periodic protocol heartbeat, where drift or jitter degrades the algorithm or violates timing. The mental model: vTaskDelay says "sleep for 10 ms," which compounds with your runtime; vTaskDelayUntil says "wake every 10 ms," anchoring to a schedule. The caveat is that if the work ever exceeds the period, vTaskDelayUntil can't catch up and you've simply overrun, which is itself useful information that the task is over budget. For one-off or non-periodic waits, vTaskDelay is fine; for fixed-rate periodic tasks, use vTaskDelayUntil.
RTOS & Real-Time Concepts · Interview question
What's the difference between vTaskDelay and vTaskDelayUntil, and when does it matter?
A strong answer
What a weak answer sounds like
You know the answer. Do you know what gets you dinged?
Pro breaks down the answer most candidates actually give to this question — and the specific reason an interviewer marks it down. It’s the difference between sounding correct and sounding senior, on all 472 questions.
From the lesson
Tasks & the Scheduler
A task is a function with its own stack, priority, and state; the scheduler runs the highest-priority ready task. The task lifecycle (Ready/Running/Blocked), the idle task, and vTaskDelay.