Bird
Raised Fist0
FreeRTOSprogramming~10 mins

Why semaphores are needed in FreeRTOS - Test Your Understanding

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

Complete the code to create a binary semaphore in FreeRTOS.

FreeRTOS
SemaphoreHandle_t xSemaphore = xSemaphoreCreate[1]();
Drag options to blanks, or click blank then click option'
ABinary
BCountingSemaphore
CMutex
DQueue
Attempts:
3 left
💡 Hint
Common Mistakes
Using counting semaphore creation function instead of binary.
2fill in blank
medium

Complete the code to take a semaphore with a block time of 100 ticks.

FreeRTOS
if(xSemaphoreTake(xSemaphore, [1]) == pdTRUE) {
    // Critical section
}
Drag options to blanks, or click blank then click option'
A0
B100
CportMAX_DELAY
D-1
Attempts:
3 left
💡 Hint
Common Mistakes
Using 0 which means no wait, or portMAX_DELAY which waits indefinitely.
3fill in blank
hard

Fix the error in the code to give the semaphore from an ISR.

FreeRTOS
void vISR_Handler(void) {
    BaseType_t xHigherPriorityTaskWoken = pdFALSE;
    xSemaphoreGiveFromISR(xSemaphore, [1]);
    portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
}
Drag options to blanks, or click blank then click option'
ANULL
BxHigherPriorityTaskWoken
C&xHigherPriorityTaskWoken
DpdTRUE
Attempts:
3 left
💡 Hint
Common Mistakes
Passing the variable itself instead of its address.
Passing NULL which disables context switch notification.
4fill in blank
hard

Fill both blanks to create a counting semaphore with a max count of 5 and initial count of 3.

FreeRTOS
xSemaphore = xSemaphoreCreateCounting([1], [2]);
Drag options to blanks, or click blank then click option'
A5
B3
C1
D0
Attempts:
3 left
💡 Hint
Common Mistakes
Swapping the max and initial counts.
Using initial count greater than max count.
5fill in blank
hard

Fill all three blanks to check if a semaphore is available and then take it without blocking.

FreeRTOS
if(xSemaphore[1](xSemaphore, [2]) == [3]) {
    // Semaphore taken
}
Drag options to blanks, or click blank then click option'
ATake
B0
CpdTRUE
DGive
Attempts:
3 left
💡 Hint
Common Mistakes
Using 'Give' instead of 'Take'.
Using block time other than 0 for no wait.
Checking for pdFALSE instead of pdTRUE.

Practice

(1/5)
1. Why are semaphores needed in FreeRTOS when multiple tasks share a resource?
easy
A. To prevent tasks from accessing the resource at the same time and causing errors
B. To speed up the execution of all tasks simultaneously
C. To allow tasks to ignore each other and run independently
D. To increase the memory usage of the system

Solution

  1. Step 1: Understand resource sharing in multitasking

    When multiple tasks share a resource, simultaneous access can cause data corruption or crashes.
  2. Step 2: Role of semaphores in synchronization

    Semaphores act as signals to control access, allowing only one task at a time to use the resource safely.
  3. Final Answer:

    To prevent tasks from accessing the resource at the same time and causing errors -> Option A
  4. Quick Check:

    Semaphores prevent simultaneous access = A [OK]
Hint: Semaphores stop tasks from clashing over shared resources [OK]
Common Mistakes:
  • Thinking semaphores speed up all tasks
  • Believing tasks run independently without coordination
  • Assuming semaphores increase memory usage
2. Which of the following is the correct way to create a binary semaphore in FreeRTOS?
easy
A. xSemaphoreCreateBinary();
B. SemaphoreCreateBinary();
C. createBinarySemaphore();
D. newSemaphoreBinary();

