This is a fork of the `events` subdirectory of https://github.com/ARMmbed/mbed-os
Dependents: HelloWorld_CCA01M1 HelloWorld_CCA02M1 CI-data-logger-server HelloWorld_CCA02M1 ... more
This is a fork of the events
subdirectory of https://github.com/ARMmbed/mbed-os.
Note, you must import this library with import name: events
!!!
equeue/equeue_mbed.cpp@2:a60d8117d0e0, 2016-10-01 (annotated)
- Committer:
- Sam Grove
- Date:
- Sat Oct 01 02:11:36 2016 -0500
- Revision:
- 2:a60d8117d0e0
- Parent:
- 0:a792d4bf36c2
- Child:
- 9:a372bff82709
For drivers, events, hal, platform, rtos and mbed.h add one level of path to make sure specific and unique includes files are found.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Bogdan Marinescu |
0:a792d4bf36c2 | 1 | /* |
Bogdan Marinescu |
0:a792d4bf36c2 | 2 | * Implementation for the mbed library |
Bogdan Marinescu |
0:a792d4bf36c2 | 3 | * https://github.com/mbedmicro/mbed |
Bogdan Marinescu |
0:a792d4bf36c2 | 4 | * |
Bogdan Marinescu |
0:a792d4bf36c2 | 5 | * Copyright (c) 2016 Christopher Haster |
Bogdan Marinescu |
0:a792d4bf36c2 | 6 | * |
Bogdan Marinescu |
0:a792d4bf36c2 | 7 | * Licensed under the Apache License, Version 2.0 (the "License"); |
Bogdan Marinescu |
0:a792d4bf36c2 | 8 | * you may not use this file except in compliance with the License. |
Bogdan Marinescu |
0:a792d4bf36c2 | 9 | * You may obtain a copy of the License at |
Bogdan Marinescu |
0:a792d4bf36c2 | 10 | * |
Bogdan Marinescu |
0:a792d4bf36c2 | 11 | * http://www.apache.org/licenses/LICENSE-2.0 |
Bogdan Marinescu |
0:a792d4bf36c2 | 12 | * |
Bogdan Marinescu |
0:a792d4bf36c2 | 13 | * Unless required by applicable law or agreed to in writing, software |
Bogdan Marinescu |
0:a792d4bf36c2 | 14 | * distributed under the License is distributed on an "AS IS" BASIS, |
Bogdan Marinescu |
0:a792d4bf36c2 | 15 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
Bogdan Marinescu |
0:a792d4bf36c2 | 16 | * See the License for the specific language governing permissions and |
Bogdan Marinescu |
0:a792d4bf36c2 | 17 | * limitations under the License. |
Bogdan Marinescu |
0:a792d4bf36c2 | 18 | */ |
Sam Grove |
2:a60d8117d0e0 | 19 | #include "equeue/equeue_platform.h" |
Bogdan Marinescu |
0:a792d4bf36c2 | 20 | |
Bogdan Marinescu |
0:a792d4bf36c2 | 21 | #if defined(EQUEUE_PLATFORM_MBED) |
Bogdan Marinescu |
0:a792d4bf36c2 | 22 | |
Bogdan Marinescu |
0:a792d4bf36c2 | 23 | #include <stdbool.h> |
Bogdan Marinescu |
0:a792d4bf36c2 | 24 | #include "mbed.h" |
Bogdan Marinescu |
0:a792d4bf36c2 | 25 | |
Bogdan Marinescu |
0:a792d4bf36c2 | 26 | |
Bogdan Marinescu |
0:a792d4bf36c2 | 27 | // Ticker operations |
Bogdan Marinescu |
0:a792d4bf36c2 | 28 | static bool equeue_tick_inited = false; |
Bogdan Marinescu |
0:a792d4bf36c2 | 29 | static unsigned equeue_minutes = 0; |
Bogdan Marinescu |
0:a792d4bf36c2 | 30 | static unsigned equeue_timer[ |
Bogdan Marinescu |
0:a792d4bf36c2 | 31 | (sizeof(Timer)+sizeof(unsigned)-1)/sizeof(unsigned)]; |
Bogdan Marinescu |
0:a792d4bf36c2 | 32 | static unsigned equeue_ticker[ |
Bogdan Marinescu |
0:a792d4bf36c2 | 33 | (sizeof(Ticker)+sizeof(unsigned)-1)/sizeof(unsigned)]; |
Bogdan Marinescu |
0:a792d4bf36c2 | 34 | |
Bogdan Marinescu |
0:a792d4bf36c2 | 35 | static void equeue_tick_update() { |
Bogdan Marinescu |
0:a792d4bf36c2 | 36 | reinterpret_cast<Timer*>(equeue_timer)->reset(); |
Bogdan Marinescu |
0:a792d4bf36c2 | 37 | equeue_minutes += 1; |
Bogdan Marinescu |
0:a792d4bf36c2 | 38 | } |
Bogdan Marinescu |
0:a792d4bf36c2 | 39 | |
Bogdan Marinescu |
0:a792d4bf36c2 | 40 | static void equeue_tick_init() { |
Bogdan Marinescu |
0:a792d4bf36c2 | 41 | MBED_ASSERT(sizeof(equeue_timer) >= sizeof(Timer)); |
Bogdan Marinescu |
0:a792d4bf36c2 | 42 | MBED_ASSERT(sizeof(equeue_ticker) >= sizeof(Ticker)); |
Bogdan Marinescu |
0:a792d4bf36c2 | 43 | new (equeue_timer) Timer; |
Bogdan Marinescu |
0:a792d4bf36c2 | 44 | new (equeue_ticker) Ticker; |
Bogdan Marinescu |
0:a792d4bf36c2 | 45 | |
Bogdan Marinescu |
0:a792d4bf36c2 | 46 | equeue_minutes = 0; |
Bogdan Marinescu |
0:a792d4bf36c2 | 47 | reinterpret_cast<Timer*>(equeue_timer)->start(); |
Bogdan Marinescu |
0:a792d4bf36c2 | 48 | reinterpret_cast<Ticker*>(equeue_ticker) |
Bogdan Marinescu |
0:a792d4bf36c2 | 49 | ->attach_us(equeue_tick_update, (1 << 16)*1000); |
Bogdan Marinescu |
0:a792d4bf36c2 | 50 | |
Bogdan Marinescu |
0:a792d4bf36c2 | 51 | equeue_tick_inited = true; |
Bogdan Marinescu |
0:a792d4bf36c2 | 52 | } |
Bogdan Marinescu |
0:a792d4bf36c2 | 53 | |
Bogdan Marinescu |
0:a792d4bf36c2 | 54 | unsigned equeue_tick() { |
Bogdan Marinescu |
0:a792d4bf36c2 | 55 | if (!equeue_tick_inited) { |
Bogdan Marinescu |
0:a792d4bf36c2 | 56 | equeue_tick_init(); |
Bogdan Marinescu |
0:a792d4bf36c2 | 57 | } |
Bogdan Marinescu |
0:a792d4bf36c2 | 58 | |
Bogdan Marinescu |
0:a792d4bf36c2 | 59 | unsigned equeue_ms = reinterpret_cast<Timer*>(equeue_timer)->read_ms(); |
Bogdan Marinescu |
0:a792d4bf36c2 | 60 | return (equeue_minutes << 16) + equeue_ms; |
Bogdan Marinescu |
0:a792d4bf36c2 | 61 | } |
Bogdan Marinescu |
0:a792d4bf36c2 | 62 | |
Bogdan Marinescu |
0:a792d4bf36c2 | 63 | |
Bogdan Marinescu |
0:a792d4bf36c2 | 64 | // Mutex operations |
Bogdan Marinescu |
0:a792d4bf36c2 | 65 | int equeue_mutex_create(equeue_mutex_t *m) { return 0; } |
Bogdan Marinescu |
0:a792d4bf36c2 | 66 | void equeue_mutex_destroy(equeue_mutex_t *m) { } |
Bogdan Marinescu |
0:a792d4bf36c2 | 67 | |
Bogdan Marinescu |
0:a792d4bf36c2 | 68 | void equeue_mutex_lock(equeue_mutex_t *m) { |
Bogdan Marinescu |
0:a792d4bf36c2 | 69 | core_util_critical_section_enter(); |
Bogdan Marinescu |
0:a792d4bf36c2 | 70 | } |
Bogdan Marinescu |
0:a792d4bf36c2 | 71 | |
Bogdan Marinescu |
0:a792d4bf36c2 | 72 | void equeue_mutex_unlock(equeue_mutex_t *m) { |
Bogdan Marinescu |
0:a792d4bf36c2 | 73 | core_util_critical_section_exit(); |
Bogdan Marinescu |
0:a792d4bf36c2 | 74 | } |
Bogdan Marinescu |
0:a792d4bf36c2 | 75 | |
Bogdan Marinescu |
0:a792d4bf36c2 | 76 | |
Bogdan Marinescu |
0:a792d4bf36c2 | 77 | // Semaphore operations |
Bogdan Marinescu |
0:a792d4bf36c2 | 78 | #ifdef MBED_CONF_RTOS_PRESENT |
Bogdan Marinescu |
0:a792d4bf36c2 | 79 | |
Bogdan Marinescu |
0:a792d4bf36c2 | 80 | int equeue_sema_create(equeue_sema_t *s) { |
Bogdan Marinescu |
0:a792d4bf36c2 | 81 | MBED_ASSERT(sizeof(equeue_sema_t) >= sizeof(Semaphore)); |
Bogdan Marinescu |
0:a792d4bf36c2 | 82 | new (s) Semaphore(0); |
Bogdan Marinescu |
0:a792d4bf36c2 | 83 | return 0; |
Bogdan Marinescu |
0:a792d4bf36c2 | 84 | } |
Bogdan Marinescu |
0:a792d4bf36c2 | 85 | |
Bogdan Marinescu |
0:a792d4bf36c2 | 86 | void equeue_sema_destroy(equeue_sema_t *s) { |
Bogdan Marinescu |
0:a792d4bf36c2 | 87 | reinterpret_cast<Semaphore*>(s)->~Semaphore(); |
Bogdan Marinescu |
0:a792d4bf36c2 | 88 | } |
Bogdan Marinescu |
0:a792d4bf36c2 | 89 | |
Bogdan Marinescu |
0:a792d4bf36c2 | 90 | void equeue_sema_signal(equeue_sema_t *s) { |
Bogdan Marinescu |
0:a792d4bf36c2 | 91 | reinterpret_cast<Semaphore*>(s)->release(); |
Bogdan Marinescu |
0:a792d4bf36c2 | 92 | } |
Bogdan Marinescu |
0:a792d4bf36c2 | 93 | |
Bogdan Marinescu |
0:a792d4bf36c2 | 94 | bool equeue_sema_wait(equeue_sema_t *s, int ms) { |
Bogdan Marinescu |
0:a792d4bf36c2 | 95 | if (ms < 0) { |
Bogdan Marinescu |
0:a792d4bf36c2 | 96 | ms = osWaitForever; |
Bogdan Marinescu |
0:a792d4bf36c2 | 97 | } |
Bogdan Marinescu |
0:a792d4bf36c2 | 98 | |
Bogdan Marinescu |
0:a792d4bf36c2 | 99 | return (reinterpret_cast<Semaphore*>(s)->wait(ms) > 0); |
Bogdan Marinescu |
0:a792d4bf36c2 | 100 | } |
Bogdan Marinescu |
0:a792d4bf36c2 | 101 | |
Bogdan Marinescu |
0:a792d4bf36c2 | 102 | #else |
Bogdan Marinescu |
0:a792d4bf36c2 | 103 | |
Bogdan Marinescu |
0:a792d4bf36c2 | 104 | // Semaphore operations |
Bogdan Marinescu |
0:a792d4bf36c2 | 105 | int equeue_sema_create(equeue_sema_t *s) { |
Bogdan Marinescu |
0:a792d4bf36c2 | 106 | *s = false; |
Bogdan Marinescu |
0:a792d4bf36c2 | 107 | return 0; |
Bogdan Marinescu |
0:a792d4bf36c2 | 108 | } |
Bogdan Marinescu |
0:a792d4bf36c2 | 109 | |
Bogdan Marinescu |
0:a792d4bf36c2 | 110 | void equeue_sema_destroy(equeue_sema_t *s) { |
Bogdan Marinescu |
0:a792d4bf36c2 | 111 | } |
Bogdan Marinescu |
0:a792d4bf36c2 | 112 | |
Bogdan Marinescu |
0:a792d4bf36c2 | 113 | void equeue_sema_signal(equeue_sema_t *s) { |
Bogdan Marinescu |
0:a792d4bf36c2 | 114 | *s = 1; |
Bogdan Marinescu |
0:a792d4bf36c2 | 115 | } |
Bogdan Marinescu |
0:a792d4bf36c2 | 116 | |
Bogdan Marinescu |
0:a792d4bf36c2 | 117 | static void equeue_sema_timeout(equeue_sema_t *s) { |
Bogdan Marinescu |
0:a792d4bf36c2 | 118 | *s = -1; |
Bogdan Marinescu |
0:a792d4bf36c2 | 119 | } |
Bogdan Marinescu |
0:a792d4bf36c2 | 120 | |
Bogdan Marinescu |
0:a792d4bf36c2 | 121 | bool equeue_sema_wait(equeue_sema_t *s, int ms) { |
Bogdan Marinescu |
0:a792d4bf36c2 | 122 | int signal = 0; |
Bogdan Marinescu |
0:a792d4bf36c2 | 123 | Timeout timeout; |
Bogdan Marinescu |
0:a792d4bf36c2 | 124 | timeout.attach_us(s, equeue_sema_timeout, ms*1000); |
Bogdan Marinescu |
0:a792d4bf36c2 | 125 | |
Bogdan Marinescu |
0:a792d4bf36c2 | 126 | core_util_critical_section_enter(); |
Bogdan Marinescu |
0:a792d4bf36c2 | 127 | while (!*s) { |
Bogdan Marinescu |
0:a792d4bf36c2 | 128 | sleep(); |
Bogdan Marinescu |
0:a792d4bf36c2 | 129 | core_util_critical_section_exit(); |
Bogdan Marinescu |
0:a792d4bf36c2 | 130 | core_util_critical_section_enter(); |
Bogdan Marinescu |
0:a792d4bf36c2 | 131 | } |
Bogdan Marinescu |
0:a792d4bf36c2 | 132 | |
Bogdan Marinescu |
0:a792d4bf36c2 | 133 | signal = *s; |
Bogdan Marinescu |
0:a792d4bf36c2 | 134 | *s = false; |
Bogdan Marinescu |
0:a792d4bf36c2 | 135 | core_util_critical_section_exit(); |
Bogdan Marinescu |
0:a792d4bf36c2 | 136 | |
Bogdan Marinescu |
0:a792d4bf36c2 | 137 | return (signal > 0); |
Bogdan Marinescu |
0:a792d4bf36c2 | 138 | } |
Bogdan Marinescu |
0:a792d4bf36c2 | 139 | |
Bogdan Marinescu |
0:a792d4bf36c2 | 140 | #endif |
Bogdan Marinescu |
0:a792d4bf36c2 | 141 | |
Bogdan Marinescu |
0:a792d4bf36c2 | 142 | #endif |