Bird
Raised Fist0
FreeRTOSprogramming~20 mins

Queue from ISR (xQueueSendFromISR) in FreeRTOS - Practice Problems & Coding Challenges

Choose your learning style10 modes available
Challenge - 5 Problems
🎖️
Queue ISR Master
Get all challenges correct to earn this badge!
Test your skills under time pressure!
❓ Predict Output
intermediate
2:00remaining
Output of xQueueSendFromISR with full queue
What will be the output of the following code snippet when the queue is already full?
FreeRTOS
#include "FreeRTOS.h"
#include "queue.h"
#include <stdio.h>

QueueHandle_t queue;
BaseType_t xHigherPriorityTaskWoken = pdFALSE;

void ISR_Handler() {
    int value = 10;
    BaseType_t result = xQueueSendFromISR(queue, &value, &xHigherPriorityTaskWoken);
    if(result == pdPASS) {
        printf("Sent\n");
    } else {
        printf("Failed\n");
    }
}

int main() {
    queue = xQueueCreate(1, sizeof(int));
    int initial = 5;
    xQueueSend(queue, &initial, 0); // Fill the queue
    ISR_Handler();
    return 0;
}
AFailed
BNo output
CCompilation error
DSent
Attempts:
2 left
💡 Hint
Think about what happens when you try to send to a full queue from an ISR.
🧠 Conceptual
intermediate
1:30remaining
Understanding the xHigherPriorityTaskWoken parameter
What is the purpose of the xHigherPriorityTaskWoken parameter in xQueueSendFromISR?
AIt indicates if a higher priority task was woken by the send operation.
BIt sets the priority of the task sending the data.
CIt disables interrupts during the send operation.
DIt specifies the maximum queue length.
Attempts:
2 left
💡 Hint
Consider what happens if sending to the queue unblocks a higher priority task.
🔧 Debug
advanced
2:00remaining
Why does xQueueSendFromISR cause a runtime error?
Given this ISR code snippet, why does the system crash at runtime? void ISR_Handler() { int value = 20; BaseType_t result = xQueueSendFromISR(NULL, &value, NULL); if(result == pdPASS) { // do something } }
AxQueueSendFromISR cannot be called from an ISR.
BPassing NULL as the queue handle causes a null pointer dereference.
CThe value pointer must be volatile.
DxQueueSendFromISR requires a non-NULL xHigherPriorityTaskWoken pointer.
Attempts:
2 left
💡 Hint
Check the parameters passed to xQueueSendFromISR carefully.
📝 Syntax
advanced
1:30remaining
Identify the syntax error in xQueueSendFromISR usage
Which option contains a syntax error in the usage of xQueueSendFromISR?
FreeRTOS
QueueHandle_t queue = xQueueCreate(5, sizeof(int));
int data = 42;
BaseType_t xHigherPriorityTaskWoken = pdFALSE;
A;)nekoWksaTytiroirPrehgiHx& ,atad& ,eueuq(RSImorFdneSeueuQx
BxQueueSendFromISR(queue, &data, &xHigherPriorityTaskWoken);
CxQueueSendFromISR(queue, &data, NULL);
DxQueueSendFromISR(queue, data, &xHigherPriorityTaskWoken);
Attempts:
2 left
💡 Hint
Check the type of the second argument expected by xQueueSendFromISR.
🚀 Application
expert
2:30remaining
Determining the number of items in the queue after ISR sends
Assume a queue of length 3 is initially empty. The following ISR is called three times in quick succession without the main task removing items: void ISR_Handler() { static int count = 0; BaseType_t xHigherPriorityTaskWoken = pdFALSE; xQueueSendFromISR(queue, &count, &xHigherPriorityTaskWoken); count++; } After these three ISR calls, how many items are in the queue?
A2
B1
C3
D0
Attempts:
2 left
💡 Hint
Consider if the queue can hold all three items without removal.

Practice

(1/5)
1.

What is the primary purpose of xQueueSendFromISR() in FreeRTOS?

easy
A. To send data to a queue safely from an interrupt service routine (ISR)
B. To create a new queue in the system
C. To delete a queue from an ISR
D. To block a task until data is received

Solution

  1. Step 1: Understand the function context

    xQueueSendFromISR() is designed to be called inside an ISR, where normal queue functions that can block are unsafe.
  2. Step 2: Identify the function's role

    It safely sends data to a queue without blocking, allowing communication from ISR to tasks.
  3. Final Answer:

    To send data to a queue safely from an interrupt service routine (ISR) -> Option A
  4. Quick Check:

    Purpose of xQueueSendFromISR = safe queue send from ISR [OK]
Hint: Remember: xQueueSendFromISR is for sending data inside interrupts [OK]
Common Mistakes:
  • Confusing it with queue creation or deletion
  • Thinking it blocks the ISR
  • Using normal queue send functions inside ISR
2.

Which of the following is the correct way to call xQueueSendFromISR()?

BaseType_t xQueueSendFromISR(QueueHandle_t xQueue, const void * pvItemToQueue, BaseType_t *pxHigherPriorityTaskWoken);
easy
A. xQueueSendFromISR(queue, data, NULL);
B. xQueueSendFromISR(queue, &data, NULL);
C. xQueueSendFromISR(&queue, &data, NULL);
D. xQueueSendFromISR(queue, &data);

Solution

  1. Step 1: Check parameter types

    The function expects a queue handle, a pointer to the data, and a pointer to a BaseType_t variable for task wake flag.
  2. Step 2: Match correct call

    xQueueSendFromISR(queue, &data, NULL); passes the queue handle, address of data, and NULL for the last parameter, which is valid if you don't care about task wake.
  3. Final Answer:

    xQueueSendFromISR(queue, &data, NULL); -> Option B
  4. Quick Check:

    Correct parameters and pointers used = xQueueSendFromISR(queue, &data, NULL); [OK]
Hint: Always pass data address and pxHigherPriorityTaskWoken pointer [OK]
Common Mistakes:
  • Passing data instead of its address
  • Passing queue address instead of handle
  • Omitting the third parameter
3.

Given the following code snippet inside an ISR, what will be the value of result after execution?

BaseType_t xHigherPriorityTaskWoken = pdFALSE;
int data = 10;
BaseType_t result = xQueueSendFromISR(myQueue, &data, &xHigherPriorityTaskWoken);

Assume myQueue has space available.

medium
A. pdFAIL (0)
B. pdFALSE (0)
C. pdTRUE (1)
D. pdPASS (1)

Solution

  1. Step 1: Understand return values of xQueueSendFromISR

    The function returns pdPASS (1) if the item was successfully sent to the queue, pdFAIL (0) otherwise.
  2. Step 2: Analyze queue state

    Since myQueue has space, the send will succeed, so result will be pdPASS (1).
  3. Final Answer:

    pdPASS (1) -> Option D
  4. Quick Check:

    Queue has space, send success = pdPASS (1) [OK]
Hint: If queue has space, xQueueSendFromISR returns pdPASS (1) [OK]
Common Mistakes:
  • Confusing pdPASS with pdTRUE
  • Assuming it returns pdFALSE on success
  • Ignoring queue capacity
4.

Identify the error in this ISR code snippet using xQueueSendFromISR():

void ISR_Handler(void) {
    int value = 5;
    BaseType_t xHigherPriorityTaskWoken;
    xQueueSendFromISR(myQueue, &value, &xHigherPriorityTaskWoken);
    if(xHigherPriorityTaskWoken) {
        portYIELD_FROM_ISR();
    }
}
medium
A. value should be a pointer, not an int
B. portYIELD_FROM_ISR() is called incorrectly
C. xHigherPriorityTaskWoken is not initialized before use
D. xQueueSendFromISR() cannot be called inside ISR

Solution

  1. Step 1: Check variable initialization

    xHigherPriorityTaskWoken must be initialized to pdFALSE before calling xQueueSendFromISR() to avoid unpredictable behavior.
  2. Step 2: Verify other parts

    Calling portYIELD_FROM_ISR() conditionally is correct; value is passed by address; calling xQueueSendFromISR() inside ISR is valid.
  3. Final Answer:

    xHigherPriorityTaskWoken is not initialized before use -> Option C
  4. Quick Check:

    Initialize xHigherPriorityTaskWoken = pdFALSE before use [OK]
Hint: Always init xHigherPriorityTaskWoken to pdFALSE before sending [OK]
Common Mistakes:
  • Not initializing xHigherPriorityTaskWoken
  • Misusing portYIELD_FROM_ISR
  • Passing data incorrectly
5.

You want to send multiple sensor readings from an ISR to a task using xQueueSendFromISR(). Which approach correctly ensures the task runs immediately if it has higher priority?

void SensorISR(void) {
    static int sensorData = 0;
    BaseType_t xHigherPriorityTaskWoken = pdFALSE;
    sensorData++;
    xQueueSendFromISR(sensorQueue, &sensorData, &xHigherPriorityTaskWoken);
    // What should be done here?
}
hard
A. Call portYIELD_FROM_ISR(xHigherPriorityTaskWoken); after sending
B. Call vTaskDelay(1); inside the ISR
C. Call taskYIELD(); inside the ISR unconditionally
D. Do nothing; the task will run eventually

Solution

  1. Step 1: Understand task wake mechanism

    After sending data from ISR, if a higher priority task was woken, you must request a context switch immediately.
  2. Step 2: Use correct yield function

    portYIELD_FROM_ISR(xHigherPriorityTaskWoken); triggers a context switch only if needed, which is the correct approach.
  3. Final Answer:

    Call portYIELD_FROM_ISR(xHigherPriorityTaskWoken); after sending -> Option A
  4. Quick Check:

    Use portYIELD_FROM_ISR with xHigherPriorityTaskWoken to yield [OK]
Hint: Use portYIELD_FROM_ISR with flag to yield only if needed [OK]
Common Mistakes:
  • Calling blocking functions like vTaskDelay in ISR
  • Calling taskYIELD unconditionally inside ISR
  • Ignoring portYIELD_FROM_ISR call
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