Bird
Raised Fist0
FreeRTOSprogramming~5 mins

Timer for periodic status reporting in FreeRTOS

Choose your learning style10 modes available
Introduction

A timer helps run a task repeatedly at set times. This is useful to check or report status regularly without stopping other work.

You want to send a message every 5 seconds to show the system is alive.
You need to check sensor data every minute and report if something changes.
You want to blink an LED every second to show the device is working.
You want to log system health info every hour automatically.
Syntax
FreeRTOS
TimerHandle_t xTimerCreate(
    const char * const pcTimerName,
    const TickType_t xTimerPeriodInTicks,
    const UBaseType_t uxAutoReload,
    void * const pvTimerID,
    TimerCallbackFunction_t pxCallbackFunction
);

BaseType_t xTimerStart(TimerHandle_t xTimer, TickType_t xTicksToWait);

xTimerCreate makes a timer. You give it a name, time period, if it repeats, an ID, and a function to run when time is up.

xTimerStart starts the timer counting. The timer calls your function when the time ends.

Examples
This timer calls vTimerCallback every second repeatedly.
FreeRTOS
TimerHandle_t myTimer = xTimerCreate("StatusTimer", pdMS_TO_TICKS(1000), pdTRUE, NULL, vTimerCallback);
// Creates a timer that runs every 1000 ms (1 second) and repeats.
This timer calls vTimerCallback only once after 5 seconds.
FreeRTOS
TimerHandle_t oneShotTimer = xTimerCreate("OneShot", pdMS_TO_TICKS(5000), pdFALSE, NULL, vTimerCallback);
// Creates a timer that runs once after 5 seconds.
Sample Program

This program creates a timer that prints a status message every 2 seconds. The message includes a count of how many times it has run.

The timer runs repeatedly because pdTRUE is set for auto-reload.

The scheduler starts to run tasks and timers.

FreeRTOS
#include "FreeRTOS.h"
#include "timers.h"
#include "task.h"
#include <stdio.h>

// Timer callback function
void vStatusTimerCallback(TimerHandle_t xTimer) {
    static int count = 0;
    count++;
    printf("Status report #%d: System running.\n", count);
}

int main(void) {
    // Create a timer that triggers every 2 seconds
    TimerHandle_t xStatusTimer = xTimerCreate(
        "StatusTimer",
        pdMS_TO_TICKS(2000), // 2000 ms = 2 seconds
        pdTRUE,              // Auto-reload (periodic)
        NULL,
        vStatusTimerCallback
    );

    if (xStatusTimer == NULL) {
        printf("Failed to create timer.\n");
        return 1;
    }

    // Start the timer
    if (xTimerStart(xStatusTimer, 0) != pdPASS) {
        printf("Failed to start timer.\n");
        return 1;
    }

    // Start the scheduler
    vTaskStartScheduler();

    // Should never reach here
    for(;;);
    return 0;
}
OutputSuccess
Important Notes

Timer callback runs in the timer service task, so keep it short and fast.

Use pdMS_TO_TICKS() to convert milliseconds to ticks for timer periods.

Make sure FreeRTOS scheduler is running for timers to work.

Summary

Timers let you run code repeatedly or once after a delay.

Use xTimerCreate to make a timer and xTimerStart to start it.

Timer callbacks should be quick and simple to avoid blocking other tasks.

Practice

(1/5)
1. What is the main purpose of using a timer in FreeRTOS for periodic status reporting?
easy
A. To pause the entire system for a set time
B. To create a new task that runs forever
C. To run a function repeatedly at fixed time intervals
D. To allocate memory dynamically for tasks

Solution

  1. Step 1: Understand timer functionality in FreeRTOS

    Timers in FreeRTOS are designed to call a function repeatedly or once after a delay.
  2. Step 2: Relate to periodic status reporting

    Periodic status reporting requires running code repeatedly at fixed intervals, which timers enable.
  3. Final Answer:

    To run a function repeatedly at fixed time intervals -> Option C
  4. Quick Check:

    Timer = repeated function calls [OK]
Hint: Timers run code repeatedly at set intervals [OK]
Common Mistakes:
  • Confusing timers with tasks
  • Thinking timers pause the system
  • Assuming timers allocate memory
2. Which of the following is the correct way to create a FreeRTOS timer named statusTimer with a 1000 ms period and auto-reload enabled?
easy
A. xTimerCreate("statusTimer", pdMS_TO_TICKS(1000), pdTRUE, NULL, TimerCallback);
B. xTimerCreate("statusTimer", 1000, pdFALSE, NULL, TimerCallback);
C. xTimerCreate("statusTimer", pdMS_TO_TICKS(1000), pdFALSE, NULL, TimerCallback);
D. xTimerCreate("statusTimer", 1000, pdTRUE, NULL, TimerCallback);

