Bas Vuyk
/
Robin_Board_Test
Test
events/equeue/equeue_mbed.cpp@0:9adff937d42a, 2018-06-27 (annotated)
- Committer:
- basvuyk
- Date:
- Wed Jun 27 09:49:19 2018 +0000
- Revision:
- 0:9adff937d42a
Test
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
basvuyk | 0:9adff937d42a | 1 | /* |
basvuyk | 0:9adff937d42a | 2 | * Implementation for the mbed library |
basvuyk | 0:9adff937d42a | 3 | * https://github.com/mbedmicro/mbed |
basvuyk | 0:9adff937d42a | 4 | * |
basvuyk | 0:9adff937d42a | 5 | * Copyright (c) 2016 Christopher Haster |
basvuyk | 0:9adff937d42a | 6 | * Distributed under the MIT license |
basvuyk | 0:9adff937d42a | 7 | */ |
basvuyk | 0:9adff937d42a | 8 | #include "equeue_platform.h" |
basvuyk | 0:9adff937d42a | 9 | |
basvuyk | 0:9adff937d42a | 10 | #if defined(EQUEUE_PLATFORM_MBED) |
basvuyk | 0:9adff937d42a | 11 | |
basvuyk | 0:9adff937d42a | 12 | #include <stdbool.h> |
basvuyk | 0:9adff937d42a | 13 | #include "mbed.h" |
basvuyk | 0:9adff937d42a | 14 | |
basvuyk | 0:9adff937d42a | 15 | |
basvuyk | 0:9adff937d42a | 16 | // Ticker operations |
basvuyk | 0:9adff937d42a | 17 | static bool equeue_tick_inited = false; |
basvuyk | 0:9adff937d42a | 18 | static unsigned equeue_minutes = 0; |
basvuyk | 0:9adff937d42a | 19 | static unsigned equeue_timer[ |
basvuyk | 0:9adff937d42a | 20 | (sizeof(Timer)+sizeof(unsigned)-1)/sizeof(unsigned)]; |
basvuyk | 0:9adff937d42a | 21 | static unsigned equeue_ticker[ |
basvuyk | 0:9adff937d42a | 22 | (sizeof(Ticker)+sizeof(unsigned)-1)/sizeof(unsigned)]; |
basvuyk | 0:9adff937d42a | 23 | |
basvuyk | 0:9adff937d42a | 24 | static void equeue_tick_update() { |
basvuyk | 0:9adff937d42a | 25 | reinterpret_cast<Timer*>(equeue_timer)->reset(); |
basvuyk | 0:9adff937d42a | 26 | equeue_minutes += 1; |
basvuyk | 0:9adff937d42a | 27 | } |
basvuyk | 0:9adff937d42a | 28 | |
basvuyk | 0:9adff937d42a | 29 | static void equeue_tick_init() { |
basvuyk | 0:9adff937d42a | 30 | MBED_ASSERT(sizeof(equeue_timer) >= sizeof(Timer)); |
basvuyk | 0:9adff937d42a | 31 | MBED_ASSERT(sizeof(equeue_ticker) >= sizeof(Ticker)); |
basvuyk | 0:9adff937d42a | 32 | new (equeue_timer) Timer; |
basvuyk | 0:9adff937d42a | 33 | new (equeue_ticker) Ticker; |
basvuyk | 0:9adff937d42a | 34 | |
basvuyk | 0:9adff937d42a | 35 | equeue_minutes = 0; |
basvuyk | 0:9adff937d42a | 36 | reinterpret_cast<Timer*>(equeue_timer)->start(); |
basvuyk | 0:9adff937d42a | 37 | reinterpret_cast<Ticker*>(equeue_ticker) |
basvuyk | 0:9adff937d42a | 38 | ->attach_us(equeue_tick_update, (1 << 16)*1000); |
basvuyk | 0:9adff937d42a | 39 | |
basvuyk | 0:9adff937d42a | 40 | equeue_tick_inited = true; |
basvuyk | 0:9adff937d42a | 41 | } |
basvuyk | 0:9adff937d42a | 42 | |
basvuyk | 0:9adff937d42a | 43 | unsigned equeue_tick() { |
basvuyk | 0:9adff937d42a | 44 | if (!equeue_tick_inited) { |
basvuyk | 0:9adff937d42a | 45 | equeue_tick_init(); |
basvuyk | 0:9adff937d42a | 46 | } |
basvuyk | 0:9adff937d42a | 47 | |
basvuyk | 0:9adff937d42a | 48 | unsigned equeue_ms = reinterpret_cast<Timer*>(equeue_timer)->read_ms(); |
basvuyk | 0:9adff937d42a | 49 | return (equeue_minutes << 16) + equeue_ms; |
basvuyk | 0:9adff937d42a | 50 | } |
basvuyk | 0:9adff937d42a | 51 | |
basvuyk | 0:9adff937d42a | 52 | |
basvuyk | 0:9adff937d42a | 53 | // Mutex operations |
basvuyk | 0:9adff937d42a | 54 | int equeue_mutex_create(equeue_mutex_t *m) { return 0; } |
basvuyk | 0:9adff937d42a | 55 | void equeue_mutex_destroy(equeue_mutex_t *m) { } |
basvuyk | 0:9adff937d42a | 56 | |
basvuyk | 0:9adff937d42a | 57 | void equeue_mutex_lock(equeue_mutex_t *m) { |
basvuyk | 0:9adff937d42a | 58 | core_util_critical_section_enter(); |
basvuyk | 0:9adff937d42a | 59 | } |
basvuyk | 0:9adff937d42a | 60 | |
basvuyk | 0:9adff937d42a | 61 | void equeue_mutex_unlock(equeue_mutex_t *m) { |
basvuyk | 0:9adff937d42a | 62 | core_util_critical_section_exit(); |
basvuyk | 0:9adff937d42a | 63 | } |
basvuyk | 0:9adff937d42a | 64 | |
basvuyk | 0:9adff937d42a | 65 | |
basvuyk | 0:9adff937d42a | 66 | // Semaphore operations |
basvuyk | 0:9adff937d42a | 67 | #ifdef MBED_CONF_RTOS_PRESENT |
basvuyk | 0:9adff937d42a | 68 | |
basvuyk | 0:9adff937d42a | 69 | int equeue_sema_create(equeue_sema_t *s) { |
basvuyk | 0:9adff937d42a | 70 | MBED_ASSERT(sizeof(equeue_sema_t) >= sizeof(Semaphore)); |
basvuyk | 0:9adff937d42a | 71 | new (s) Semaphore(0); |
basvuyk | 0:9adff937d42a | 72 | return 0; |
basvuyk | 0:9adff937d42a | 73 | } |
basvuyk | 0:9adff937d42a | 74 | |
basvuyk | 0:9adff937d42a | 75 | void equeue_sema_destroy(equeue_sema_t *s) { |
basvuyk | 0:9adff937d42a | 76 | reinterpret_cast<Semaphore*>(s)->~Semaphore(); |
basvuyk | 0:9adff937d42a | 77 | } |
basvuyk | 0:9adff937d42a | 78 | |
basvuyk | 0:9adff937d42a | 79 | void equeue_sema_signal(equeue_sema_t *s) { |
basvuyk | 0:9adff937d42a | 80 | reinterpret_cast<Semaphore*>(s)->release(); |
basvuyk | 0:9adff937d42a | 81 | } |
basvuyk | 0:9adff937d42a | 82 | |
basvuyk | 0:9adff937d42a | 83 | bool equeue_sema_wait(equeue_sema_t *s, int ms) { |
basvuyk | 0:9adff937d42a | 84 | if (ms < 0) { |
basvuyk | 0:9adff937d42a | 85 | ms = osWaitForever; |
basvuyk | 0:9adff937d42a | 86 | } |
basvuyk | 0:9adff937d42a | 87 | |
basvuyk | 0:9adff937d42a | 88 | return (reinterpret_cast<Semaphore*>(s)->wait(ms) > 0); |
basvuyk | 0:9adff937d42a | 89 | } |
basvuyk | 0:9adff937d42a | 90 | |
basvuyk | 0:9adff937d42a | 91 | #else |
basvuyk | 0:9adff937d42a | 92 | |
basvuyk | 0:9adff937d42a | 93 | // Semaphore operations |
basvuyk | 0:9adff937d42a | 94 | int equeue_sema_create(equeue_sema_t *s) { |
basvuyk | 0:9adff937d42a | 95 | *s = false; |
basvuyk | 0:9adff937d42a | 96 | return 0; |
basvuyk | 0:9adff937d42a | 97 | } |
basvuyk | 0:9adff937d42a | 98 | |
basvuyk | 0:9adff937d42a | 99 | void equeue_sema_destroy(equeue_sema_t *s) { |
basvuyk | 0:9adff937d42a | 100 | } |
basvuyk | 0:9adff937d42a | 101 | |
basvuyk | 0:9adff937d42a | 102 | void equeue_sema_signal(equeue_sema_t *s) { |
basvuyk | 0:9adff937d42a | 103 | *s = 1; |
basvuyk | 0:9adff937d42a | 104 | } |
basvuyk | 0:9adff937d42a | 105 | |
basvuyk | 0:9adff937d42a | 106 | static void equeue_sema_timeout(equeue_sema_t *s) { |
basvuyk | 0:9adff937d42a | 107 | *s = -1; |
basvuyk | 0:9adff937d42a | 108 | } |
basvuyk | 0:9adff937d42a | 109 | |
basvuyk | 0:9adff937d42a | 110 | bool equeue_sema_wait(equeue_sema_t *s, int ms) { |
basvuyk | 0:9adff937d42a | 111 | int signal = 0; |
basvuyk | 0:9adff937d42a | 112 | Timeout timeout; |
basvuyk | 0:9adff937d42a | 113 | timeout.attach_us(s, equeue_sema_timeout, ms*1000); |
basvuyk | 0:9adff937d42a | 114 | |
basvuyk | 0:9adff937d42a | 115 | core_util_critical_section_enter(); |
basvuyk | 0:9adff937d42a | 116 | while (!*s) { |
basvuyk | 0:9adff937d42a | 117 | sleep(); |
basvuyk | 0:9adff937d42a | 118 | core_util_critical_section_exit(); |
basvuyk | 0:9adff937d42a | 119 | core_util_critical_section_enter(); |
basvuyk | 0:9adff937d42a | 120 | } |
basvuyk | 0:9adff937d42a | 121 | |
basvuyk | 0:9adff937d42a | 122 | signal = *s; |
basvuyk | 0:9adff937d42a | 123 | *s = false; |
basvuyk | 0:9adff937d42a | 124 | core_util_critical_section_exit(); |
basvuyk | 0:9adff937d42a | 125 | |
basvuyk | 0:9adff937d42a | 126 | return (signal > 0); |
basvuyk | 0:9adff937d42a | 127 | } |
basvuyk | 0:9adff937d42a | 128 | |
basvuyk | 0:9adff937d42a | 129 | #endif |
basvuyk | 0:9adff937d42a | 130 | |
basvuyk | 0:9adff937d42a | 131 | #endif |