Test mutex lock and unlock speed

Dependencies:   mbed-rtos mbed

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?

UserRevisionLine numberNew 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 }