This is for http://mbed.org/forum/bugs-suggestions/topic/1074/

Dependencies:   mbed

Files at this revision

API Documentation at this revision

Comitter:
shintamainjp
Date:
Wed Sep 08 12:53:38 2010 +0000
Child:
1:70466efca68e
Commit message:

Changed in this revision

Semaphore.h Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
mbed.bld Show annotated file Show diff for this revision Revisions of this file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Semaphore.h	Wed Sep 08 12:53:38 2010 +0000
@@ -0,0 +1,32 @@
+#ifndef _SEMAPHORE_H_
+#define _SEMAPHORE_H_
+
+/*
+ * http://mbed.org/forum/mbed/topic/181/#comment-799
+ */
+
+class Semaphore {
+public:
+    Semaphore(): s(SemFree) {}
+
+    bool take(bool block = true) {
+        int oldval;
+        do {
+            oldval = __ldrex(&s);
+        } while ((block && oldval == SemTaken) || __strex(SemTaken, &s) != 0);
+        if (!block) {
+            __clrex();
+        }
+        return (oldval == SemFree);
+    }
+
+    void release() {
+        s = SemFree;
+    }
+
+private:
+    enum { SemFree, SemTaken };
+    int s;
+};
+
+#endif
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Wed Sep 08 12:53:38 2010 +0000
@@ -0,0 +1,52 @@
+/**
+ * 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);
+Ticker ticker;
+BusOut led(LED4, LED3, LED2, LED1);
+Semaphore sem;
+
+char shared_resource;   // This is a shared resource for example.
+
+#define LOCK() sem.take()
+#define UNLOCK() sem.release()
+
+/**
+ * a ticker.
+ */
+void func_tick(void) {
+    led = led + 1;
+}
+
+/**
+ * A call back function for serial interrupt.
+ */
+void func_serial_interrupt(void) {
+    LOCK();
+    shared_resource = ser.getc();
+    UNLOCK();
+}
+
+/**
+ * Entry point.
+ */
+int main() {
+    ticker.attach_us(&func_tick, 100 * 1000);
+    ser.attach(&func_serial_interrupt);
+    while(1) {
+        /*
+         * Hung up your mbed system if you hit keys on console for Serial.
+         */
+        LOCK();
+        printf("0x%x\n", shared_resource);
+        UNLOCK();
+        wait_ms(100);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed.bld	Wed Sep 08 12:53:38 2010 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/mbed_official/code/mbed/builds/e2ac27c8e93e