robert bouwens
/
TestSemaphoreProgram
testharness for my semphore class
main.cpp@0:a2eb037fbb76, 2010-09-14 (annotated)
- Committer:
- roberto_b
- Date:
- Tue Sep 14 20:38:26 2010 +0000
- Revision:
- 0:a2eb037fbb76
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
roberto_b | 0:a2eb037fbb76 | 1 | /** |
roberto_b | 0:a2eb037fbb76 | 2 | * Test program for a bug. (http://mbed.org/forum/bugs-suggestions/topic/1074/) |
roberto_b | 0:a2eb037fbb76 | 3 | * |
roberto_b | 0:a2eb037fbb76 | 4 | * Copyright (C) 2010 Shinichiro Nakamura (CuBeatSystems) |
roberto_b | 0:a2eb037fbb76 | 5 | * http://shinta.main.jp/ |
roberto_b | 0:a2eb037fbb76 | 6 | */ |
roberto_b | 0:a2eb037fbb76 | 7 | |
roberto_b | 0:a2eb037fbb76 | 8 | #include "mbed.h" |
roberto_b | 0:a2eb037fbb76 | 9 | #include "Semaphore.h" |
roberto_b | 0:a2eb037fbb76 | 10 | |
roberto_b | 0:a2eb037fbb76 | 11 | Serial ser(USBTX, USBRX); |
roberto_b | 0:a2eb037fbb76 | 12 | |
roberto_b | 0:a2eb037fbb76 | 13 | DigitalOut interrupt_data_led(LED1); |
roberto_b | 0:a2eb037fbb76 | 14 | DigitalOut dataled(LED2); |
roberto_b | 0:a2eb037fbb76 | 15 | DigitalOut data_locked_led(LED3); |
roberto_b | 0:a2eb037fbb76 | 16 | DigitalOut no_data_led(LED4); |
roberto_b | 0:a2eb037fbb76 | 17 | |
roberto_b | 0:a2eb037fbb76 | 18 | Semaphore sem; |
roberto_b | 0:a2eb037fbb76 | 19 | |
roberto_b | 0:a2eb037fbb76 | 20 | volatile char shared_resource = 'a'; // This is a shared resource for example. |
roberto_b | 0:a2eb037fbb76 | 21 | |
roberto_b | 0:a2eb037fbb76 | 22 | #define LOCK() sem.try_enter() |
roberto_b | 0:a2eb037fbb76 | 23 | #define UNLOCK() sem.release() |
roberto_b | 0:a2eb037fbb76 | 24 | |
roberto_b | 0:a2eb037fbb76 | 25 | void toggle_led( DigitalOut &led) { |
roberto_b | 0:a2eb037fbb76 | 26 | if ( 1 == led) |
roberto_b | 0:a2eb037fbb76 | 27 | led = 0; |
roberto_b | 0:a2eb037fbb76 | 28 | else |
roberto_b | 0:a2eb037fbb76 | 29 | led = 1; |
roberto_b | 0:a2eb037fbb76 | 30 | } |
roberto_b | 0:a2eb037fbb76 | 31 | |
roberto_b | 0:a2eb037fbb76 | 32 | char* my_itoa(int val, int base) { |
roberto_b | 0:a2eb037fbb76 | 33 | static char buf[12] = {0}; |
roberto_b | 0:a2eb037fbb76 | 34 | |
roberto_b | 0:a2eb037fbb76 | 35 | int i = 10; |
roberto_b | 0:a2eb037fbb76 | 36 | if ( 0 != val) { |
roberto_b | 0:a2eb037fbb76 | 37 | for (; val && i ; --i, val /= base) |
roberto_b | 0:a2eb037fbb76 | 38 | buf[i] = "0123456789abcdef"[val % base]; |
roberto_b | 0:a2eb037fbb76 | 39 | return &buf[i+1]; |
roberto_b | 0:a2eb037fbb76 | 40 | } else { |
roberto_b | 0:a2eb037fbb76 | 41 | buf[0] = '0'; |
roberto_b | 0:a2eb037fbb76 | 42 | buf[1] = '0'; |
roberto_b | 0:a2eb037fbb76 | 43 | return &buf[0]; |
roberto_b | 0:a2eb037fbb76 | 44 | } |
roberto_b | 0:a2eb037fbb76 | 45 | } |
roberto_b | 0:a2eb037fbb76 | 46 | |
roberto_b | 0:a2eb037fbb76 | 47 | void waitBeforeSend(char ch) { |
roberto_b | 0:a2eb037fbb76 | 48 | while ( 0 == ser.writeable()) { |
roberto_b | 0:a2eb037fbb76 | 49 | wait_ms(1); |
roberto_b | 0:a2eb037fbb76 | 50 | } |
roberto_b | 0:a2eb037fbb76 | 51 | ser.putc( ch ); |
roberto_b | 0:a2eb037fbb76 | 52 | toggle_led(dataled); |
roberto_b | 0:a2eb037fbb76 | 53 | } |
roberto_b | 0:a2eb037fbb76 | 54 | |
roberto_b | 0:a2eb037fbb76 | 55 | |
roberto_b | 0:a2eb037fbb76 | 56 | /** |
roberto_b | 0:a2eb037fbb76 | 57 | * A call back function for serial interrupt. |
roberto_b | 0:a2eb037fbb76 | 58 | */ |
roberto_b | 0:a2eb037fbb76 | 59 | void func_serial_interrupt(void) { |
roberto_b | 0:a2eb037fbb76 | 60 | toggle_led(interrupt_data_led); |
roberto_b | 0:a2eb037fbb76 | 61 | if (LOCK()) { |
roberto_b | 0:a2eb037fbb76 | 62 | shared_resource = ser.getc(); |
roberto_b | 0:a2eb037fbb76 | 63 | UNLOCK(); |
roberto_b | 0:a2eb037fbb76 | 64 | } else { |
roberto_b | 0:a2eb037fbb76 | 65 | toggle_led(no_data_led); |
roberto_b | 0:a2eb037fbb76 | 66 | } |
roberto_b | 0:a2eb037fbb76 | 67 | } |
roberto_b | 0:a2eb037fbb76 | 68 | |
roberto_b | 0:a2eb037fbb76 | 69 | /** |
roberto_b | 0:a2eb037fbb76 | 70 | * Entry point. |
roberto_b | 0:a2eb037fbb76 | 71 | */ |
roberto_b | 0:a2eb037fbb76 | 72 | int main() { |
roberto_b | 0:a2eb037fbb76 | 73 | int i = 0; |
roberto_b | 0:a2eb037fbb76 | 74 | char *out = "my semaphore test program\r\n"; |
roberto_b | 0:a2eb037fbb76 | 75 | ser.attach(&func_serial_interrupt); |
roberto_b | 0:a2eb037fbb76 | 76 | char *ptr = out; |
roberto_b | 0:a2eb037fbb76 | 77 | while ( *ptr != 0 ) { |
roberto_b | 0:a2eb037fbb76 | 78 | waitBeforeSend(*ptr); |
roberto_b | 0:a2eb037fbb76 | 79 | ptr++; |
roberto_b | 0:a2eb037fbb76 | 80 | } |
roberto_b | 0:a2eb037fbb76 | 81 | |
roberto_b | 0:a2eb037fbb76 | 82 | while (1) { |
roberto_b | 0:a2eb037fbb76 | 83 | /* |
roberto_b | 0:a2eb037fbb76 | 84 | * Hung up serial communication if you hit keys on console for Serial. |
roberto_b | 0:a2eb037fbb76 | 85 | */ |
roberto_b | 0:a2eb037fbb76 | 86 | if (LOCK()) { |
roberto_b | 0:a2eb037fbb76 | 87 | ptr = my_itoa(shared_resource, 16); |
roberto_b | 0:a2eb037fbb76 | 88 | UNLOCK(); |
roberto_b | 0:a2eb037fbb76 | 89 | while ( *ptr != 0 ) { |
roberto_b | 0:a2eb037fbb76 | 90 | waitBeforeSend(*ptr); |
roberto_b | 0:a2eb037fbb76 | 91 | ptr++; |
roberto_b | 0:a2eb037fbb76 | 92 | } |
roberto_b | 0:a2eb037fbb76 | 93 | i++; |
roberto_b | 0:a2eb037fbb76 | 94 | i %= 20; |
roberto_b | 0:a2eb037fbb76 | 95 | if (!i) { |
roberto_b | 0:a2eb037fbb76 | 96 | waitBeforeSend('\r'); |
roberto_b | 0:a2eb037fbb76 | 97 | waitBeforeSend('\n'); |
roberto_b | 0:a2eb037fbb76 | 98 | } else { |
roberto_b | 0:a2eb037fbb76 | 99 | waitBeforeSend(' '); |
roberto_b | 0:a2eb037fbb76 | 100 | } |
roberto_b | 0:a2eb037fbb76 | 101 | } else { |
roberto_b | 0:a2eb037fbb76 | 102 | toggle_led(data_locked_led); |
roberto_b | 0:a2eb037fbb76 | 103 | } |
roberto_b | 0:a2eb037fbb76 | 104 | wait_ms(100); |
roberto_b | 0:a2eb037fbb76 | 105 | } |
roberto_b | 0:a2eb037fbb76 | 106 | } |