Russ Butler
/
mutex_speed_test
Test mutex lock and unlock speed
main.cpp@1:031a47f61977, 2016-05-04 (annotated)
- Committer:
- c1728p9
- Date:
- Wed May 04 23:26:08 2016 +0000
- Revision:
- 1:031a47f61977
- Parent:
- 0:9787830cc5aa
Fix what is printed
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
c1728p9 | 0:9787830cc5aa | 1 | #include "mbed.h" |
c1728p9 | 0:9787830cc5aa | 2 | #include "rtos.h" |
c1728p9 | 0:9787830cc5aa | 3 | |
c1728p9 | 0:9787830cc5aa | 4 | Serial pc(USBTX, USBRX); |
c1728p9 | 0:9787830cc5aa | 5 | Timer t; |
c1728p9 | 0:9787830cc5aa | 6 | Mutex m; |
c1728p9 | 0:9787830cc5aa | 7 | Semaphore sem_event(0); |
c1728p9 | 0:9787830cc5aa | 8 | Semaphore sem_event_done(0); |
c1728p9 | 0:9787830cc5aa | 9 | bool lock = false; |
c1728p9 | 0:9787830cc5aa | 10 | |
c1728p9 | 0:9787830cc5aa | 11 | void thread_main(void const *argument) |
c1728p9 | 0:9787830cc5aa | 12 | { |
c1728p9 | 0:9787830cc5aa | 13 | while (true) { |
c1728p9 | 0:9787830cc5aa | 14 | sem_event.wait(); |
c1728p9 | 0:9787830cc5aa | 15 | if (lock) { |
c1728p9 | 0:9787830cc5aa | 16 | m.lock(); |
c1728p9 | 0:9787830cc5aa | 17 | } else { |
c1728p9 | 0:9787830cc5aa | 18 | m.unlock(); |
c1728p9 | 0:9787830cc5aa | 19 | } |
c1728p9 | 0:9787830cc5aa | 20 | sem_event_done.release(); |
c1728p9 | 0:9787830cc5aa | 21 | } |
c1728p9 | 0:9787830cc5aa | 22 | } |
c1728p9 | 0:9787830cc5aa | 23 | |
c1728p9 | 0:9787830cc5aa | 24 | |
c1728p9 | 0:9787830cc5aa | 25 | int main(void) |
c1728p9 | 0:9787830cc5aa | 26 | { |
c1728p9 | 0:9787830cc5aa | 27 | pc.baud(115200); |
c1728p9 | 0:9787830cc5aa | 28 | t.start(); |
c1728p9 | 0:9787830cc5aa | 29 | Thread thread(thread_main, NULL, osPriorityLow); |
c1728p9 | 0:9787830cc5aa | 30 | |
c1728p9 | 0:9787830cc5aa | 31 | // Test timer with Thread::wait(1000); |
c1728p9 | 0:9787830cc5aa | 32 | uint32_t start = t.read_us(); |
c1728p9 | 0:9787830cc5aa | 33 | Thread::wait(1000); |
c1728p9 | 0:9787830cc5aa | 34 | uint32_t stop = t.read_us(); |
c1728p9 | 1:031a47f61977 | 35 | pc.printf("Test delay of 1s: %luus\r\n", stop - start); |
c1728p9 | 0:9787830cc5aa | 36 | |
c1728p9 | 0:9787830cc5aa | 37 | |
c1728p9 | 0:9787830cc5aa | 38 | // Test consecutive call to timer |
c1728p9 | 0:9787830cc5aa | 39 | uint32_t max_us = 0; |
c1728p9 | 0:9787830cc5aa | 40 | uint32_t min_us = 0xffffffff; |
c1728p9 | 0:9787830cc5aa | 41 | for (int i = 0; i < 1000; i++) { |
c1728p9 | 0:9787830cc5aa | 42 | start = t.read_us(); |
c1728p9 | 0:9787830cc5aa | 43 | stop = t.read_us(); |
c1728p9 | 0:9787830cc5aa | 44 | uint32_t diff = stop - start; |
c1728p9 | 0:9787830cc5aa | 45 | if (diff > max_us) { |
c1728p9 | 0:9787830cc5aa | 46 | max_us = diff; |
c1728p9 | 0:9787830cc5aa | 47 | } |
c1728p9 | 0:9787830cc5aa | 48 | if (diff < min_us) { |
c1728p9 | 0:9787830cc5aa | 49 | min_us = diff; |
c1728p9 | 0:9787830cc5aa | 50 | } |
c1728p9 | 0:9787830cc5aa | 51 | } |
c1728p9 | 0:9787830cc5aa | 52 | printf("Timer min, max: %luus, %luus\r\n", min_us, max_us); |
c1728p9 | 0:9787830cc5aa | 53 | |
c1728p9 | 0:9787830cc5aa | 54 | // Test repeated mutex acquire and release |
c1728p9 | 0:9787830cc5aa | 55 | max_us = 0; |
c1728p9 | 0:9787830cc5aa | 56 | min_us = 0xffffffff; |
c1728p9 | 0:9787830cc5aa | 57 | for (int i = 0; i < 1000; i++) { |
c1728p9 | 0:9787830cc5aa | 58 | start = t.read_us(); |
c1728p9 | 0:9787830cc5aa | 59 | m.lock(); |
c1728p9 | 0:9787830cc5aa | 60 | stop = t.read_us(); |
c1728p9 | 0:9787830cc5aa | 61 | m.unlock(); |
c1728p9 | 0:9787830cc5aa | 62 | uint32_t diff = stop - start; |
c1728p9 | 0:9787830cc5aa | 63 | if (diff > max_us) { |
c1728p9 | 0:9787830cc5aa | 64 | max_us = diff; |
c1728p9 | 0:9787830cc5aa | 65 | } |
c1728p9 | 0:9787830cc5aa | 66 | if (diff < min_us) { |
c1728p9 | 0:9787830cc5aa | 67 | min_us = diff; |
c1728p9 | 0:9787830cc5aa | 68 | } |
c1728p9 | 0:9787830cc5aa | 69 | } |
c1728p9 | 0:9787830cc5aa | 70 | printf("lock min, max: %luus, %luus\r\n", min_us, max_us); |
c1728p9 | 0:9787830cc5aa | 71 | |
c1728p9 | 0:9787830cc5aa | 72 | // Test repeated mutex acquire and release |
c1728p9 | 0:9787830cc5aa | 73 | max_us = 0; |
c1728p9 | 0:9787830cc5aa | 74 | min_us = 0xffffffff; |
c1728p9 | 0:9787830cc5aa | 75 | for (int i = 0; i < 1000; i++) { |
c1728p9 | 0:9787830cc5aa | 76 | m.lock(); |
c1728p9 | 0:9787830cc5aa | 77 | start = t.read_us(); |
c1728p9 | 0:9787830cc5aa | 78 | m.unlock(); |
c1728p9 | 0:9787830cc5aa | 79 | stop = t.read_us(); |
c1728p9 | 0:9787830cc5aa | 80 | uint32_t diff = stop - start; |
c1728p9 | 0:9787830cc5aa | 81 | if (diff > max_us) { |
c1728p9 | 0:9787830cc5aa | 82 | max_us = diff; |
c1728p9 | 0:9787830cc5aa | 83 | } |
c1728p9 | 0:9787830cc5aa | 84 | if (diff < min_us) { |
c1728p9 | 0:9787830cc5aa | 85 | min_us = diff; |
c1728p9 | 0:9787830cc5aa | 86 | } |
c1728p9 | 0:9787830cc5aa | 87 | } |
c1728p9 | 0:9787830cc5aa | 88 | printf("unlock min, max: %luus, %luus\r\n", min_us, max_us); |
c1728p9 | 0:9787830cc5aa | 89 | |
c1728p9 | 0:9787830cc5aa | 90 | // Test repeated use of locked mutex |
c1728p9 | 0:9787830cc5aa | 91 | max_us = 0; |
c1728p9 | 0:9787830cc5aa | 92 | min_us = 0xffffffff; |
c1728p9 | 0:9787830cc5aa | 93 | for (int i = 0; i < 1000; i++) { |
c1728p9 | 0:9787830cc5aa | 94 | |
c1728p9 | 0:9787830cc5aa | 95 | // Make another thread lock the mutex |
c1728p9 | 0:9787830cc5aa | 96 | lock = true; |
c1728p9 | 0:9787830cc5aa | 97 | sem_event.release(); |
c1728p9 | 0:9787830cc5aa | 98 | sem_event_done.wait(); |
c1728p9 | 0:9787830cc5aa | 99 | |
c1728p9 | 0:9787830cc5aa | 100 | // Make the other thead unlock the mutex |
c1728p9 | 0:9787830cc5aa | 101 | // Note - this thread is lower priority so it will not |
c1728p9 | 0:9787830cc5aa | 102 | // start unlocking until main is suspended |
c1728p9 | 0:9787830cc5aa | 103 | lock = false; |
c1728p9 | 0:9787830cc5aa | 104 | sem_event.release(); |
c1728p9 | 0:9787830cc5aa | 105 | // Try and acquire the mutex |
c1728p9 | 0:9787830cc5aa | 106 | start = t.read_us(); |
c1728p9 | 0:9787830cc5aa | 107 | m.lock(); |
c1728p9 | 0:9787830cc5aa | 108 | stop = t.read_us(); |
c1728p9 | 0:9787830cc5aa | 109 | m.unlock(); |
c1728p9 | 0:9787830cc5aa | 110 | // Decrement event done count |
c1728p9 | 0:9787830cc5aa | 111 | sem_event_done.wait(); |
c1728p9 | 0:9787830cc5aa | 112 | |
c1728p9 | 0:9787830cc5aa | 113 | uint32_t diff = stop - start; |
c1728p9 | 0:9787830cc5aa | 114 | if (diff > max_us) { |
c1728p9 | 0:9787830cc5aa | 115 | max_us = diff; |
c1728p9 | 0:9787830cc5aa | 116 | } |
c1728p9 | 0:9787830cc5aa | 117 | if (diff < min_us) { |
c1728p9 | 0:9787830cc5aa | 118 | min_us = diff; |
c1728p9 | 0:9787830cc5aa | 119 | } |
c1728p9 | 0:9787830cc5aa | 120 | } |
c1728p9 | 1:031a47f61977 | 121 | printf("Lock already locked mutex min, max: %luus, %luus\r\n", min_us, max_us); |
c1728p9 | 0:9787830cc5aa | 122 | |
c1728p9 | 0:9787830cc5aa | 123 | while (true) { |
c1728p9 | 0:9787830cc5aa | 124 | Thread::wait(1000); |
c1728p9 | 0:9787830cc5aa | 125 | } |
c1728p9 | 0:9787830cc5aa | 126 | } |