Solution

  1. Step 1: Identify correct period conversion

    FreeRTOS timers use ticks, so pdMS_TO_TICKS(1000) converts 1000 ms to ticks correctly.
  2. Step 2: Check auto-reload parameter

    pdTRUE enables auto-reload for periodic timers, which is needed here.
  3. Final Answer:

    xTimerCreate("statusTimer", pdMS_TO_TICKS(1000), pdTRUE, NULL, TimerCallback); -> Option A
  4. Quick Check:

    Use pdMS_TO_TICKS and pdTRUE for periodic timers [OK]
Hint: Use pdMS_TO_TICKS for ms and pdTRUE for auto-reload [OK]
Common Mistakes:
  • Using raw milliseconds instead of ticks
  • Setting auto-reload to pdFALSE for periodic timer
  • Confusing pdTRUE and pdFALSE values
3. Given the code snippet below, what will be printed every second?
void TimerCallback(TimerHandle_t xTimer) {
    printf("Status: OK\n");
}

int main() {
    TimerHandle_t statusTimer = xTimerCreate("statusTimer", pdMS_TO_TICKS(1000), pdTRUE, NULL, TimerCallback);
    xTimerStart(statusTimer, 0);
    vTaskStartScheduler();
    return 0;
}
medium
A. Status: OK printed every second repeatedly
B. Status: OK printed once after 1 second
C. No output because timer is not started
D. Compilation error due to missing parameters

Solution

  1. Step 1: Analyze timer creation and start

    The timer is created with pdTRUE for auto-reload and started immediately, so it runs repeatedly.
  2. Step 2: Understand callback behavior

    The callback prints "Status: OK" each time the timer expires, which is every 1000 ms (1 second).
  3. Final Answer:

    Status: OK printed every second repeatedly -> Option A
  4. Quick Check:

    Auto-reload timer prints every second [OK]
Hint: Auto-reload timers call callback repeatedly [OK]
Common Mistakes:
  • Assuming timer runs only once
  • Forgetting to start the timer
  • Confusing callback parameters
4. Identify the error in the following FreeRTOS timer code snippet:
TimerHandle_t statusTimer = xTimerCreate("statusTimer", 1000, pdTRUE, NULL, TimerCallback);
xTimerStart(statusTimer, 0);
medium
A. Timer callback function is missing
B. Timer name must be NULL, not a string
C. Auto-reload parameter must be pdFALSE for periodic timers
D. Timer period should be converted to ticks using pdMS_TO_TICKS

Solution

  1. Step 1: Check timer period parameter

    The period is given as 1000 (milliseconds) but FreeRTOS expects ticks, so pdMS_TO_TICKS is needed.
  2. Step 2: Verify other parameters

    The timer name as string is allowed, auto-reload pdTRUE is correct, and callback is assumed defined.
  3. Final Answer:

    Timer period should be converted to ticks using pdMS_TO_TICKS -> Option D
  4. Quick Check:

    Always convert ms to ticks with pdMS_TO_TICKS [OK]
Hint: Always convert ms to ticks with pdMS_TO_TICKS [OK]
Common Mistakes:
  • Passing raw milliseconds instead of ticks
  • Confusing auto-reload true/false
  • Assuming timer name must be NULL
5. You want to implement a FreeRTOS timer that reports system status every 2 seconds but only for 5 times, then stops automatically. Which approach correctly achieves this?
hard
A. Create a one-shot timer with 2-second period and restart it manually 5 times in callback
B. Create an auto-reload timer with 2-second period and count executions in callback, then stop timer after 5 times
C. Create an auto-reload timer with 10-second period and print status every 2 seconds inside callback
D. Create a one-shot timer with 10-second period and start it 5 times in a loop

Solution

  1. Step 1: Understand timer types and requirements

    Auto-reload timers run repeatedly; one-shot timers run once. We need repeated calls every 2 seconds.
  2. Step 2: Implement counting and stopping logic

    Use an auto-reload timer with 2-second period, count callback calls, and stop timer after 5 executions.
  3. Final Answer:

    Create an auto-reload timer with 2-second period and count executions in callback, then stop timer after 5 times -> Option B
  4. Quick Check:

    Auto-reload + count + stop after 5 [OK]
Hint: Use auto-reload timer and stop after count in callback [OK]
Common Mistakes:
  • Using one-shot timer without manual restarts
  • Incorrect timer period causing wrong intervals
  • Not stopping timer after desired count
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard