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

Committer:
emilmont
Date:
Fri Nov 23 10:58:19 2012 +0000
Revision:
2:54e171ca91a6
Parent:
1:85e3058aad0f
update libraries

Who changed what in which revision?

UserRevisionLine numberNew contents of line
emilmont 1:85e3058aad0f 1 #include "mbed.h"
emilmont 1:85e3058aad0f 2 #include "cmsis_os.h"
emilmont 1:85e3058aad0f 3
emilmont 1:85e3058aad0f 4 typedef struct {
emilmont 1:85e3058aad0f 5 float voltage; /* AD result of measured voltage */
emilmont 1:85e3058aad0f 6 float current; /* AD result of measured current */
emilmont 1:85e3058aad0f 7 uint32_t counter; /* A counter value */
emilmont 1:85e3058aad0f 8 } message_t;
emilmont 1:85e3058aad0f 9
emilmont 1:85e3058aad0f 10 osPoolDef(mpool, 16, message_t);
emilmont 1:85e3058aad0f 11 osPoolId mpool;
emilmont 1:85e3058aad0f 12
emilmont 1:85e3058aad0f 13 osMessageQDef(queue, 16, message_t);
emilmont 1:85e3058aad0f 14 osMessageQId queue;
emilmont 1:85e3058aad0f 15
emilmont 2:54e171ca91a6 16 void send_thread (void const *args) {
emilmont 1:85e3058aad0f 17 uint32_t i = 0;
emilmont 1:85e3058aad0f 18 while (true) {
emilmont 1:85e3058aad0f 19 i++; // fake data update
emilmont 1:85e3058aad0f 20 message_t *message = (message_t*)osPoolAlloc(mpool);
emilmont 1:85e3058aad0f 21 message->voltage = (i * 0.1) * 33;
emilmont 1:85e3058aad0f 22 message->current = (i * 0.1) * 11;
emilmont 1:85e3058aad0f 23 message->counter = i;
emilmont 1:85e3058aad0f 24 osMessagePut(queue, (uint32_t)message, osWaitForever);
emilmont 1:85e3058aad0f 25 osDelay(1000);
emilmont 1:85e3058aad0f 26 }
emilmont 1:85e3058aad0f 27 }
emilmont 1:85e3058aad0f 28
emilmont 1:85e3058aad0f 29 osThreadDef(send_thread, osPriorityNormal, DEFAULT_STACK_SIZE);
emilmont 1:85e3058aad0f 30
emilmont 1:85e3058aad0f 31 int main (void) {
emilmont 1:85e3058aad0f 32 mpool = osPoolCreate(osPool(mpool));
emilmont 1:85e3058aad0f 33 queue = osMessageCreate(osMessageQ(queue), NULL);
emilmont 1:85e3058aad0f 34
emilmont 1:85e3058aad0f 35 osThreadCreate(osThread(send_thread), NULL);
emilmont 1:85e3058aad0f 36
emilmont 1:85e3058aad0f 37 while (true) {
emilmont 1:85e3058aad0f 38 osEvent evt = osMessageGet(queue, osWaitForever);
emilmont 1:85e3058aad0f 39 if (evt.status == osEventMessage) {
emilmont 1:85e3058aad0f 40 message_t *message = (message_t*)evt.value.p;
emilmont 1:85e3058aad0f 41 printf("\nVoltage: %.2f V\n\r" , message->voltage);
emilmont 1:85e3058aad0f 42 printf("Current: %.2f A\n\r" , message->current);
emilmont 1:85e3058aad0f 43 printf("Number of cycles: %u\n\r", message->counter);
emilmont 1:85e3058aad0f 44
emilmont 1:85e3058aad0f 45 osPoolFree(mpool, message);
emilmont 1:85e3058aad0f 46 }
emilmont 1:85e3058aad0f 47 }
emilmont 1:85e3058aad0f 48 }