Bird
Raised Fist0
FreeRTOSprogramming~10 mins

Stack overflow detection (method 1 and 2) in FreeRTOS

Choose your learning style10 modes available
Introduction

Stack overflow detection helps catch when a program uses more memory than allowed for its stack. This prevents crashes and bugs.

When running tasks in FreeRTOS that have limited stack size.
When debugging unexpected crashes or freezes in embedded systems.
When developing safety-critical applications that must avoid memory corruption.
When optimizing memory usage to ensure tasks have enough stack but not too much.
When testing new tasks or code changes that might increase stack usage.
Syntax
FreeRTOS
/* Method 1: Using configCHECK_FOR_STACK_OVERFLOW = 1 or 2 in FreeRTOSConfig.h */

// Enable stack overflow checking in FreeRTOSConfig.h
#define configCHECK_FOR_STACK_OVERFLOW 1

// Implement the hook function in your application code
void vApplicationStackOverflowHook(TaskHandle_t xTask, char *pcTaskName) {
    // This function is called when a stack overflow is detected
    // You can log, halt, or reset the system here
    for(;;); // Loop forever to halt
}

/* Method 2: Using pxTaskGetStackStart and manual checking */

// Example function to check stack overflow manually
void CheckTaskStackOverflow(TaskHandle_t xTask) {
    // Get stack start address
    StackType_t *stack_start = pxTaskGetStackStart(xTask);
    // Get current stack pointer
    StackType_t *stack_pointer = pxTaskGetStackPointer(xTask);
    // Compare pointers to detect overflow
    if(stack_pointer < stack_start) {
        // Stack overflow detected
    }
}

Method 1 uses FreeRTOS built-in hook and config option for automatic detection.

Method 2 requires manual checking and is less common but useful for custom needs.

Examples
This example shows method 1 with config 1, which checks overflow on task switch.
FreeRTOS
#define configCHECK_FOR_STACK_OVERFLOW 1

void vApplicationStackOverflowHook(TaskHandle_t xTask, char *pcTaskName) {
    // Called on overflow
    printf("Stack overflow in task: %s\n", pcTaskName);
    for(;;); // Stop here
}
Method 1 with config 2 does more thorough checking on each context switch.
FreeRTOS
#define configCHECK_FOR_STACK_OVERFLOW 2

void vApplicationStackOverflowHook(TaskHandle_t xTask, char *pcTaskName) {
    // Called on overflow
    printf("Stack overflow detected in task: %s\n", pcTaskName);
    for(;;); // Halt
}
Method 2 manually compares stack pointers to detect overflow.
FreeRTOS
void CheckTaskStackOverflow(TaskHandle_t xTask) {
    StackType_t *stack_start = pxTaskGetStackStart(xTask);
    StackType_t *stack_pointer = pxTaskGetStackPointer(xTask);
    if(stack_pointer < stack_start) {
        printf("Manual stack overflow detected\n");
    }
}
Always check if task handle is valid before checking stack.
FreeRTOS
// Edge case: Empty task handle
void CheckTaskStackOverflow(TaskHandle_t xTask) {
    if(xTask == NULL) {
        printf("Invalid task handle\n");
        return;
    }
    // Proceed with checking
}
Sample Program

This program enables method 1 stack overflow detection. It creates a task with a small stack and large local array to cause overflow. When overflow happens, the hook prints a message and halts.

FreeRTOS
#define configCHECK_FOR_STACK_OVERFLOW 1

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

void vApplicationStackOverflowHook(TaskHandle_t xTask, char *pcTaskName) {
    printf("Stack overflow detected in task: %s\n", pcTaskName);
    for(;;); // Halt system
}

void vTaskFunction(void *pvParameters) {
    volatile int array[1000]; // Large array to cause overflow
    (void)array;
    while(1) {
        vTaskDelay(pdMS_TO_TICKS(1000));
    }
}

int main(void) {
    TaskHandle_t xTaskHandle = NULL;
    xTaskCreate(vTaskFunction, "OverflowTask", 100, NULL, 1, &xTaskHandle);
    vTaskStartScheduler();
    // Should never reach here
    return 0;
}
OutputSuccess
Important Notes

Stack overflow detection adds some overhead but helps catch serious bugs early.

Method 1 is recommended for most users because it integrates with FreeRTOS scheduler.

Common mistake: Not enabling configCHECK_FOR_STACK_OVERFLOW or not implementing the hook.

Use stack overflow detection during development and testing to avoid crashes in production.

Time complexity: O(1) per context switch for method 1; manual checks depend on implementation.

Space complexity: Slightly increased stack size due to checking variables.

Summary

Stack overflow detection prevents tasks from corrupting memory by using too much stack.

Method 1 uses FreeRTOS config and hook for automatic detection on context switches.

Method 2 allows manual checking by comparing stack pointers but is less common.

Practice

(1/5)
1. What is the main purpose of stack overflow detection in FreeRTOS?
easy
A. To reduce RAM usage by tasks
B. To prevent tasks from using more stack memory than allocated
C. To increase CPU clock speed
D. To speed up task switching

