Bird
Raised Fist0
FreeRTOSprogramming~10 mins

Health monitoring and heartbeat in FreeRTOS - Interactive Code Practice

Choose your learning style10 modes available
Practice - 5 Tasks
Answer the questions below
1fill in blank
easy

Complete the code to create a heartbeat task that toggles an LED.

FreeRTOS
void HeartbeatTask(void *pvParameters) {
    for(;;) {
        ToggleLED();
        vTaskDelay([1]);
    }
}
Drag options to blanks, or click blank then click option'
A100 / portTICK_PERIOD_MS
B10 / portTICK_PERIOD_MS
C1000 / portTICK_PERIOD_MS
D5000 / portTICK_PERIOD_MS
Attempts:
3 left
💡 Hint
Common Mistakes
Using too long or too short delay causing no visible heartbeat.
2fill in blank
medium

Complete the code to initialize the watchdog timer with a timeout.

FreeRTOS
void InitWatchdog() {
    Watchdog_Config config = {
        .timeout = [1]
    };
    Watchdog_Init(&config);
}
Drag options to blanks, or click blank then click option'
A5000
B20000
C1000
D10000
Attempts:
3 left
💡 Hint
Common Mistakes
Setting timeout too short causing frequent resets.
3fill in blank
hard

Fix the error in the watchdog refresh function to prevent system reset.

FreeRTOS
void RefreshWatchdog() {
    [1]();
}
Drag options to blanks, or click blank then click option'
AWatchdog_Feed
BWatchdog_Reset
CWatchdog_Refresh
DWatchdog_Kick
Attempts:
3 left
💡 Hint
Common Mistakes
Using a non-existent function name causing compile errors.
4fill in blank
hard

Fill both blanks to create a health check task that signals system status.

FreeRTOS
void HealthCheckTask(void *pvParameters) {
    for(;;) {
        if(SystemIsHealthy()) {
            SignalStatus([1]);
        } else {
            SignalStatus([2]);
        }
        vTaskDelay(1000 / portTICK_PERIOD_MS);
    }
}
Drag options to blanks, or click blank then click option'
ALED_GREEN
BLED_RED
CLED_BLUE
DLED_YELLOW
Attempts:
3 left
💡 Hint
Common Mistakes
Swapping LED colors causing confusing signals.
5fill in blank
hard

Fill all three blanks to create a dictionary mapping task names to their heartbeat intervals.

FreeRTOS
const TaskHeartbeatConfig taskHeartbeats = {
    [1]: [2],
    [3]: 500
};
Drag options to blanks, or click blank then click option'
A"SensorTask"
B1000
C"CommTask"
D2000
Attempts:
3 left
💡 Hint
Common Mistakes
Mixing keys and values or using wrong data types.

Practice

(1/5)
1. What is the main purpose of a heartbeat task in FreeRTOS?
easy
A. To permanently block other tasks from running
B. To repeatedly indicate the system is running and healthy
C. To increase CPU usage by running continuously without delay
D. To handle user input events exclusively

Solution

  1. Step 1: Understand heartbeat task role

    A heartbeat task runs repeatedly to show the system is alive and working properly.
  2. Step 2: Eliminate incorrect options

    Blocking other tasks or handling user input are not typical heartbeat functions.
  3. Final Answer:

    To repeatedly indicate the system is running and healthy -> Option B
  4. Quick Check:

    Heartbeat = system health indicator [OK]
Hint: Heartbeat tasks show system health by running repeatedly [OK]
Common Mistakes:
  • Thinking heartbeat blocks other tasks
  • Assuming heartbeat handles user input
  • Believing heartbeat increases CPU load unnecessarily
2. Which FreeRTOS function is best to use inside a heartbeat task to wait without blocking other tasks?
easy
A. vTaskResume()
B. vTaskSuspend()
C. vTaskDelete()
D. vTaskDelay()

