Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
main.cpp
00001 #include "mbed.h" 00002 00003 typedef struct { 00004 int value; 00005 } message_t; 00006 const int queue_size = 10; 00007 MemoryPool<message_t, queue_size> mpool; 00008 Queue<message_t, queue_size> queue; 00009 int elements_num = 0; 00010 00011 Mutex mutex; 00012 ConditionVariable cond(mutex); 00013 InterruptIn button(USER_BUTTON); 00014 bool is_button_pressed = false; 00015 00016 Thread t1; 00017 Thread t2; 00018 Thread t3; 00019 00020 void start_producer(){ 00021 00022 while (true) 00023 { 00024 wait(rand()%3); 00025 mutex.lock(); 00026 int value = rand(); 00027 while(elements_num == queue_size) { 00028 printf("The queue is full, cannot put.\n"); 00029 cond.wait(); 00030 } 00031 message_t *message = mpool.alloc(); 00032 message->value = value; 00033 queue.put(message); 00034 elements_num++; 00035 printf("PRODUCER: Put value %d \n", message->value); 00036 cond.notify_all(); 00037 mutex.unlock(); 00038 } 00039 } 00040 00041 void start_consumer(){ 00042 while (true) 00043 { 00044 wait(rand()%10); 00045 mutex.lock(); 00046 while(elements_num == 0) { 00047 printf("The queue is empty. Nothing to consume.\n"); 00048 cond.wait(); 00049 } 00050 osEvent evt = queue.get(); 00051 elements_num--; 00052 if (evt.status == osEventMessage) { 00053 message_t *message = (message_t*)evt.value.p; 00054 printf("CONSUMER: I got %d\n", message->value); 00055 mpool.free(message); 00056 } 00057 cond.notify_all(); 00058 mutex.unlock(); 00059 } 00060 } 00061 00062 void toggle (){ 00063 is_button_pressed = true; 00064 } 00065 00066 void print_status(){ 00067 while (true) { 00068 if(is_button_pressed){ 00069 mutex.lock(); 00070 wait(2); 00071 printf("\n\nThere are %d elements in the queue\n\n", elements_num); 00072 wait(2); 00073 mutex.unlock(); 00074 is_button_pressed = false; 00075 } 00076 } 00077 } 00078 00079 int main() { 00080 button.rise(&toggle); 00081 t1.start(&start_producer); 00082 t2.start(&start_consumer); 00083 t3.start(&print_status); 00084 }
Generated on Sat Jul 16 2022 02:10:04 by
1.7.2