Lucas Pennati / Mbed OS ProducerConsumer
Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 #include "mbed.h"
00002 
00003 #define QUEUE_MAX_SIZE 32
00004 
00005 typedef struct {
00006     int count;
00007 } message_t;
00008 
00009 Queue<message_t, QUEUE_MAX_SIZE> queue;
00010 Mutex mutex;
00011 ConditionVariable cond(mutex);
00012 
00013 int queue_size = 0;
00014 
00015 
00016 void consumer_thread() {
00017     while(true) {
00018         int wait_time = rand() % 5;
00019         printf("Consumer - Waiting %d seconds\n", wait_time);
00020         wait(wait_time);
00021         if (queue_size > 0) {
00022             printf("Consumer - Queue is not empty, getting message\n");
00023             // Acquire the lock
00024             mutex.lock();
00025             // Decrease the size of the queue
00026             queue_size--;
00027             // Get the message
00028             osEvent evt = queue.get();
00029             // Extract the actual payload
00030             if (evt.status == osEventMessage) {
00031                 message_t *message = (message_t *) evt.value.p;
00032                 printf("Consumer - Got message with payload %d\n", message->count);
00033             }
00034             // Notify
00035             cond.notify_all();
00036             
00037             // Unlock the mutex
00038             mutex.unlock();
00039         } else {
00040             printf("Consumer - Queue is empty! waiting for producer\n");
00041         }
00042     }
00043 }
00044 
00045 
00046 int main() {
00047     Thread consumer;
00048     consumer.start(consumer_thread);
00049     
00050         
00051     while(1) {
00052         // Random wait time
00053         int wait_time = rand() % 5;
00054         printf("Producer - Waiting %d seconds\n", wait_time);
00055         wait(wait_time);
00056         if (queue_size < QUEUE_MAX_SIZE) {
00057             // Acquire the lock
00058             mutex.lock();
00059             
00060             // Increase the count
00061             queue_size++;
00062             
00063             // create a new message
00064             message_t *message;
00065             message->count = queue_size;
00066             
00067             // Add it to the queue
00068             queue.put(message);
00069             
00070             printf("Producer - Added message to queue with payload %d\n", queue_size);
00071             
00072             // Notify all 
00073             cond.notify_all();
00074             
00075             // Unlock the mutex
00076             mutex.unlock();
00077         } else {
00078             printf("Producer - Queue is full! waiting for consumer\n");
00079         }
00080     }
00081 }