Bird
Raised Fist0
FreeRTOSprogramming~10 mins

xTaskNotify() with value in FreeRTOS - Step-by-Step Execution

Choose your learning style10 modes available
Concept Flow - xTaskNotify() with value
Task A calls xTaskNotify() with value
↓
Kernel stores notification value for Task B
↓
Task B unblocked or notified
↓
Task B reads notification value
↓
Task B processes notification
↓
Notification cleared or updated
Task A sends a notification with a value to Task B, which then receives and processes it.
Execution Sample
FreeRTOS
xTaskNotify(taskBHandle, 42, eSetValueWithOverwrite);
// Task B waits and reads notification value
uint32_t value;
xTaskNotifyWait(0, 0xffffffffUL, &value, portMAX_DELAY);
Task A sends value 42 to Task B using xTaskNotify(), Task B waits and receives the value.
Execution Table
StepActionTask A StateTask B StateNotification ValueResult
1Task A calls xTaskNotify(taskBHandle, 42, eSetValueWithOverwrite)RunningBlocked (waiting)NoneNotification value 42 stored for Task B
2Kernel unblocks Task BReadyReady42Task B ready to run with notification
3Task B returns from xTaskNotifyWait(0, 0xffffffffUL, &value, portMAX_DELAY)ReadyRunning42Task B reads notification value 42
4Notification cleared after readReadyRunningNoneNotification cleared for Task B
5Task B processes value 42ReadyRunningNoneTask B uses notification value
6No further notificationsReadyRunningNoneExecution continues normally
💡 No more notifications sent; Task B continues running after processing value
Variable Tracker
VariableStartAfter Step 1After Step 3After Step 4Final
Notification ValueNone4242NoneNone
Task A StateReadyRunningReadyReadyReady
Task B StateBlockedBlockedRunningRunningRunning
value (in Task B)UndefinedUndefined424242
Key Moments - 3 Insights
Why does Task B get unblocked after Task A calls xTaskNotify()?
Because xTaskNotify() sends a notification to Task B, the kernel unblocks Task B so it can process the notification, as shown in execution_table step 2.
What happens to the notification value after Task B reads it with xTaskNotifyWait()?
The notification value is cleared after Task B reads it, so it doesn't remain set, as shown in execution_table step 4.
Can Task A overwrite the notification value if it calls xTaskNotify() again before Task B reads it?
Yes, using eSetValueWithOverwrite allows Task A to overwrite the previous notification value before Task B reads it.
Visual Quiz - 3 Questions
Test your understanding
Look at the execution_table, what is the notification value stored for Task B immediately after Task A calls xTaskNotify()?
A42
BNone
C0
DUndefined
💡 Hint
Check execution_table row 1 under 'Notification Value'
At which step does Task B read the notification value?
AStep 2
BStep 4
CStep 3
DStep 5
💡 Hint
Look at execution_table rows and find when Task B returns from xTaskNotifyWait()
If Task A calls xTaskNotify() twice with eSetValueWithOverwrite before Task B reads, what happens to the notification value?
AThe first value is kept, second ignored
BThe notification value is overwritten with the second value
CTask B receives both values separately
DNotification value is cleared
💡 Hint
Refer to key_moments about eSetValueWithOverwrite behavior
Concept Snapshot
xTaskNotify(taskHandle, value, action) sends a notification with a value to a task.
The notified task can wait and read the value using xTaskNotifyWait().
Using eSetValueWithOverwrite overwrites previous notification values.
Notification unblocks the task if it was waiting.
After reading, the notification value is cleared.
Full Transcript
This visual execution shows how xTaskNotify() sends a value from one task to another in FreeRTOS. Task A calls xTaskNotify() with a value and an action to overwrite. The kernel stores this value and unblocks Task B if it was waiting. Task B then calls xTaskNotifyWait() to receive the value. After reading, the notification is cleared. This process allows tasks to communicate simple data efficiently. The execution table tracks each step, showing task states and notification values. Key moments clarify why tasks unblock and how values are handled. The quiz tests understanding of notification timing and overwriting behavior.

Practice

(1/5)
1.

What does the xTaskNotify() function primarily do in FreeRTOS?

easy
A. Creates a new task in the system
B. Deletes a task from the scheduler
C. Sends a notification value from one task to another
D. Suspends the current task indefinitely

Solution

  1. Step 1: Understand the purpose of xTaskNotify()

    The function is designed to send a notification value or signal from one task to another in FreeRTOS.
  2. Step 2: Compare with other task functions

    Creating, deleting, or suspending tasks are done by other FreeRTOS functions, not xTaskNotify().
  3. Final Answer:

    Sends a notification value from one task to another -> Option C
  4. Quick Check:

    xTaskNotify() sends notification value [OK]
