MemoryPoolとQueueのテストです。
Embed:
(wiki syntax)
Show/hide line numbers
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 }
Generated on Thu Aug 4 2022 18:14:44 by
1.7.2