MemoryPoolとQueueのテストです。

Dependencies:   mbed-rtos mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 #include "mbed.h"
00002 #include "rtos.h"
00003 
00004 typedef struct {
00005     float voltage;
00006     float current;
00007     uint32_t counter;
00008 } message_t;
00009 
00010 MemoryPool<message_t, 4> mpool;
00011 Queue<message_t, 4> queue;
00012 
00013 void send_thread(void const *args)
00014 {
00015     const uint32_t WAIT_MS = 1000;
00016     
00017     uint32_t i = 0;
00018     while (true) {
00019         i++;
00020         message_t* message = mpool.alloc();
00021         while (!message) {
00022             // 古い情報は消す
00023             osEvent evt = queue.get();
00024             mpool.free((message_t*)evt.value.p);
00025 
00026             message = mpool.alloc();
00027         }
00028 
00029         message->voltage = (i * 0.1) * 33;
00030         message->current = (i * 0.1) * 11;
00031         message->counter = i;
00032         queue.put(message);
00033 
00034         Thread::wait(WAIT_MS);
00035     }
00036 }
00037 
00038 int main()
00039 {
00040     const uint32_t NO_WAIT = 0;
00041     const int INTERVAL_MS = 4000;
00042 
00043     Timer timer;
00044 
00045     Thread thread(send_thread);
00046 
00047     timer.start();
00048     while (true) {
00049         timer.reset();
00050 
00051         for (osEvent evt = queue.get(NO_WAIT); evt.status == osEventMessage; evt = queue.get(NO_WAIT)) {
00052             message_t* message = (message_t*)evt.value.p;
00053             printf("\nVoltage: %.2f V\n\r", message->voltage);
00054             printf("Current: %.2f A\n\r", message->current);
00055             printf("Counter: %u\n\r", message->counter);
00056 
00057             mpool.free(message);
00058         }
00059 
00060         while (timer.read_ms() < INTERVAL_MS) {
00061             Thread::yield();
00062         }
00063     }
00064 }