Skip to content

Commit 7227fed

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 18c9196 commit 7227fed

File tree

3 files changed

+37
-27
lines changed

3 files changed

+37
-27
lines changed

events/equeue/equeue_mbed.cpp

Lines changed: 24 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
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"
@@ -33,11 +34,13 @@
3334
using 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

3841
unsigned 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

125132
int 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

136138
void 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

141144
void 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

146150
bool 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
158163
int 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

178183
bool 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);

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)