Basic example showing the CMSIS-RTOS queue and memory pool API

Dependencies:   mbed mbed-rtos

mbed 2 and mbed OS 5

This is an mbed 2 example. mbed OS 5 has integrated the mbed library with mbed-rtos. For an mbed-os example, please see:

Import programrtos_queue

queue example

Revision:
1:85e3058aad0f
Parent:
0:2fa481f0d15a
Child:
2:54e171ca91a6
--- a/main.cpp	Fri Jul 13 14:55:02 2012 +0000
+++ b/main.cpp	Fri Jul 13 14:57:51 2012 +0000
@@ -0,0 +1,48 @@
+#include "mbed.h"
+#include "cmsis_os.h"
+
+typedef struct {
+    float    voltage;   /* AD result of measured voltage */
+    float    current;   /* AD result of measured current */
+    uint32_t counter;   /* A counter value               */
+} message_t;
+
+osPoolDef(mpool, 16, message_t);
+osPoolId  mpool;
+
+osMessageQDef(queue, 16, message_t);
+osMessageQId  queue;
+
+void send_thread (void const *argument) {
+    uint32_t i = 0;
+    while (true) {
+        i++; // fake data update
+        message_t *message = (message_t*)osPoolAlloc(mpool);
+        message->voltage = (i * 0.1) * 33; 
+        message->current = (i * 0.1) * 11;
+        message->counter = i;
+        osMessagePut(queue, (uint32_t)message, osWaitForever);
+        osDelay(1000);
+    }
+}
+
+osThreadDef(send_thread, osPriorityNormal, DEFAULT_STACK_SIZE);
+
+int main (void) {
+    mpool = osPoolCreate(osPool(mpool));
+    queue = osMessageCreate(osMessageQ(queue), NULL);
+    
+    osThreadCreate(osThread(send_thread), NULL);
+    
+    while (true) {
+        osEvent evt = osMessageGet(queue, osWaitForever);
+        if (evt.status == osEventMessage) {
+            message_t *message = (message_t*)evt.value.p;
+            printf("\nVoltage: %.2f V\n\r"   , message->voltage);
+            printf("Current: %.2f A\n\r"     , message->current);
+            printf("Number of cycles: %u\n\r", message->counter);
+            
+            osPoolFree(mpool, message);
+        }
+    }
+}