Solution

  1. Step 1: Recall FreeRTOS semaphore creation functions

    FreeRTOS provides the function xSemaphoreCreateBinary() to create a binary semaphore.
  2. Step 2: Verify syntax correctness

    The function name must start with 'x' and match the exact FreeRTOS API naming conventions.
  3. Final Answer:

    xSemaphoreCreateBinary(); -> Option A
  4. Quick Check:

    Correct FreeRTOS binary semaphore function = D [OK]
Hint: FreeRTOS functions start with 'x' for handles [OK]
Common Mistakes:
  • Using incorrect function names without 'x' prefix
  • Confusing with other RTOS APIs
  • Adding extra words to function names
3. Consider this FreeRTOS code snippet:
SemaphoreHandle_t sem = xSemaphoreCreateBinary();
xSemaphoreGive(sem);
if(xSemaphoreTake(sem, 0) == pdTRUE) {
    printf("Access granted\n");
} else {
    printf("Access denied\n");
}
What will be the output?
medium
A. Access denied
B. Access granted
C. Compilation error
D. No output

Solution

  1. Step 1: Understand semaphore creation and initial state

    The binary semaphore is created and then given once, so it is available (count = 1).
  2. Step 2: Check the take operation with zero wait

    The xSemaphoreTake tries to take the semaphore immediately (timeout 0). Since it was given before, it succeeds.
  3. Final Answer:

    Access granted -> Option B
  4. Quick Check:

    Semaphore given then taken immediately = Access granted [OK]
Hint: Semaphore given before take means immediate success [OK]
Common Mistakes:
  • Assuming zero timeout means failure
  • Forgetting to give semaphore before take
  • Confusing binary semaphore initial state
4. This FreeRTOS code snippet tries to protect a shared resource:
SemaphoreHandle_t sem = xSemaphoreCreateBinary();
// Task A
xSemaphoreTake(sem, portMAX_DELAY);
// Access resource
xSemaphoreGive(sem);
// Task B
xSemaphoreTake(sem, portMAX_DELAY);
// Access resource
xSemaphoreGive(sem);
What is the main problem here?
medium
A. The semaphore is created as binary but used as counting
B. The semaphore is given twice causing overflow
C. The semaphore is never given initially, so tasks block forever
D. The tasks do not take the semaphore before accessing resource

Solution

  1. Step 1: Check semaphore initial state after creation

    Binary semaphore created with xSemaphoreCreateBinary() starts empty (not given).
  2. Step 2: Analyze task behavior on take

    Task A tries to take semaphore but it was never given, so it blocks forever. Same for Task B.
  3. Final Answer:

    The semaphore is never given initially, so tasks block forever -> Option C
  4. Quick Check:

    Binary semaphore must be given once before take = C [OK]
Hint: Binary semaphore must be given once before tasks take it [OK]
Common Mistakes:
  • Assuming semaphore is given automatically on creation
  • Thinking multiple gives cause overflow
  • Ignoring semaphore take before resource access
5. You have two tasks sharing a sensor. Task 1 reads data and Task 2 processes it. Without semaphores, data corruption occurs. How should you use semaphores to fix this?
hard
A. Use a counting semaphore with count 0 to block both tasks
B. Use a mutex but never give it back after taking
C. Use no semaphore and rely on task priorities to avoid conflicts
D. Use a binary semaphore to let only one task access the sensor at a time

Solution

  1. Step 1: Identify the problem of simultaneous access

    Both tasks accessing the sensor at the same time cause data corruption.
  2. Step 2: Choose semaphore type and usage

    A binary semaphore ensures only one task accesses the sensor at a time, preventing conflicts.
  3. Final Answer:

    Use a binary semaphore to let only one task access the sensor at a time -> Option D
  4. Quick Check:

    Binary semaphore controls exclusive access = B [OK]
Hint: Binary semaphore allows one task access at a time [OK]
Common Mistakes:
  • Using counting semaphore incorrectly with zero count
  • Ignoring semaphore and trusting priorities alone
  • Not releasing mutex causing deadlock
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