2222
2323#include < stdbool.h>
2424#include < string.h>
25+ #include " cmsis.h"
2526#include " platform/mbed_critical.h"
2627#include " drivers/Timer.h"
2728#include " drivers/Ticker.h"
3334using namespace mbed ;
3435
3536// Ticker operations
36- #if MBED_CONF_RTOS_PRESENT
37+ #if MBED_CONF_RTOS_API_PRESENT
38+
39+ #include " rtos/Kernel.h"
3740
3841unsigned equeue_tick ()
3942{
40- return osKernelGetTickCount ();
43+ return rtos::Kernel::get_ms_count ();
4144}
4245
4346#else
@@ -120,27 +123,28 @@ void equeue_mutex_unlock(equeue_mutex_t *m)
120123
121124
122125// Semaphore operations
123- #ifdef MBED_CONF_RTOS_PRESENT
126+ #ifdef MBED_CONF_RTOS_API_PRESENT
127+
128+ #include " rtos/EventFlags.h"
129+
130+ MBED_STATIC_ASSERT (sizeof (equeue_sema_t ) == sizeof(rtos::EventFlags), "equeue_sema_t / rtos::EventFlags mismatch");
124131
125132int equeue_sema_create (equeue_sema_t *s)
126133{
127- osEventFlagsAttr_t attr;
128- memset (&attr, 0 , sizeof (attr));
129- attr.cb_mem = &s->mem ;
130- attr.cb_size = sizeof (s->mem );
131-
132- s->id = osEventFlagsNew (&attr);
133- return !s->id ? -1 : 0 ;
134+ new (s) rtos::EventFlags (" equeue" );
135+ return 0 ;
134136}
135137
136138void equeue_sema_destroy (equeue_sema_t *s)
137139{
138- osEventFlagsDelete (s->id );
140+ rtos::EventFlags *ef = reinterpret_cast <rtos::EventFlags *>(s);
141+ ef->~EventFlags ();
139142}
140143
141144void equeue_sema_signal (equeue_sema_t *s)
142145{
143- osEventFlagsSet (s->id , 1 );
146+ rtos::EventFlags *ef = reinterpret_cast <rtos::EventFlags *>(s);
147+ ef->set (1 );
144148}
145149
146150bool equeue_sema_wait (equeue_sema_t *s, int ms)
@@ -149,15 +153,16 @@ bool equeue_sema_wait(equeue_sema_t *s, int ms)
149153 ms = osWaitForever;
150154 }
151155
152- return (osEventFlagsWait (s->id , 1 , osFlagsWaitAny, ms) == 1 );
156+ rtos::EventFlags *ef = reinterpret_cast <rtos::EventFlags *>(s);
157+ return ef->wait_any (1 , ms) == 1 ;
153158}
154159
155160#else
156161
157162// Semaphore operations
158163int equeue_sema_create (equeue_sema_t *s)
159164{
160- *s = false ;
165+ *s = 0 ;
161166 return 0 ;
162167}
163168
@@ -177,23 +182,21 @@ static void equeue_sema_timeout(equeue_sema_t *s)
177182
178183bool equeue_sema_wait (equeue_sema_t *s, int ms)
179184{
180- int signal = 0 ;
181185 ALIAS_TIMEOUT timeout;
182- if (ms == 0 ) {
183- return false ;
184- } else if (ms > 0 ) {
186+ if (ms > 0 ) {
185187 timeout.attach_us (callback (equeue_sema_timeout, s), (us_timestamp_t )ms * 1000 );
186188 }
187189
188190 core_util_critical_section_enter ();
189- while (!*s) {
191+ while (!*s && ms != 0 ) {
190192 sleep ();
191193 core_util_critical_section_exit ();
194+ __ISB ();
192195 core_util_critical_section_enter ();
193196 }
194197
195- signal = *s;
196- *s = false ;
198+ int signal = *s;
199+ *s = 0 ;
197200 core_util_critical_section_exit ();
198201
199202 return (signal > 0 );
0 commit comments