Hint: Remember: xTaskNotify() sends signals between tasks [OK]
Common Mistakes:
  • Confusing xTaskNotify() with task creation functions
  • Thinking it suspends or deletes tasks
  • Assuming it handles task priorities
2.

Which of the following is the correct syntax to send a notification with a value using xTaskNotify()?

BaseType_t xTaskNotify( TaskHandle_t xTaskToNotify, uint32_t ulValue, eNotifyAction eAction );
easy
A. xTaskNotify(taskHandle, 10, eSetBits);
B. xTaskNotify(10, taskHandle, eSetValueWithOverwrite);
C. xTaskNotify(taskHandle, eSetValueWithoutOverwrite, 10);
D. xTaskNotify(eSetValueWithOverwrite, taskHandle, 10);

Solution

  1. Step 1: Identify parameter order in xTaskNotify()

    The correct order is: TaskHandle_t, uint32_t value, eNotifyAction.
  2. Step 2: Match options to correct order

    xTaskNotify(taskHandle, 10, eSetBits); matches the correct order: taskHandle, 10, eSetBits. Others mix parameter order incorrectly.
  3. Final Answer:

    xTaskNotify(taskHandle, 10, eSetBits); -> Option A
  4. Quick Check:

    Correct parameter order: task, value, action [OK]
Hint: Remember parameter order: task, value, action [OK]
Common Mistakes:
  • Swapping value and task handle parameters
  • Using wrong enum for eNotifyAction
  • Passing parameters in wrong order
3.

Consider the following code snippet:

uint32_t notifiedValue = 0;

// Task A sends notification
xTaskNotify(taskBHandle, 0x04, eSetBits);

// Task B waits for notification
xTaskNotifyWait(0x00, 0xFFFFFFFF, ¬ifiedValue, portMAX_DELAY);

// What is the value of notifiedValue after notification?
medium
A. 0x04
B. 0x00
C. 0xFFFFFFFF
D. Undefined

Solution

  1. Step 1: Understand eSetBits action

    eSetBits sets bits in the notification value. Since initial is 0, setting bit 0x04 results in notifiedValue = 0x04.
  2. Step 2: Check xTaskNotifyWait parameters

    It clears bits 0x00 (none) and waits indefinitely, storing the notified bits in notifiedValue.
  3. Final Answer:

    0x04 -> Option A
  4. Quick Check:

    eSetBits sets bits = 0x04 [OK]
Hint: eSetBits adds bits to notified value [OK]
Common Mistakes:
  • Assuming notifiedValue remains zero
  • Confusing eSetBits with eSetValueWithoutOverwrite
  • Ignoring the effect of xTaskNotifyWait
4.

Identify the error in the following code snippet using xTaskNotify():

BaseType_t status;
status = xTaskNotify(NULL, 5, eSetValueWithOverwrite);
if(status == pdPASS) {
    // Notification sent
}
medium
A. Missing return statement in function
B. Using eSetValueWithOverwrite is invalid
C. Notification value must be zero
D. Passing NULL as task handle causes error

Solution

  1. Step 1: Check task handle parameter

    xTaskNotify requires a valid task handle; NULL is invalid and causes failure.
  2. Step 2: Validate other parameters

    eSetValueWithOverwrite and value 5 are valid; no return statement needed here.
  3. Final Answer:

    Passing NULL as task handle causes error -> Option D
  4. Quick Check:

    Task handle NULL invalid [OK]
Hint: Task handle must never be NULL [OK]
Common Mistakes:
  • Passing NULL as task handle
  • Thinking notification value must be zero
  • Confusing eNotifyAction enums
5.

You want to send a notification value from Task A to Task B, but only if Task B's current notification value is zero. Which eNotifyAction should you use with xTaskNotify() to achieve this?

hard
A. eSetValueWithOverwrite
B. eSetValueWithoutOverwrite
C. eIncrement
D. eNoAction

Solution

  1. Step 1: Understand eNotifyAction options

    eSetValueWithoutOverwrite sets the notification value only if it is currently zero.
  2. Step 2: Compare with other actions

    eSetValueWithOverwrite always overwrites; eIncrement adds 1; eNoAction sends no value.
  3. Final Answer:

    eSetValueWithoutOverwrite -> Option B
  4. Quick Check:

    Set only if zero = eSetValueWithoutOverwrite [OK]
Hint: Use eSetValueWithoutOverwrite to avoid overwriting [OK]
Common Mistakes:
  • Using eSetValueWithOverwrite and overwriting value
  • Choosing eIncrement which changes value incorrectly
  • Selecting eNoAction which sends no value
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