Bird
Raised Fist0
FreeRTOSprogramming~5 mins

Binary semaphore creation and usage in FreeRTOS - Cheat Sheet & Quick Revision

Choose your learning style10 modes available
Recall & Review
beginner
What is a binary semaphore in FreeRTOS?
A binary semaphore is a synchronization tool that can have only two states: taken (0) or given (1). It helps tasks or interrupts coordinate access to shared resources.
Click to reveal answer
beginner
How do you create a binary semaphore in FreeRTOS?
Use the function xSemaphoreCreateBinary(), which returns a handle to the new semaphore. This semaphore starts in the 'empty' state (taken).
Click to reveal answer
beginner
How do you 'give' and 'take' a binary semaphore in FreeRTOS?
Use xSemaphoreGive() to release (give) the semaphore, making it available. Use xSemaphoreTake() to acquire (take) the semaphore, blocking if it's not available.
Click to reveal answer
intermediate
What happens if a task tries to take a binary semaphore that is already taken?
The task will block (wait) until the semaphore is given by another task or interrupt, or until a timeout occurs if specified.
Click to reveal answer
intermediate
Why use a binary semaphore instead of a mutex in FreeRTOS?
Binary semaphores are simpler and can be used for signaling between tasks or interrupts. Mutexes include priority inheritance and are better for resource protection.
Click to reveal answer
Which function creates a binary semaphore in FreeRTOS?
AxSemaphoreCreateBinary()
BxSemaphoreCreateMutex()
CvSemaphoreCreateBinary()
DxSemaphoreInitBinary()
What does xSemaphoreTake() do if the semaphore is not available?
ABlocks the task until the semaphore is given or timeout occurs
BImmediately returns success
CDeletes the semaphore
DCreates a new semaphore
What is the initial state of a binary semaphore created with xSemaphoreCreateBinary()?
AFull (given)
BUndefined
CLocked
DEmpty (taken)
Which function releases a binary semaphore in FreeRTOS?
AxSemaphoreUnlock()
BxSemaphoreGive()
CvSemaphoreRelease()
DxSemaphoreTake()
Binary semaphores are best used for:
AAllocating memory
BProtecting shared resources with priority inheritance
CSignaling between tasks or interrupts
DScheduling tasks
Explain how to create and use a binary semaphore in FreeRTOS to synchronize two tasks.
Think about how one task waits and another signals.
You got /5 concepts.
    Describe the difference between a binary semaphore and a mutex in FreeRTOS.
    Consider their purpose and features.
    You got /5 concepts.

      Practice

      (1/5)
      1. What is the primary purpose of a binary semaphore in FreeRTOS?
      easy
      A. To store multiple values for task communication
      B. To signal and control access to shared resources between tasks
      C. To create multiple tasks automatically
      D. To allocate memory dynamically

      Solution

      1. Step 1: Understand the role of binary semaphores

        Binary semaphores are used to signal availability or control access to resources between tasks.
      2. Step 2: Compare options with this role

        Only To signal and control access to shared resources between tasks describes signaling and controlling access, which matches the purpose of binary semaphores.
      3. Final Answer:

        To signal and control access to shared resources between tasks -> Option B
      4. Quick Check:

        Binary semaphore = resource signaling [OK]
      Hint: Binary semaphore controls resource access between tasks [OK]
      Common Mistakes:
      • Confusing binary semaphore with counting semaphore
      • Thinking it stores multiple values
      • Assuming it creates tasks
      2. Which of the following is the correct way to create a binary semaphore in FreeRTOS?
      easy
      A. xSemaphoreCreateBinary();
      B. xSemaphoreCreateCounting(1, 0);
      C. xSemaphoreCreateMutex();
      D. xSemaphoreCreateBinary(1);

      Solution

      1. Step 1: Recall the function to create a binary semaphore

        The correct function is xSemaphoreCreateBinary() with no parameters.
      2. Step 2: Check each option

        xSemaphoreCreateBinary(); matches the correct function. xSemaphoreCreateCounting(1, 0); creates a counting semaphore, C creates a mutex, and D is invalid syntax.
      3. Final Answer:

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

        Create binary semaphore = xSemaphoreCreateBinary() [OK]
      Hint: Use xSemaphoreCreateBinary() with no arguments [OK]
      Common Mistakes:
      • Using counting semaphore creation instead
      • Adding parameters to xSemaphoreCreateBinary()
      • Confusing mutex creation with binary semaphore
      3. Consider the following FreeRTOS code snippet:
      SemaphoreHandle_t xBinarySemaphore = xSemaphoreCreateBinary();
      
      void Task1(void *pvParameters) {
          if (xSemaphoreTake(xBinarySemaphore, portMAX_DELAY) == pdTRUE) {
              // Critical section
          }
      }
      
      void Task2(void *pvParameters) {
          xSemaphoreGive(xBinarySemaphore);
      }
      What will happen when Task1 runs before Task2?
      medium
      A. Task1 will enter the critical section immediately
      B. Task1 will skip the critical section
      C. Task1 will cause a runtime error
      D. Task1 will block indefinitely until Task2 gives the semaphore

      Solution

      1. Step 1: Analyze xSemaphoreTake with portMAX_DELAY

        Task1 calls xSemaphoreTake with portMAX_DELAY, so it waits indefinitely for the semaphore.
      2. Step 2: Consider initial semaphore state and Task2 action

        The semaphore is created but not given initially, so Task1 blocks until Task2 calls xSemaphoreGive.
      3. Final Answer:

        Task1 will block indefinitely until Task2 gives the semaphore -> Option D
      4. Quick Check:

        xSemaphoreTake with portMAX_DELAY blocks until given [OK]
      Hint: xSemaphoreTake with portMAX_DELAY waits until given [OK]
      Common Mistakes:
      • Assuming semaphore is initially available
      • Thinking Task1 runs critical section immediately
      • Confusing blocking with error
      4. Identify the error in this FreeRTOS binary semaphore usage:
      SemaphoreHandle_t xBinarySemaphore = xSemaphoreCreateBinary();
      
      void Task(void *pvParameters) {
          if (xSemaphoreTake(xBinarySemaphore, 0) == pdTRUE) {
              // Do work
              xSemaphoreGive(xBinarySemaphore);
          }
      }
      medium
      A. xSemaphoreCreateBinary requires a parameter
      B. xSemaphoreGive should be called before xSemaphoreTake
      C. Semaphore is never given before take, so take always fails
      D. xSemaphoreTake timeout cannot be zero

      Solution

      1. Step 1: Check initial semaphore state after creation

        xSemaphoreCreateBinary creates a semaphore that is initially empty (not given).
      2. Step 2: Analyze xSemaphoreTake with zero timeout

        With zero timeout, xSemaphoreTake returns immediately. Since semaphore is empty, it returns pdFALSE, so the if block never runs.
      3. Final Answer:

        Semaphore is never given before take, so take always fails -> Option C
      4. Quick Check:

        Binary semaphore empty at creation, take with zero timeout fails [OK]
      Hint: Binary semaphore must be given before take succeeds [OK]
      Common Mistakes:
      • Assuming semaphore is initially given
      • Thinking zero timeout means wait forever
      • Confusing function parameters
      5. You want to synchronize two tasks so that Task B only runs after Task A signals completion using a binary semaphore. Which sequence correctly implements this?
      hard
      A. Task A calls xSemaphoreGive() after work; Task B calls xSemaphoreTake() with portMAX_DELAY before work
      B. Task B calls xSemaphoreGive() before work; Task A calls xSemaphoreTake() after work
      C. Both tasks call xSemaphoreTake() simultaneously; semaphore is given once at start
      D. Task A and Task B both call xSemaphoreGive() without taking

      Solution

      1. Step 1: Understand synchronization with binary semaphore

        Task B must wait for Task A's signal, so Task B should take the semaphore and block until given.
      2. Step 2: Match sequence to this logic

        Task A gives the semaphore after finishing work; Task B takes it with portMAX_DELAY to wait indefinitely.
      3. Final Answer:

        Task A calls xSemaphoreGive() after work; Task B calls xSemaphoreTake() with portMAX_DELAY before work -> Option A
      4. Quick Check:

        Give after work, take before work = sync tasks [OK]
      Hint: Give semaphore after work; take before work to sync tasks [OK]
      Common Mistakes:
      • Reversing give and take roles
      • Both tasks giving without taking
      • Taking without giving semaphore
      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