0
0
FreeRTOSprogramming~30 mins

xTaskNotifyGive() as lightweight semaphore in FreeRTOS - Mini Project: Build & Apply

Choose your learning style9 modes available
Using xTaskNotifyGive() as a Lightweight Semaphore in FreeRTOS
📖 Scenario: You are working on a FreeRTOS embedded system where two tasks need to synchronize access to a shared resource. Instead of using a full semaphore, you want to use xTaskNotifyGive() and ulTaskNotifyTake() as a lightweight semaphore to signal between tasks.
🎯 Goal: Build a simple FreeRTOS program where one task signals another task using xTaskNotifyGive() as a lightweight semaphore. The second task waits for the notification using ulTaskNotifyTake() before proceeding.
📋 What You'll Learn
Create two tasks: Task1 and Task2
Use xTaskNotifyGive() in Task1 to notify Task2
Use ulTaskNotifyTake() in Task2 to wait for the notification
Print messages to indicate when Task2 is waiting and when it receives the notification
💡 Why This Matters
🌍 Real World
Lightweight task synchronization is common in embedded systems where resources are limited and tasks need to signal events efficiently.
💼 Career
Understanding task notifications as lightweight semaphores is valuable for embedded software engineers working with FreeRTOS or similar real-time operating systems.
Progress0 / 4 steps
1
Create two FreeRTOS tasks named Task1 and Task2
Write code to create two tasks called Task1 and Task2 using xTaskCreate(). Use the function prototypes void Task1(void *pvParameters) and void Task2(void *pvParameters). Use stack size 1000 and priority 1 for both tasks.
FreeRTOS
Need a hint?

Use xTaskCreate() twice, once for each task, with the exact names Task1 and Task2.

2
Add a notification counter variable for Task2
Declare a variable called ulNotificationValue of type uint32_t inside Task2 to hold the notification count returned by ulTaskNotifyTake().
FreeRTOS
Need a hint?

Inside Task2, declare uint32_t ulNotificationValue; before the infinite loop.

3
Use xTaskNotifyGive() in Task1 and ulTaskNotifyTake() in Task2
Inside Task1, call xTaskNotifyGive() to notify Task2 every 2 seconds. Inside Task2, use ulTaskNotifyTake(pdTRUE, portMAX_DELAY) to wait for the notification and store the result in ulNotificationValue. Remove the vTaskDelay() calls inside both tasks.
FreeRTOS
Need a hint?

Use xTaskNotifyGive(xTask2Handle); in Task1 and ulNotificationValue = ulTaskNotifyTake(pdTRUE, portMAX_DELAY); in Task2.

4
Print messages in Task2 to show waiting and notification received
Inside Task2, before calling ulTaskNotifyTake(), print "Task2 waiting for notification...". After receiving the notification (when ulNotificationValue is greater than 0), print "Task2 received notification!".
FreeRTOS
Need a hint?

Use printf("Task2 waiting for notification...\n"); before ulTaskNotifyTake() and printf("Task2 received notification!\n"); after checking ulNotificationValue > 0.