The xTimerCreate() function helps you make a timer that runs code after a set time or repeatedly. It makes managing timed tasks easy without blocking your program.
xTimerCreate() function in FreeRTOS
TimerHandle_t xTimerCreate(
const char * const pcTimerName,
const TickType_t xTimerPeriodInTicks,
const UBaseType_t uxAutoReload,
void * const pvTimerID,
TimerCallbackFunction_t pxCallbackFunction
);pcTimerName is a name you give the timer for easy identification.
xTimerPeriodInTicks sets how long before the timer runs, in ticks (small time units).
myTimerCallback after 1000 milliseconds.TimerHandle_t myTimer = xTimerCreate(
"MyTimer",
pdMS_TO_TICKS(1000),
pdFALSE,
NULL,
myTimerCallback
);TimerHandle_t periodicTimer = xTimerCreate(
"PeriodicTimer",
pdMS_TO_TICKS(500),
pdTRUE,
(void *) 1,
periodicCallback
);This program creates a one-shot timer that calls vTimerCallback after 2 seconds. It starts the timer and simulates waiting. The callback prints a message.
#include "FreeRTOS.h" #include "timers.h" #include "task.h" #include <stdio.h> void vTimerCallback(TimerHandle_t xTimer) { printf("Timer callback called!\n"); } int main(void) { TimerHandle_t xMyTimer = xTimerCreate( "TestTimer", pdMS_TO_TICKS(2000), pdFALSE, NULL, vTimerCallback ); if (xMyTimer != NULL) { xTimerStart(xMyTimer, 0); } // Simulate scheduler running and waiting for timer // In real FreeRTOS, the scheduler would handle this for (int i = 0; i < 3; i++) { vTaskDelay(pdMS_TO_TICKS(1000)); } return 0; }
Timers run their callbacks in the timer service task, so keep callbacks short and fast.
Use pdMS_TO_TICKS() to convert milliseconds to ticks for easier timing.
Remember to start the timer with xTimerStart() after creating it.
xTimerCreate() makes timers to run code after delays or repeatedly.
Timers help manage time-based tasks without stopping your program.
Always start your timer after creating it to make it work.
Practice
xTimerCreate() function in FreeRTOS?Solution
Step 1: Understand the role of xTimerCreate()
The functionxTimerCreate()is used to create software timers in FreeRTOS, which can execute a callback function after a delay or periodically.Step 2: Compare with other options
Starting the scheduler, creating hardware interrupts, or allocating memory for tasks are not the purpose ofxTimerCreate().Final Answer:
To create a software timer that can run a function after a delay or repeatedly -> Option AQuick Check:
Timer creation = software timer setup [OK]
- Confusing timer creation with starting the scheduler
- Thinking it creates hardware interrupts
- Assuming it allocates memory for tasks
xTimerCreate() to create a one-shot timer named "MyTimer" with a 1000 tick delay and a callback function TimerCallback?Solution
Step 1: Understand xTimerCreate() parameters
The parameters are: name (string), period (ticks), auto-reload (pdTRUE or pdFALSE), timer ID (can be NULL), and callback function pointer.Step 2: Check each option
xTimerCreate("MyTimer", 1000, pdFALSE, NULL, TimerCallback); correctly uses pdFALSE for one-shot, NULL for timer ID, and TimerCallback as the function pointer. xTimerCreate("MyTimer", 1000, pdTRUE, NULL, TimerCallback); uses pdTRUE (auto-reload), which is wrong for one-shot. xTimerCreate("MyTimer", 1000, pdFALSE, TimerCallback, NULL); swaps callback and timer ID. xTimerCreate("MyTimer", 1000, pdFALSE, NULL, &TimerCallback); uses &TimerCallback which is incorrect; function name alone is used.Final Answer:
xTimerCreate("MyTimer", 1000, pdFALSE, NULL, TimerCallback); -> Option BQuick Check:
One-shot timer = pdFALSE, callback last parameter [OK]
- Using pdTRUE for one-shot timers
- Swapping callback and timer ID parameters
- Using & before callback function name
TimerHandle_t myTimer = xTimerCreate("Timer1", 500, pdTRUE, NULL, TimerCallback);
if (myTimer != NULL) {
xTimerStart(myTimer, 0);
}
What will happen when this code runs?Solution
Step 1: Analyze timer creation parameters
The timer is created with pdTRUE, meaning it is auto-reload and will repeat. The period is 500 ticks.Step 2: Check timer start call
The timer is started immediately with xTimerStart(myTimer, 0), so it will begin running and call TimerCallback every 500 ticks repeatedly.Final Answer:
A timer named "Timer1" will start and call TimerCallback every 500 ticks repeatedly -> Option AQuick Check:
pdTRUE + xTimerStart = repeated timer [OK]
- Thinking pdTRUE means one-shot
- Forgetting to call xTimerStart after creation
- Assuming timer runs without starting
TimerHandle_t timer = xTimerCreate("Timer", 1000, pdFALSE, NULL, TimerCallback);
xTimerStart(timer, 0);
// ...
void TimerCallback(TimerHandle_t xTimer) {
// callback code
}
Solution
Step 1: Check timer creation and start sequence
The timer is created and immediately started without checking if the returned handle is NULL, which can cause runtime errors if creation failed.Step 2: Verify other parts
Defining TimerCallback after usage is allowed in C if a prototype exists or compiler supports it. pdFALSE is correct for one-shot. Timer name as string literal is valid.Final Answer:
xTimerStart is called before checking if timer is NULL -> Option CQuick Check:
Always check timer handle before starting [OK]
- Skipping NULL check on timer handle
- Confusing pdFALSE and pdTRUE for timer type
- Thinking string literals are invalid timer names
xTimerCreate() and FreeRTOS timers is correct?Solution
Step 1: Understand the requirement
The timer should wait 1000 ticks before first callback, then run every 200 ticks repeatedly.Step 2: Analyze options
Create an auto-reload timer with 200 ticks period and start it after a one-shot timer of 1000 ticks triggers the first callback to start the auto-reload timer uses a one-shot timer for initial delay, which on expiry starts the auto-reload timer for repeated 200 ticks callbacks. This matches the requirement. Create a one-shot timer with 1200 ticks period and use it as auto-reload incorrectly combines periods and auto-reload. Create an auto-reload timer with 1200 ticks period and start it immediately starts immediately without initial delay. Create a one-shot timer with 200 ticks period and restart it manually every 1000 ticks misuses one-shot timer and manual restart timing.Final Answer:
Create an auto-reload timer with 200 ticks period and start it after a one-shot timer of 1000 ticks triggers the first callback to start the auto-reload timer -> Option DQuick Check:
Initial delay + repeated timer = chain one-shot then auto-reload [OK]
- Trying to set initial delay inside one timer period
- Using wrong timer type for initial delay
- Starting auto-reload timer immediately without delay
Ready to prove it?
Pass the test and this pattern moves unknown