Solution

  1. Step 1: Understand stack overflow concept

    Stack overflow happens when a task uses more stack memory than allocated, causing memory corruption.
  2. Step 2: Identify purpose of detection

    Stack overflow detection helps catch this problem early to prevent crashes or unpredictable behavior.
  3. Final Answer:

    To prevent tasks from using more stack memory than allocated -> Option B
  4. Quick Check:

    Stack overflow detection = prevent excess stack use [OK]
Hint: Stack overflow detection stops tasks using too much stack [OK]
Common Mistakes:
  • Confusing stack overflow with CPU speed
  • Thinking it reduces RAM usage
  • Assuming it speeds up task switching
2. Which FreeRTOS configuration enables Method 1 stack overflow detection?
easy
A. configMAX_PRIORITIES set to 5
B. configUSE_PREEMPTION set to 0
C. configUSE_IDLE_HOOK set to 1
D. configCHECK_FOR_STACK_OVERFLOW set to 1 or 2

Solution

  1. Step 1: Identify config for stack overflow detection

    FreeRTOS uses configCHECK_FOR_STACK_OVERFLOW to enable Method 1 detection.
  2. Step 2: Understand valid values

    Setting configCHECK_FOR_STACK_OVERFLOW to 1 or 2 activates automatic detection on context switches.
  3. Final Answer:

    configCHECK_FOR_STACK_OVERFLOW set to 1 or 2 -> Option D
  4. Quick Check:

    configCHECK_FOR_STACK_OVERFLOW = 1 or 2 [OK]
Hint: Method 1 uses configCHECK_FOR_STACK_OVERFLOW = 1 or 2 [OK]
Common Mistakes:
  • Confusing unrelated config options
  • Using configUSE_PREEMPTION for stack checks
  • Setting configMAX_PRIORITIES thinking it affects stack
3. Given this FreeRTOS hook function for Method 1:
void vApplicationStackOverflowHook(TaskHandle_t xTask, char *pcTaskName) {
    printf("Stack overflow detected in task: %s\n", pcTaskName);
    while(1); // Halt
}
What will happen if a stack overflow is detected?
medium
A. Prints task name and halts the system
B. Resets the task automatically
C. Ignores the overflow and continues
D. Logs overflow but continues running

Solution

  1. Step 1: Analyze the hook function code

    The function prints the task name where overflow occurred and then enters an infinite loop.
  2. Step 2: Understand effect of infinite loop

    The infinite loop halts the system to prevent further damage after overflow detection.
  3. Final Answer:

    Prints task name and halts the system -> Option A
  4. Quick Check:

    Stack overflow hook prints and halts [OK]
Hint: Stack overflow hook prints and stops system [OK]
Common Mistakes:
  • Thinking system resets automatically
  • Assuming overflow is ignored
  • Believing task restarts without halt
4. In Method 2 stack overflow detection, which mistake will cause incorrect detection?
medium
A. Using vApplicationStackOverflowHook function
B. Enabling configCHECK_FOR_STACK_OVERFLOW to 2
C. Not initializing the stack pointer check value properly
D. Setting configUSE_PREEMPTION to 1

Solution

  1. Step 1: Understand Method 2 detection

    Method 2 manually checks stack pointer against a known value to detect overflow.
  2. Step 2: Identify common error

    If the initial stack pointer check value is not set correctly, the comparison will be invalid, causing false negatives or positives.
  3. Final Answer:

    Not initializing the stack pointer check value properly -> Option C
  4. Quick Check:

    Method 2 needs correct stack pointer init [OK]
Hint: Method 2 needs proper stack pointer initialization [OK]
Common Mistakes:
  • Confusing Method 1 config with Method 2
  • Ignoring stack pointer initialization
  • Assuming hook function is used in Method 2
5. You want to implement stack overflow detection in your FreeRTOS project using Method 1. Which steps should you follow to ensure it works correctly?
hard
A. Set configCHECK_FOR_STACK_OVERFLOW to 1 or 2 and implement vApplicationStackOverflowHook
B. Manually compare stack pointers in each task without config changes
C. Disable preemption and use configUSE_IDLE_HOOK for detection
D. Increase task stack size to avoid overflow without detection

Solution

  1. Step 1: Enable Method 1 detection in config

    Set configCHECK_FOR_STACK_OVERFLOW to 1 or 2 to activate automatic detection during context switches.
  2. Step 2: Implement the hook function

    Define vApplicationStackOverflowHook to handle overflow events, e.g., log and halt.
  3. Final Answer:

    Set configCHECK_FOR_STACK_OVERFLOW to 1 or 2 and implement vApplicationStackOverflowHook -> Option A
  4. Quick Check:

    Method 1 = config + hook function [OK]
Hint: Method 1 needs config and hook function implemented [OK]
Common Mistakes:
  • Trying manual pointer checks for Method 1
  • Disabling preemption thinking it helps detection
  • Ignoring hook function implementation
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