Skip to content

Commit 0113d84

Browse files
committed
Make events use RTOS API
Switch from CMSIS-RTOS to mbed C++ API, which are available in bare metal build. Other minor tidies, like removing unnecessary volatile.
1 parent edc6264 commit 0113d84

File tree

3 files changed

+36
-27
lines changed

3 files changed

+36
-27
lines changed

events/equeue/equeue_mbed.cpp

Lines changed: 23 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -33,11 +33,13 @@
3333
using namespace mbed;
3434

3535
// Ticker operations
36-
#if MBED_CONF_RTOS_PRESENT
36+
#if MBED_CONF_RTOS_API_PRESENT
37+
38+
#include "rtos/Kernel.h"
3739

3840
unsigned equeue_tick()
3941
{
40-
return osKernelGetTickCount();
42+
return rtos::Kernel::get_ms_count();
4143
}
4244

4345
#else
@@ -120,27 +122,28 @@ void equeue_mutex_unlock(equeue_mutex_t *m)
120122

121123

122124
// Semaphore operations
123-
#ifdef MBED_CONF_RTOS_PRESENT
125+
#ifdef MBED_CONF_RTOS_API_PRESENT
126+
127+
#include "rtos/EventFlags.h"
128+
129+
MBED_STATIC_ASSERT(sizeof(equeue_sema_t) == sizeof(rtos::EventFlags), "equeue_sema_t / rtos::EventFlags mismatch");
124130

125131
int equeue_sema_create(equeue_sema_t *s)
126132
{
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;
133+
new (s) rtos::EventFlags("equeue");
134+
return 0;
134135
}
135136

136137
void equeue_sema_destroy(equeue_sema_t *s)
137138
{
138-
osEventFlagsDelete(s->id);
139+
rtos::EventFlags *ef = reinterpret_cast<rtos::EventFlags *>(s);
140+
ef->~EventFlags();
139141
}
140142

141143
void equeue_sema_signal(equeue_sema_t *s)
142144
{
143-
osEventFlagsSet(s->id, 1);
145+
rtos::EventFlags *ef = reinterpret_cast<rtos::EventFlags *>(s);
146+
ef->set(1);
144147
}
145148

146149
bool equeue_sema_wait(equeue_sema_t *s, int ms)
@@ -149,15 +152,16 @@ bool equeue_sema_wait(equeue_sema_t *s, int ms)
149152
ms = osWaitForever;
150153
}
151154

152-
return (osEventFlagsWait(s->id, 1, osFlagsWaitAny, ms) == 1);
155+
rtos::EventFlags *ef = reinterpret_cast<rtos::EventFlags *>(s);
156+
return ef->wait_any(1, ms) == 1;
153157
}
154158

155159
#else
156160

157161
// Semaphore operations
158162
int equeue_sema_create(equeue_sema_t *s)
159163
{
160-
*s = false;
164+
*s = 0;
161165
return 0;
162166
}
163167

@@ -177,23 +181,21 @@ static void equeue_sema_timeout(equeue_sema_t *s)
177181

178182
bool equeue_sema_wait(equeue_sema_t *s, int ms)
179183
{
180-
int signal = 0;
181184
ALIAS_TIMEOUT timeout;
182-
if (ms == 0) {
183-
return false;
184-
} else if (ms > 0) {
185+
if (ms > 0) {
185186
timeout.attach_us(callback(equeue_sema_timeout, s), (us_timestamp_t)ms * 1000);
186187
}
187188

188189
core_util_critical_section_enter();
189-
while (!*s) {
190+
while (!*s && ms != 0) {
190191
sleep();
191192
core_util_critical_section_exit();
193+
_ISB();
192194
core_util_critical_section_enter();
193195
}
194196

195-
signal = *s;
196-
*s = false;
197+
int signal = *s;
198+
*s = 0;
197199
core_util_critical_section_exit();
198200

199201
return (signal > 0);

events/equeue/equeue_platform.h

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ extern "C" {
2626
#endif
2727

2828
#include <stdbool.h>
29+
#include <stdint.h>
2930

3031
// Currently supported platforms
3132
//
@@ -114,13 +115,19 @@ typedef struct equeue_sema {
114115
pthread_cond_t cond;
115116
bool signal;
116117
} equeue_sema_t;
117-
#elif defined(EQUEUE_PLATFORM_MBED) && defined(MBED_CONF_RTOS_PRESENT)
118+
#elif defined(EQUEUE_PLATFORM_MBED) && MBED_CONF_RTOS_API_PRESENT
118119
typedef struct equeue_sema {
119-
osEventFlagsId_t id;
120-
mbed_rtos_storage_event_flags_t mem;
120+
// We will actually store a C++ rtos:EventQueue in here;
121+
// attempt to match layout for storage, and assert size in equeue_mbed.cpp
122+
#if MBED_CONF_RTOS_PRESENT
123+
osEventFlagsId_t _id;
124+
mbed_rtos_storage_event_flags_t _obj_mem;
125+
#else
126+
uint32_t _flags;
127+
#endif
121128
} equeue_sema_t;
122129
#elif defined(EQUEUE_PLATFORM_MBED)
123-
typedef volatile int equeue_sema_t;
130+
typedef int equeue_sema_t;
124131
#endif
125132

126133
// Platform semaphore operations

rtos/EventFlags.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ namespace rtos {
3030

3131
EventFlags::EventFlags()
3232
{
33-
constructor();
33+
constructor("application_unnamed_event_flags");
3434
}
3535

3636
EventFlags::EventFlags(const char *name)
@@ -42,7 +42,7 @@ void EventFlags::constructor(const char *name)
4242
{
4343
#if MBED_CONF_RTOS_PRESENT
4444
osEventFlagsAttr_t attr = { 0 };
45-
attr.name = name ? name : "application_unnamed_event_flags";
45+
attr.name = name;
4646
attr.cb_mem = &_obj_mem;
4747
attr.cb_size = sizeof(_obj_mem);
4848
_id = osEventFlagsNew(&attr);

0 commit comments

Comments
 (0)