Learn how to use embedded RTOS (Beta version RTOS)

Dependencies:   mbed-rtos mbed

Committer:
leonardoaraujosantos
Date:
Thu Sep 03 22:35:15 2015 +0000
Revision:
2:daaf6b6ad568
Parent:
1:4d067c712d03
Adding periodic timer

Who changed what in which revision?

UserRevisionLine numberNew contents of line
leonardoaraujosantos 0:5bd42710f2e7 1 #include "mbed.h"
leonardoaraujosantos 0:5bd42710f2e7 2 #include "rtos.h"
leonardoaraujosantos 0:5bd42710f2e7 3
leonardoaraujosantos 0:5bd42710f2e7 4 //------------------------------------
leonardoaraujosantos 0:5bd42710f2e7 5 // Serial configuration (Put on hyperterminal or Putty)
leonardoaraujosantos 0:5bd42710f2e7 6 // 115200 bauds, 8-bit data, no parity
leonardoaraujosantos 0:5bd42710f2e7 7 //------------------------------------
leonardoaraujosantos 0:5bd42710f2e7 8
leonardoaraujosantos 0:5bd42710f2e7 9 Serial serialIO(SERIAL_TX, SERIAL_RX);
leonardoaraujosantos 0:5bd42710f2e7 10
leonardoaraujosantos 0:5bd42710f2e7 11 DigitalOut led2(LED2);
leonardoaraujosantos 1:4d067c712d03 12 DigitalIn button(USER_BUTTON);
leonardoaraujosantos 1:4d067c712d03 13
leonardoaraujosantos 1:4d067c712d03 14 // Some data queue
leonardoaraujosantos 1:4d067c712d03 15 typedef struct {
leonardoaraujosantos 1:4d067c712d03 16 float voltage; /* AD result of measured voltage */
leonardoaraujosantos 1:4d067c712d03 17 uint32_t counter; /* A counter value */
leonardoaraujosantos 1:4d067c712d03 18 } message_t;
leonardoaraujosantos 1:4d067c712d03 19
leonardoaraujosantos 1:4d067c712d03 20 MemoryPool<message_t, 16> mpool;
leonardoaraujosantos 1:4d067c712d03 21 Queue<message_t, 16> queue;
leonardoaraujosantos 1:4d067c712d03 22
leonardoaraujosantos 1:4d067c712d03 23 // Mutex shared by threads that want's to use the serial port
leonardoaraujosantos 1:4d067c712d03 24 Mutex stdio_mutex;
leonardoaraujosantos 1:4d067c712d03 25
leonardoaraujosantos 2:daaf6b6ad568 26 void toogleLed(void const *args)
leonardoaraujosantos 1:4d067c712d03 27 {
leonardoaraujosantos 2:daaf6b6ad568 28 // Toogle led
leonardoaraujosantos 2:daaf6b6ad568 29 led2 = !led2;
leonardoaraujosantos 1:4d067c712d03 30 }
leonardoaraujosantos 1:4d067c712d03 31
leonardoaraujosantos 1:4d067c712d03 32 void check_button(void const *args)
leonardoaraujosantos 1:4d067c712d03 33 {
leonardoaraujosantos 1:4d067c712d03 34 while (true) {
leonardoaraujosantos 1:4d067c712d03 35 // Read button
leonardoaraujosantos 1:4d067c712d03 36 int butVal = button;
leonardoaraujosantos 0:5bd42710f2e7 37
leonardoaraujosantos 1:4d067c712d03 38 // To avoid using the serial port at the same time by two threads use the mutex
leonardoaraujosantos 1:4d067c712d03 39 stdio_mutex.lock();
leonardoaraujosantos 1:4d067c712d03 40 serialIO.printf("Button state is:%d\r\n",butVal);
leonardoaraujosantos 1:4d067c712d03 41 stdio_mutex.unlock();
leonardoaraujosantos 1:4d067c712d03 42
leonardoaraujosantos 1:4d067c712d03 43 // Put thread in wait state for 100ms
leonardoaraujosantos 2:daaf6b6ad568 44 Thread::wait(300);
leonardoaraujosantos 1:4d067c712d03 45 }
leonardoaraujosantos 1:4d067c712d03 46 }
leonardoaraujosantos 1:4d067c712d03 47
leonardoaraujosantos 1:4d067c712d03 48 void data_producer(void const *args)
leonardoaraujosantos 1:4d067c712d03 49 {
leonardoaraujosantos 1:4d067c712d03 50 uint32_t i = 0;
leonardoaraujosantos 0:5bd42710f2e7 51 while (true) {
leonardoaraujosantos 1:4d067c712d03 52 i++; // fake data update
leonardoaraujosantos 1:4d067c712d03 53 message_t *message = mpool.alloc();
leonardoaraujosantos 1:4d067c712d03 54 message->voltage = (i * 0.1) * 33;
leonardoaraujosantos 1:4d067c712d03 55 message->counter = i;
leonardoaraujosantos 1:4d067c712d03 56 queue.put(message);
leonardoaraujosantos 2:daaf6b6ad568 57 Thread::wait(2000);
leonardoaraujosantos 1:4d067c712d03 58 }
leonardoaraujosantos 1:4d067c712d03 59 }
leonardoaraujosantos 1:4d067c712d03 60
leonardoaraujosantos 1:4d067c712d03 61 void data_consumer(void const *args)
leonardoaraujosantos 1:4d067c712d03 62 {
leonardoaraujosantos 1:4d067c712d03 63 while(true) {
leonardoaraujosantos 1:4d067c712d03 64 // Block until there is an event on the queue
leonardoaraujosantos 1:4d067c712d03 65 osEvent evt = queue.get();
leonardoaraujosantos 1:4d067c712d03 66 if (evt.status == osEventMessage) {
leonardoaraujosantos 1:4d067c712d03 67 message_t *message = (message_t*)evt.value.p;
leonardoaraujosantos 2:daaf6b6ad568 68
leonardoaraujosantos 1:4d067c712d03 69 // Grab mutex to print data
leonardoaraujosantos 1:4d067c712d03 70 stdio_mutex.lock();
leonardoaraujosantos 1:4d067c712d03 71 serialIO.printf("\nVoltage: %.2f V\n\r" , message->voltage);
leonardoaraujosantos 1:4d067c712d03 72 serialIO.printf("Number of cycles: %u\n\r", message->counter);
leonardoaraujosantos 1:4d067c712d03 73 stdio_mutex.unlock();
leonardoaraujosantos 1:4d067c712d03 74
leonardoaraujosantos 1:4d067c712d03 75 mpool.free(message);
leonardoaraujosantos 1:4d067c712d03 76 }
leonardoaraujosantos 0:5bd42710f2e7 77 }
leonardoaraujosantos 0:5bd42710f2e7 78 }
leonardoaraujosantos 0:5bd42710f2e7 79
leonardoaraujosantos 0:5bd42710f2e7 80 int main()
leonardoaraujosantos 2:daaf6b6ad568 81 {
leonardoaraujosantos 0:5bd42710f2e7 82 // Configure the serial speed.
leonardoaraujosantos 0:5bd42710f2e7 83 serialIO.baud(115200);
leonardoaraujosantos 1:4d067c712d03 84 serialIO.printf("Learning Microcontrollers with mbed !\r\n");
leonardoaraujosantos 1:4d067c712d03 85
leonardoaraujosantos 2:daaf6b6ad568 86 // Start a thread to togle the led
leonardoaraujosantos 1:4d067c712d03 87 Thread thread_2(check_button);
leonardoaraujosantos 1:4d067c712d03 88 Thread thread_3(data_producer);
leonardoaraujosantos 1:4d067c712d03 89 Thread thread_4(data_consumer);
leonardoaraujosantos 2:daaf6b6ad568 90
leonardoaraujosantos 2:daaf6b6ad568 91 // Periodically call a function
leonardoaraujosantos 2:daaf6b6ad568 92 RtosTimer timerTogLed(toogleLed, osTimerPeriodic);
leonardoaraujosantos 2:daaf6b6ad568 93 timerTogLed.start(1000);
leonardoaraujosantos 1:4d067c712d03 94
leonardoaraujosantos 0:5bd42710f2e7 95 // Lock forever here...
leonardoaraujosantos 2:daaf6b6ad568 96 Thread::wait(osWaitForever);
leonardoaraujosantos 0:5bd42710f2e7 97 }