Solution

  1. Step 1: Identify delay function for non-blocking wait

    vTaskDelay() suspends the task for a time, allowing others to run.
  2. Step 2: Understand other functions

    vTaskSuspend() pauses a task indefinitely, vTaskDelete() removes it, and vTaskResume() restarts a suspended task.
  3. Final Answer:

    vTaskDelay() -> Option D
  4. Quick Check:

    Use vTaskDelay() for timed waits [OK]
Hint: Use vTaskDelay() to wait without blocking [OK]
Common Mistakes:
  • Using vTaskSuspend() which blocks indefinitely
  • Confusing vTaskDelete() with delay
  • Trying vTaskResume() to wait
3. Given this heartbeat task snippet, what will be the output if the task runs correctly?
void vHeartbeatTask(void *pvParameters) {
  for (;;) {
    printf("Heartbeat\n");
    vTaskDelay(pdMS_TO_TICKS(1000));
  }
}
medium
A. Prints "Heartbeat" once and stops
B. Prints "Heartbeat" continuously without delay
C. Prints "Heartbeat" every second repeatedly
D. Does not print anything due to syntax error

Solution

  1. Step 1: Analyze the infinite loop

    The for(;;) loop runs forever, printing "Heartbeat" each cycle.
  2. Step 2: Check the delay function

    vTaskDelay(pdMS_TO_TICKS(1000)) pauses the task for 1000 ms (1 second) between prints.
  3. Final Answer:

    Prints "Heartbeat" every second repeatedly -> Option C
  4. Quick Check:

    Infinite loop + vTaskDelay(1s) = repeated print every second [OK]
Hint: Infinite loop with vTaskDelay prints repeatedly [OK]
Common Mistakes:
  • Thinking it prints only once
  • Ignoring the delay causing continuous print
  • Assuming syntax error without checking code
4. Identify the error in this heartbeat task code snippet:
void vHeartbeatTask(void *pvParameters) {
  while(1) {
    printf("Heartbeat\n");
    vTaskDelay(1000);
  }
}
medium
A. vTaskDelay() argument should be in ticks, not milliseconds
B. printf() cannot be used inside tasks
C. while(1) should be for(;;)
D. Missing task notification call

Solution

  1. Step 1: Check vTaskDelay argument type

    vTaskDelay() expects delay in ticks, not milliseconds directly.
  2. Step 2: Correct usage

    Use pdMS_TO_TICKS(1000) to convert 1000 ms to ticks for vTaskDelay.
  3. Final Answer:

    vTaskDelay() argument should be in ticks, not milliseconds -> Option A
  4. Quick Check:

    vTaskDelay(ms) wrong, use pdMS_TO_TICKS(ms) [OK]
Hint: Always convert ms to ticks with pdMS_TO_TICKS() [OK]
Common Mistakes:
  • Passing milliseconds directly to vTaskDelay()
  • Thinking printf() is disallowed in tasks
  • Believing while(1) is invalid syntax
5. You want to implement a heartbeat task that signals system health by toggling an LED every 500 ms and also logs a message every 5 seconds. Which approach is best?
hard
A. Create two separate tasks: one toggling LED every 500 ms, another logging every 5 seconds
B. Use one task with vTaskDelay(500) to toggle LED and count loops to log every 5 seconds
C. Use a single task with vTaskDelay(5000) to do both toggle and log at once
D. Toggle LED and log message without any delay to maximize responsiveness

Solution

  1. Step 1: Understand timing requirements

    LED toggles every 500 ms, logging every 5 seconds require different intervals.
  2. Step 2: Evaluate task design options

    Two separate tasks allow independent timing without complex counting or blocking.
  3. Step 3: Consider drawbacks of other options

    Single task with 500 ms delay and counting adds complexity; 5000 ms delay misses LED timing; no delay wastes CPU.
  4. Final Answer:

    Create two separate tasks: one toggling LED every 500 ms, another logging every 5 seconds -> Option A
  5. Quick Check:

    Separate tasks for different intervals = clean design [OK]
Hint: Use separate tasks for different heartbeat intervals [OK]
Common Mistakes:
  • Trying to handle all timing in one task
  • Using long delays missing faster toggles
  • No delays causing CPU overload
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