Simple example to use a Mail object in order to send complex messages from thread1 to thread2. Thread1 generates transition between random RGB colors and sends messages to Thread2. Thread2 displays the requested color on the built in RGB LED. Data items for messages are stored in a Mail object. Thread1 allocates mailbox slots, Thread2 should free up these slots after using up data stored in the slot.

Dependencies:   mbed-rtos mbed

Files at this revision

API Documentation at this revision

Comitter:
icserny
Date:
Wed Feb 24 10:33:52 2016 +0000
Parent:
0:2a0e4f8a7b76
Commit message:
First version

Changed in this revision

main.cpp Show annotated file Show diff for this revision Revisions of this file
diff -r 2a0e4f8a7b76 -r 5ea1c9f5f9f1 main.cpp
--- a/main.cpp	Tue Feb 23 13:32:14 2016 +0000
+++ b/main.cpp	Wed Feb 24 10:33:52 2016 +0000
@@ -1,13 +1,13 @@
-/** 10_rtos_mempool
+/** 10_rtos_mailbox
  *
- * Simple example to use a Mempool object together with a Queue
- * object in order to send more complex messages from thread1 to thread2.
+ * Simple example to use a Mail object in order to send 
+ * complex messages from thread1 to thread2.
  * Thread1 generates transition between random RGB colors and sends
  * messages to Thread2. Thread2 displays the requested color on the
  * built in RGB LED.
  *
- * Data items for messages are stored in a MemoryPool object.
- * Thread1 allocates MemoryPool slots, Thread2 should free up
+ * Data items for messages are stored in a Mail object.
+ * Thread1 allocates mailbox slots, Thread2 should free up
  * these slots after using up data stored in the slot.
  */
 
@@ -23,8 +23,8 @@
     float blue;
 } message_t;
 
-MemoryPool<message_t, 4> mpool;                     //Memory pool for data storage
-Queue<message_t, 4> queue;                          //Message queue for 4 items
+Mail<message_t, 4> mbox;                            //Mailboxes for 4 messages
+
 
 void led_thread(void const *argument)
 {
@@ -35,21 +35,21 @@
     bled.period_ms(20);                             //Set period to 20 ms
     bled.write(1.0f);                               //Initialize to 0% duty cycle
     while (true) {
-        osEvent evt = queue.get();                  //Wait for a message
-        if(evt.status == osEventMessage) {
+        osEvent evt = mbox.get();                   //Wait for a message
+        if(evt.status == osEventMail) {
             message_t *mymessage = (message_t*)evt.value.p;
             rled = 1.0f - mymessage->red;
             gled = 1.0f - mymessage->green;
             bled = 1.0f - mymessage->blue;
-            mpool.free(mymessage);                  //Free up memory
+            mbox.free(mymessage);                  //Free up memory
         }
     }
 }
 
 float frand(void)
 {
-    float rv = (float)(rand()&0xFFFF);
-    return (rv/65536.0f);
+    int32_t rv = 0x8000 -(rand()&0xFFFF);
+    return (rv*rv/1073741824.0f);
 }
 
 int main (void)
@@ -74,11 +74,11 @@
         }       
 //--- Send color codes to thread2 ---------------
         for (int s=0; s<25; s++) {
-            message_t *message = mpool.alloc();     //Allocate memory
+            message_t *message = mbox.alloc();      //Allocate memory
             message->red = RGB1[0];
             message->green = RGB1[1];
             message->blue = RGB1[2];
-            queue.put(message);                     //Send data as message
+            mbox.put(message);                      //Send data as message
             Thread::wait(100);
             for (int x=0; x<3; x++) {
                 RGB1[x] -= INC[x];                  //Approach to second colour