Bird
Raised Fist0
FreeRTOSprogramming~5 mins

Why semaphores are needed in FreeRTOS

Choose your learning style10 modes available
Introduction

Semaphores help tasks share resources safely without crashing or mixing data. They keep things organized when many tasks want the same thing.

When two tasks need to use the same printer without printing over each other.
When a sensor data buffer must be accessed by multiple tasks without corrupting data.
When a task must wait for another task to finish before continuing.
When controlling access to a shared variable to avoid wrong values.
When signaling between tasks that an event has happened.
Syntax
FreeRTOS
SemaphoreHandle_t xSemaphore;
xSemaphore = xSemaphoreCreateBinary();

// To take (wait) the semaphore
if (xSemaphoreTake(xSemaphore, portMAX_DELAY) == pdTRUE) {
    // Access shared resource
    xSemaphoreGive(xSemaphore); // Release semaphore
}

Semaphores are created before use and tasks take or give them to control access.

Taking a semaphore means waiting until it is available; giving it releases it for others.

Examples
This example creates a mutex semaphore and tries to take it with a 1000 tick timeout.
FreeRTOS
xSemaphore = xSemaphoreCreateMutex();

if (xSemaphoreTake(xSemaphore, 1000 / portTICK_PERIOD_MS) == pdTRUE) {
    // Use resource
    xSemaphoreGive(xSemaphore);
}
This shows a binary semaphore given first, then taken by a task waiting indefinitely.
FreeRTOS
xSemaphore = xSemaphoreCreateBinary();
xSemaphoreGive(xSemaphore); // Make it available

if (xSemaphoreTake(xSemaphore, portMAX_DELAY) == pdTRUE) {
    // Proceed after semaphore is given
}
Sample Program

This program creates a mutex semaphore and two tasks that take and release it. The output shows how tasks wait for the semaphore to be free before running.

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

SemaphoreHandle_t xSemaphore;

void vTask1(void *pvParameters) {
    if (xSemaphoreTake(xSemaphore, portMAX_DELAY) == pdTRUE) {
        printf("Task 1: Got semaphore\n");
        vTaskDelay(1000 / portTICK_PERIOD_MS); // Simulate work
        xSemaphoreGive(xSemaphore);
        printf("Task 1: Released semaphore\n");
    }
    vTaskDelete(NULL);
}

void vTask2(void *pvParameters) {
    if (xSemaphoreTake(xSemaphore, portMAX_DELAY) == pdTRUE) {
        printf("Task 2: Got semaphore\n");
        vTaskDelay(500 / portTICK_PERIOD_MS); // Simulate work
        xSemaphoreGive(xSemaphore);
        printf("Task 2: Released semaphore\n");
    }
    vTaskDelete(NULL);
}

int main(void) {
    xSemaphore = xSemaphoreCreateMutex();
    if (xSemaphore == NULL) {
        printf("Failed to create semaphore\n");
        return 1;
    }

    xTaskCreate(vTask1, "Task1", 1000, NULL, 1, NULL);
    xTaskCreate(vTask2, "Task2", 1000, NULL, 1, NULL);

    vTaskStartScheduler();
    return 0;
}
OutputSuccess
Important Notes

Without semaphores, tasks might access shared resources at the same time causing errors.

Semaphores can also be used to signal events between tasks.

Summary

Semaphores keep tasks from interfering when sharing resources.

They help tasks wait for each other in an organized way.

Using semaphores prevents data corruption and crashes.

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