The tick timer helps keep track of time in FreeRTOS. The scheduler uses this timer to decide which task to run next.
Tick timer and scheduler in FreeRTOS
void vTaskDelay(const TickType_t xTicksToDelay); TickType_t xTaskGetTickCount(void);
vTaskDelay() pauses a task for a number of ticks.
xTaskGetTickCount() returns the current tick count since the scheduler started.
vTaskDelay(pdMS_TO_TICKS(1000));TickType_t ticks = xTaskGetTickCount();
This program creates two tasks. Task 1 prints a message every 500 milliseconds, and Task 2 prints every 1000 milliseconds. The scheduler uses the tick timer to switch between tasks automatically.
#include "FreeRTOS.h" #include "task.h" #include <stdio.h> void vTask1(void *pvParameters) { for (;;) { printf("Task 1 running at tick %lu\n", xTaskGetTickCount()); vTaskDelay(pdMS_TO_TICKS(500)); // Delay 500 ms } } void vTask2(void *pvParameters) { for (;;) { printf("Task 2 running at tick %lu\n", xTaskGetTickCount()); vTaskDelay(pdMS_TO_TICKS(1000)); // Delay 1000 ms } } int main(void) { xTaskCreate(vTask1, "Task1", 1000, NULL, 1, NULL); xTaskCreate(vTask2, "Task2", 1000, NULL, 1, NULL); vTaskStartScheduler(); for (;;) {} return 0; }
The tick timer frequency is set in FreeRTOSConfig.h by configTICK_RATE_HZ.
Higher tick rates mean more precise timing but more CPU overhead.
The scheduler runs every tick to decide which task to run next based on priority and state.
The tick timer counts time in small steps called ticks.
The scheduler uses ticks to switch tasks smoothly and on time.
Use vTaskDelay() to pause tasks and xTaskGetTickCount() to check time.
Practice
Solution
Step 1: Understand tick timer function
The tick timer counts time in small units called ticks, which are the basic time measurement in FreeRTOS.Step 2: Differentiate from other functions
Other options like storing priorities or handling I/O are not related to the tick timer's role.Final Answer:
To count time in small steps called ticks -> Option DQuick Check:
Tick timer = counts ticks [OK]
- Confusing tick timer with task priority management
- Thinking tick timer handles memory or I/O
- Mixing tick timer with scheduler directly
Solution
Step 1: Identify correct function name
The correct FreeRTOS function to delay a task isvTaskDelay().Step 2: Check parameter correctness
The parameter is the number of ticks to delay. For 100 ticks,vTaskDelay(100);is correct.Final Answer:
vTaskDelay(100); -> Option CQuick Check:
Delay task = vTaskDelay(ticks) [OK]
- Using wrong function name like xTaskDelay or delayTask
- Passing milliseconds instead of ticks
- Using too large or incorrect delay values
TickType_t start = xTaskGetTickCount(); vTaskDelay(50); TickType_t end = xTaskGetTickCount(); TickType_t diff = end - start;What is the expected value of
diff?Solution
Step 1: Understand xTaskGetTickCount()
This function returns the current tick count since the scheduler started.Step 2: Analyze vTaskDelay(50)
The task delays itself for 50 ticks, so the tick count advances by 50 during the delay.Step 3: Calculate difference
Subtracting start from end gives the delay duration, which should be 50 ticks.Final Answer:
50 -> Option BQuick Check:
Delay ticks = 50 [OK]
- Assuming delay is zero or doubled
- Thinking task priority affects tick count difference
- Confusing ticks with milliseconds
vTaskDelay(0); TickType_t ticks = xTaskGetTickCount();
Solution
Step 1: Check vTaskDelay parameter
Passing 0 to vTaskDelay means no delay; the task yields but continues immediately.Step 2: Verify xTaskGetTickCount()
This function correctly returns the current tick count; no error here.Final Answer:
vTaskDelay(0) does not delay the task -> Option AQuick Check:
Delay(0) means no wait [OK]
- Expecting delay with zero ticks
- Thinking xTaskGetTickCount returns error
- Misunderstanding TickType_t type
Solution
Step 1: Understand vTaskDelay() limitation
Using vTaskDelay(200) delays from current time, so task execution time adds up causing drift.Step 2: Use vTaskDelayUntil() for fixed periodic timing
vTaskDelayUntil() uses a previous wake time to maintain exact periodic intervals regardless of execution time.Step 3: Evaluate other options
Manual delay or multiple delays do not guarantee precise timing; only vTaskDelayUntil() does.Final Answer:
Use vTaskDelayUntil() with a previous wake time variable -> Option AQuick Check:
Precise periodic task = vTaskDelayUntil() [OK]
- Using vTaskDelay causes timing drift
- Trying manual delay calculations
- Ignoring task execution time in timing
Ready to prove it?
Pass the test and this pattern moves unknown
