Concept Flow - Producer-consumer pattern
Producer Task
Produce Data
Send to Queue
Consumer Task
Receive from Queue
Consume Data
Repeat
The producer creates data and sends it to a queue. The consumer waits for data from the queue and processes it.
void producer(void *pvParameters) {
int count = 0;
while(1) {
xQueueSend(queue, &count, portMAX_DELAY);
count++;
}
}
void consumer(void *pvParameters) {
int received;
while(1) {
xQueueReceive(queue, &received, portMAX_DELAY);
// process received
}
}| Step | Task | Action | Queue State | Data Sent/Received | Output |
|---|---|---|---|---|---|
| 1 | Producer | Produce 0 | [] | 0 | |
| 2 | Producer | Send 0 to queue | [0] | 0 | |
| 3 | Consumer | Receive from queue | [] | 0 | Process 0 |
| 4 | Producer | Produce 1 | [] | 1 | |
| 5 | Producer | Send 1 to queue | [1] | 1 | |
| 6 | Consumer | Receive from queue | [] | 1 | Process 1 |
| 7 | Producer | Produce 2 | [] | 2 | |
| 8 | Producer | Send 2 to queue | [2] | 2 | |
| 9 | Consumer | Receive from queue | [] | 2 | Process 2 |
| 10 | Producer | Produce 3 | [] | 3 | |
| 11 | Producer | Send 3 to queue | [3] | 3 | |
| 12 | Consumer | Receive from queue | [] | 3 | Process 3 |
| 13 | Exit | Stop after 4 cycles | [] | End of trace |
| Variable | Start | After 1 | After 2 | After 3 | After 4 | Final |
|---|---|---|---|---|---|---|
| count (Producer) | 0 | 1 | 2 | 3 | 4 | 4 |
| received (Consumer) | N/A | 0 | 1 | 2 | 3 | 3 |
| queue | empty | [0] | empty | [1] | empty | empty |
Producer-consumer pattern in FreeRTOS: - Producer task creates data and sends it to a queue. - Consumer task waits and receives data from the queue. - Use xQueueSend and xQueueReceive for communication. - Consumer blocks if queue empty; producer blocks if queue full. - Ensures safe data exchange between tasks.