Bird
Raised Fist0
FreeRTOSprogramming~20 mins

xQueueSend() and xQueueReceive() in FreeRTOS - Mini Project: Build & Apply

Choose your learning style10 modes available
Using xQueueSend() and xQueueReceive() in FreeRTOS
📖 Scenario: You are building a simple FreeRTOS application where one task sends numbers to a queue and another task receives and prints them. This simulates a real-world producer-consumer scenario where data is passed safely between tasks.
🎯 Goal: Learn how to create a queue, send data to it using xQueueSend(), receive data using xQueueReceive(), and print the received values.
📋 What You'll Learn
Create a queue to hold integers
Send integer values to the queue using xQueueSend()
Receive integer values from the queue using xQueueReceive()
Print the received values
💡 Why This Matters
🌍 Real World
Queues are used in embedded systems to safely pass data between tasks without conflicts, like sending sensor readings from one task to another for processing.
💼 Career
Understanding queues and inter-task communication is essential for embedded software developers working with real-time operating systems like FreeRTOS.
Progress0 / 4 steps
1
Create a queue to hold integers
Create a queue called intQueue that can hold 5 integers using xQueueCreate().
FreeRTOS
Hint

Use xQueueCreate(5, sizeof(int)) to create a queue for 5 integers.

2
Prepare an integer value to send
Create an integer variable called valueToSend and set it to 42.
FreeRTOS
Hint

Just write int valueToSend = 42; to create and set the variable.

3
Send the integer value to the queue
Use xQueueSend() to send valueToSend to intQueue with a block time of 0.
FreeRTOS
Hint

Use xQueueSend(intQueue, &valueToSend, 0); to send the value without waiting.

4
Receive the integer value from the queue and print it
Create an integer variable called receivedValue. Use xQueueReceive() to receive from intQueue with a block time of 0 into receivedValue. Then print receivedValue using printf().
FreeRTOS
Hint

Use int receivedValue;, then xQueueReceive(intQueue, &receivedValue, 0);, and finally printf("Received: %d\n", receivedValue);.

Practice

(1/5)
1. What is the primary purpose of the xQueueSend() function in FreeRTOS?
easy
A. To remove an item from a queue
B. To add an item to a queue for other tasks to receive
C. To create a new queue
D. To delete an existing queue

Solution

  1. Step 1: Understand the role of xQueueSend()

    xQueueSend() is used to place data into a queue so that other tasks can retrieve it later.
  2. Step 2: Differentiate from other queue functions

    Functions like xQueueReceive() remove data, while xQueueCreate() and xQueueDelete() manage queue lifecycle, not data transfer.
  3. Final Answer:

    To add an item to a queue for other tasks to receive -> Option B
  4. Quick Check:

    xQueueSend() adds data [OK]
Hint: Remember: Send puts data in, Receive takes data out [OK]
Common Mistakes:
  • Confusing sending with receiving
  • Thinking it creates or deletes queues
  • Ignoring the function's data transfer role
2. Which of the following is the correct syntax to send data to a queue using xQueueSend()?
easy
A. xQueueSend(queueHandle, data, 0);
B. xQueueSend(&queueHandle, data, portMAX_DELAY);
C. xQueueSend(queueHandle, &data, portMAX_DELAY);
D. xQueueSend(queueHandle, &data);

Solution

  1. Step 1: Check parameter types for xQueueSend()

    The function expects the queue handle, a pointer to the data, and a timeout value.
  2. Step 2: Match the correct syntax

    xQueueSend(queueHandle, &data, portMAX_DELAY); correctly passes the queue handle, address of data, and a timeout constant portMAX_DELAY.
  3. Final Answer:

    xQueueSend(queueHandle, &data, portMAX_DELAY); -> Option C
  4. Quick Check:

    Queue handle + &data + timeout = correct syntax [OK]
Hint: Always pass data by address and include timeout [OK]
Common Mistakes:
  • Passing data by value instead of pointer
  • Omitting the timeout parameter
  • Passing queue handle by address
3. Consider the following code snippet:
int value = 10;
if (xQueueSend(queue, &value, 0) == pdPASS) {
    int receivedValue = 0;
    if (xQueueReceive(queue, &receivedValue, 0) == pdPASS) {
        printf("%d", receivedValue);
    }
}

What will be printed when this code runs?
medium
A. 10
B. 0
C. No output (queue empty)
D. Compilation error

Solution

  1. Step 1: Analyze xQueueSend() call

    The value 10 is sent to the queue with zero wait time. If the queue is not full, it returns pdPASS.
  2. Step 2: Analyze xQueueReceive() call

    The code tries to receive from the queue immediately. Since the value was just sent, it will receive 10 and print it.
  3. Final Answer:

    10 -> Option A
  4. Quick Check:

    Send 10, receive 10, print 10 [OK]
Hint: Send then receive immediately prints sent value [OK]
Common Mistakes:
  • Assuming queue is empty at receive
  • Confusing return values with data
  • Ignoring zero timeout behavior
4. What is wrong with this code snippet?
int data = 5;
if (xQueueSend(queue, data, 10) != pdPASS) {
    // handle error
}
medium
A. Data should be passed by pointer, not by value
B. Timeout value 10 is invalid
C. Return value should not be compared to pdPASS
D. Queue handle is missing

Solution

  1. Step 1: Check parameter types in xQueueSend()

    The second parameter must be a pointer to the data, but here data is passed by value.
  2. Step 2: Identify the error cause

    Passing data by value causes a type mismatch and likely a compilation error or incorrect behavior.
  3. Final Answer:

    Data should be passed by pointer, not by value -> Option A
  4. Quick Check:

    Pass &data, not data [OK]
Hint: Always pass address of data to queue functions [OK]
Common Mistakes:
  • Passing data directly instead of pointer
  • Misunderstanding timeout parameter
  • Ignoring return value check
5. You want to send multiple integers to a queue and then receive them in order. Which approach correctly uses xQueueSend() and xQueueReceive() to achieve this without losing data?
hard
A. Use xQueueReceive() to send data and xQueueSend() to receive data
B. Send all integers at once by passing an array pointer to xQueueSend(), then receive with one xQueueReceive()
C. Send integers without checking return values, then receive once expecting all data
D. Send each integer with xQueueSend() using a timeout, then receive each with xQueueReceive() using a timeout, checking return values each time

Solution

  1. Step 1: Understand queue data handling

    Queues handle one item at a time, so each integer must be sent individually with xQueueSend().
  2. Step 2: Properly receive data

    Each item must be received individually with xQueueReceive(), checking return values to avoid errors or data loss.
  3. Step 3: Eliminate incorrect options

    Send all integers at once by passing an array pointer to xQueueSend(), then receive with one xQueueReceive() is wrong because queues do not send arrays as single items. Send integers without checking return values, then receive once expecting all data risks data loss by ignoring return values. Use xQueueReceive() to send data and xQueueSend() to receive data reverses function roles.
  4. Final Answer:

    Send each integer with xQueueSend() using a timeout, then receive each with xQueueReceive() using a timeout, checking return values each time -> Option D
  5. Quick Check:

    Send and receive items one by one, check returns [OK]
Hint: Send and receive items individually, always check returns [OK]
Common Mistakes:
  • Trying to send multiple items at once
  • Ignoring return values causing lost data
  • Mixing up send and receive functions
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