Last commit 14 Sep 2010
semaphore
semaphore
Description: testharness for my semphore class
Revision 0:a2eb037fbb76, committed 14 Sep 2010
- Comitter:
- Date:
- Tue Sep 14 20:38:26 2010 +0000
- Commit message:
Changed in this revision
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Semaphore.h Tue Sep 14 20:38:26 2010 +0000
@@ -0,0 +1,34 @@
+// Copyright (C) 2010 Robert M. Bouwens
+
+#ifndef _SEMAPHORE_H_
+#define _SEMAPHORE_H_
+
+/*
+ * http://mbed.org/forum/mbed/topic/181/#comment-799
+ */
+
+class Semaphore {
+public:
+ Semaphore(): s(SemFree) {};
+
+ bool try_enter() {
+ int oldval = __ldrex(&s);
+ if (oldval == SemTaken) {
+ __clrex();
+ return false;
+ }
+ s = SemTaken;
+ __clrex();
+ return SemTaken == s;
+ };
+
+ void release() {
+ s = SemFree;
+ };
+
+private:
+ enum { SemFree = 1, SemTaken = 2 };
+ volatile int s;
+};
+
+#endif
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp Tue Sep 14 20:38:26 2010 +0000
@@ -0,0 +1,106 @@
+/**
+ * Test program for a bug. (http://mbed.org/forum/bugs-suggestions/topic/1074/)
+ *
+ * Copyright (C) 2010 Shinichiro Nakamura (CuBeatSystems)
+ * http://shinta.main.jp/
+ */
+
+#include "mbed.h"
+#include "Semaphore.h"
+
+Serial ser(USBTX, USBRX);
+
+DigitalOut interrupt_data_led(LED1);
+DigitalOut dataled(LED2);
+DigitalOut data_locked_led(LED3);
+DigitalOut no_data_led(LED4);
+
+Semaphore sem;
+
+volatile char shared_resource = 'a'; // This is a shared resource for example.
+
+#define LOCK() sem.try_enter()
+#define UNLOCK() sem.release()
+
+void toggle_led( DigitalOut &led) {
+ if ( 1 == led)
+ led = 0;
+ else
+ led = 1;
+}
+
+char* my_itoa(int val, int base) {
+ static char buf[12] = {0};
+
+ int i = 10;
+ if ( 0 != val) {
+ for (; val && i ; --i, val /= base)
+ buf[i] = "0123456789abcdef"[val % base];
+ return &buf[i+1];
+ } else {
+ buf[0] = '0';
+ buf[1] = '0';
+ return &buf[0];
+ }
+}
+
+void waitBeforeSend(char ch) {
+ while ( 0 == ser.writeable()) {
+ wait_ms(1);
+ }
+ ser.putc( ch );
+ toggle_led(dataled);
+}
+
+
+/**
+ * A call back function for serial interrupt.
+ */
+void func_serial_interrupt(void) {
+ toggle_led(interrupt_data_led);
+ if (LOCK()) {
+ shared_resource = ser.getc();
+ UNLOCK();
+ } else {
+ toggle_led(no_data_led);
+ }
+}
+
+/**
+ * Entry point.
+ */
+int main() {
+ int i = 0;
+ char *out = "my semaphore test program\r\n";
+ ser.attach(&func_serial_interrupt);
+ char *ptr = out;
+ while ( *ptr != 0 ) {
+ waitBeforeSend(*ptr);
+ ptr++;
+ }
+
+ while (1) {
+ /*
+ * Hung up serial communication if you hit keys on console for Serial.
+ */
+ if (LOCK()) {
+ ptr = my_itoa(shared_resource, 16);
+ UNLOCK();
+ while ( *ptr != 0 ) {
+ waitBeforeSend(*ptr);
+ ptr++;
+ }
+ i++;
+ i %= 20;
+ if (!i) {
+ waitBeforeSend('\r');
+ waitBeforeSend('\n');
+ } else {
+ waitBeforeSend(' ');
+ }
+ } else {
+ toggle_led(data_locked_led);
+ }
+ wait_ms(100);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed.bld Tue Sep 14 20:38:26 2010 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/mbed_official/code/mbed/builds/e2ac27c8e93e

