vTaskDelay() helps pause a task for a set time. This makes tasks run regularly, like a clock ticking.
vTaskDelay() for periodic tasks in FreeRTOS
void vTaskDelay(const TickType_t xTicksToDelay);
xTicksToDelay is the number of tick periods to delay the task.
The tick period depends on your FreeRTOS configuration (usually 1ms or 10ms).
vTaskDelay(1000 / portTICK_PERIOD_MS);vTaskDelay(pdMS_TO_TICKS(500));This program creates a task that prints a message every 1 second using vTaskDelay(). The delay makes the task run periodically.
#include "FreeRTOS.h" #include "task.h" #include <stdio.h> void vPeriodicTask(void *pvParameters) { const TickType_t xDelay = pdMS_TO_TICKS(1000); // 1 second delay for (;;) { printf("Task running at regular interval\n"); vTaskDelay(xDelay); // Delay for 1 second } } int main(void) { xTaskCreate(vPeriodicTask, "PeriodicTask", 1000, NULL, 1, NULL); vTaskStartScheduler(); for(;;); // Should never reach here return 0; }
vTaskDelay() delays from the time it is called, so small variations can add up over time.
For precise periodic timing, consider using vTaskDelayUntil() instead.
Always convert milliseconds to ticks using pdMS_TO_TICKS() for portability.
vTaskDelay() pauses a task for a set number of ticks.
Use it to make tasks run at regular intervals.
Convert milliseconds to ticks with pdMS_TO_TICKS() for accuracy.
Practice
vTaskDelay() in FreeRTOS?Solution
Step 1: Understand the function role
vTaskDelay()is designed to pause or block a task for a set number of tick counts, allowing other tasks to run.Step 2: Compare with other options
Creating or deleting tasks and sending data are done by other FreeRTOS functions, notvTaskDelay().Final Answer:
To pause a task for a specific number of ticks -> Option AQuick Check:
vTaskDelay() pauses task = A [OK]
- Confusing vTaskDelay() with task creation functions
- Thinking vTaskDelay() sends data
- Assuming vTaskDelay() deletes tasks
vTaskDelay()?Solution
Step 1: Understand tick conversion
FreeRTOS uses ticks, not milliseconds directly. To convert milliseconds to ticks, usepdMS_TO_TICKS().Step 2: Check syntax correctness
OnlyvTaskDelay(pdMS_TO_TICKS(100));correctly converts 100 ms to ticks and delays the task.Final Answer:
vTaskDelay(pdMS_TO_TICKS(100)); -> Option CQuick Check:
Use pdMS_TO_TICKS() inside vTaskDelay() [OK]
- Passing milliseconds directly without conversion
- Using non-existent functions like vTaskDelayMs()
- Confusing ticks and milliseconds
void TaskFunction(void *pvParameters) {
while(1) {
printf("Tick\n");
vTaskDelay(pdMS_TO_TICKS(500));
}
}Solution
Step 1: Analyze vTaskDelay parameter
The delay is set topdMS_TO_TICKS(500), which converts 500 milliseconds to ticks.Step 2: Understand loop timing
Each loop iteration prints "Tick" then delays for about 500 ms, so prints occur roughly every 500 ms.Final Answer:
Approximately 500 milliseconds -> Option BQuick Check:
vTaskDelay(pdMS_TO_TICKS(500)) = 500 ms delay [OK]
- Ignoring pdMS_TO_TICKS conversion
- Assuming no delay in loop
- Confusing milliseconds with ticks
void Task(void *params) {
while(1) {
doWork();
vTaskDelay(200);
}
}Solution
Step 1: Check vTaskDelay argument
The argument 200 is treated as ticks, not milliseconds. To delay 200 ms, convert usingpdMS_TO_TICKS(200).Step 2: Verify other code parts
CallingdoWork()before delay is valid. The task function returns void, which is correct.Final Answer:
vTaskDelay should use pdMS_TO_TICKS(200) to convert milliseconds -> Option DQuick Check:
Convert ms to ticks with pdMS_TO_TICKS() [OK]
- Passing milliseconds directly to vTaskDelay()
- Thinking vTaskDelay can't be in loops
- Expecting task functions to return values
vTaskDelay()?Solution
Step 1: Understand vTaskDelay limitations
vTaskDelay()delays relative to current time, so small variations accumulate causing drift in periodic tasks.Step 2: Identify precise periodic method
vTaskDelayUntil()uses an absolute wake time, preventing drift and ensuring exact periodic execution.Final Answer:
UsevTaskDelayUntil()instead ofvTaskDelay()for precise periodic timing -> Option AQuick Check:
vTaskDelayUntil() prevents drift in periodic tasks [OK]
- Using vTaskDelay() causes timing drift
- Assuming tick count matches ms without conversion
- Adding extra delays unnecessarily
Ready to prove it?
Pass the test and this pattern moves unknown
