Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of Task633 by
Diff: main.cpp
- Revision:
- 10:3a3d2a571c8f
- Parent:
- 9:31031bbb59c7
- Child:
- 11:ae623ddb2eff
diff -r 31031bbb59c7 -r 3a3d2a571c8f main.cpp
--- a/main.cpp Mon Mar 21 13:50:11 2016 +0000
+++ b/main.cpp Tue Mar 22 13:40:05 2016 +0000
@@ -27,58 +27,83 @@
//Threads
Thread *t1;
-//Queues - "A message can be a integer or pointer value to a certain type T that is sent to a thread or interrupt service routine."
-Queue<uint32_t, 5> *queue;
+//Class type
+class message_t {
+public:
+ float adcValue;
+ int sw1State;
+ int sw2State;
+
+ //Constructor
+ message_t(float f, int s1, int s2) {
+ adcValue = f;
+ sw1State = s1;
+ sw2State = s2;
+ }
+};
+
+//Memory Pool - with capacity for 16 message_t types
+MemoryPool<message_t, 16> mpool;
+//Message queue - matched to the memory pool
+Queue<message_t, 16> queue;
// Call this on precise intervals
void adcISR() {
- //Option to starve the queue
- if (sw2 == 1) return;
+ //Read sample - make a copy
+ float sample = adcIn;
+ //Grab switch state
+ uint32_t switch1State = sw1;
+ uint32_t switch2State = sw2;
- //Read sample - make a copy
- uint32_t sample = (uint32_t)(4095*adcIn.read());
+ //Allocate a block from the memory pool
+ message_t *message = mpool.alloc();
+ if (message == NULL) {
+ //Out of memory
+ redLED = 1;
+ return;
+ }
+
+ //Fill in the data
+ message->adcValue = sample;
+ message->sw1State = switch1State;
+ message->sw2State = switch2State;
//Write to queue
- osStatus stat = queue->put((uint32_t*)sample);
+ osStatus stat = queue.put(message); //Note we are sending the "pointer"
//Check if succesful
if (stat == osErrorResource) {
redLED = 1;
printf("queue->put() Error code: %4Xh, Resource not available\r\n", stat);
+ mpool.free(message);
+ return;
}
-
}
//Normal priority thread (consumer)
void thread1( const void* arg )
-{
+{
while (true) {
- //Read queue - block (with timeout)
- osEvent evt = queue->get(5000); //With timeout
+ //Block on the queue
+ osEvent evt = queue.get();
- //Check status of get()
- switch (evt.status) {
- case osEventMessage:
- //Normal status
- printf("value = %d\n\r", evt.value.v);
- greenLED = !greenLED;
- break;
- case osEventTimeout:
- //Timeout
- printf("queue->get() returned %02x status (timeout)\n\r", evt.status);
- break;
- default:
- //All other errors (see cmsis_os.h for meaning of error code)
- printf("queue->get() returned %02x status\n\r", evt.status);
- break;
+ //Check status
+ if (evt.status == osEventMessage) {
+ message_t *pMessage = (message_t*)evt.value.p; //This is the pointer (address)
+ //Make a copy
+ message_t msg(pMessage->adcValue, pMessage->sw1State, pMessage->sw2State);
+ //We are done with this, so give back the memory to the pool
+ mpool.free(pMessage);
+
+ //Echo to the terminal
+ printf("ADC Value: %.2f\t", msg.adcValue);
+ printf("SW1: %u\t", msg.sw1State);
+ printf("SW2: %u\n\r", msg.sw2State);
}
-
- //Block up consumer if switch is held down
- //Will fill the queue if held long enough
- while (sw1 == 1);
-
+
+
} //end while
}
@@ -90,14 +115,11 @@
greenLED = 0;
//Start message
- printf("Welcome\n");
-
- //Queue
- queue = new Queue<uint32_t,5>();
-
+ printf("Welcome\n");
+
//Hook up timer interrupt
Ticker timer;
- timer.attach(&adcISR, 1.0);
+ timer.attach(&adcISR, 0.1);
//Threads
t1 = new Thread(&thread1);