Critical sections help protect important code from being interrupted. This keeps data safe and programs running smoothly.
Critical sections and interrupt disabling in FreeRTOS
taskENTER_CRITICAL(); // critical code here taskEXIT_CRITICAL();
taskENTER_CRITICAL() disables interrupts to protect the code inside.
taskEXIT_CRITICAL() re-enables interrupts after the critical code finishes.
taskENTER_CRITICAL(); sharedVariable++; taskEXIT_CRITICAL();
taskENTER_CRITICAL(); // update multiple shared resources resource1 = newValue1; resource2 = newValue2; taskEXIT_CRITICAL();
taskENTER_CRITICAL();
// critical section with function call
updateSharedData();
taskEXIT_CRITICAL();This program shows how to safely increase a shared counter using a critical section to disable interrupts during the update.
#include "FreeRTOS.h" #include "task.h" #include <stdio.h> volatile int sharedCounter = 0; void incrementCounter() { taskENTER_CRITICAL(); sharedCounter++; taskEXIT_CRITICAL(); } int main() { printf("Before increment: %d\n", sharedCounter); incrementCounter(); printf("After increment: %d\n", sharedCounter); return 0; }
Always keep critical sections as short as possible to avoid slowing down the system.
Do not call blocking functions inside critical sections because it can cause system problems.
Use critical sections only when necessary to protect shared data or hardware access.
Critical sections stop interrupts to protect important code.
Use taskENTER_CRITICAL() and taskEXIT_CRITICAL() to mark critical sections.
Keep critical sections short and simple for best system performance.
Practice
taskENTER_CRITICAL() and taskEXIT_CRITICAL() in FreeRTOS?Solution
Step 1: Understand critical sections in FreeRTOS
Critical sections are used to protect code that must not be interrupted to avoid data corruption or race conditions.Step 2: Role of
These functions disable and enable interrupts respectively, marking the start and end of a critical section.taskENTER_CRITICAL()andtaskEXIT_CRITICAL()Final Answer:
To prevent interrupts during a critical section of code -> Option AQuick Check:
Critical sections stop interrupts = A [OK]
- Confusing critical sections with task creation
- Thinking they manage memory
- Assuming they start the scheduler
Solution
Step 1: Identify the function to enter critical section
The correct FreeRTOS API to disable interrupts and enter a critical section istaskENTER_CRITICAL().Step 2: Check other options for correctness
taskEXIT_CRITICAL()exits the critical section, others are not valid FreeRTOS functions.Final Answer:
taskENTER_CRITICAL(); -> Option CQuick Check:
Enter critical section = taskENTER_CRITICAL() [OK]
- Using taskEXIT_CRITICAL() to start critical section
- Inventing non-existent functions
- Confusing function names
taskENTER_CRITICAL(); sharedVariable++; taskEXIT_CRITICAL();What is the effect of this code on
sharedVariable?Solution
Step 1: Analyze the critical section usage
The code disables interrupts before incrementing sharedVariable and re-enables them after, protecting the increment operation.Step 2: Understand the effect on sharedVariable
This ensures the increment is atomic and safe from concurrent access or interrupts.Final Answer:
It increments sharedVariable safely without interruption -> Option AQuick Check:
Critical section protects increment = D [OK]
- Thinking interrupts are allowed during increment
- Assuming syntax errors where none exist
- Believing variable resets to zero
taskENTER_CRITICAL(); sharedCounter++; // Missing taskEXIT_CRITICAL();
Solution
Step 1: Check for matching critical section calls
The code callstaskENTER_CRITICAL()but does not calltaskEXIT_CRITICAL()to re-enable interrupts.Step 2: Understand consequences of missing exit
Interrupts remain disabled indefinitely, which can cause system to freeze or miss important events.Final Answer:
Interrupts remain disabled causing system issues -> Option DQuick Check:
Missing taskEXIT_CRITICAL() disables interrupts forever = A [OK]
- Ignoring missing exit call
- Assuming increment fails
- Thinking code has syntax errors
Solution
Step 1: Understand impact of critical section length
Long critical sections block interrupts for too long, reducing system responsiveness.Step 2: Best practice for protecting shared resources
Short critical sections minimize interrupt blocking while protecting shared data safely.Final Answer:
Use short critical sections only around the minimal code that accesses the resource -> Option BQuick Check:
Short critical sections = better responsiveness [OK]
- Using long critical sections unnecessarily
- Disabling interrupts globally
- Ignoring synchronization needs
Ready to prove it?
Pass the test and this pattern moves unknown
