@@ -124,15 +124,21 @@ u32_t sys_now(void) {
124
124
err_t sys_mbox_new (sys_mbox_t * mbox , int queue_sz ) {
125
125
if (queue_sz > MB_SIZE )
126
126
error ("sys_mbox_new size error\n" );
127
-
127
+
128
+ mbox -> post_idx = 0 ;
129
+ mbox -> fetch_idx = 0 ;
128
130
memset (mbox -> queue , 0 , sizeof (mbox -> queue ));
131
+
129
132
memset (& mbox -> data , 0 , sizeof (mbox -> data ));
130
- mbox -> attr .mq_mem = mbox -> queue ;
131
- mbox -> attr .mq_size = sizeof (mbox -> queue );
132
133
mbox -> attr .cb_mem = & mbox -> data ;
133
134
mbox -> attr .cb_size = sizeof (mbox -> data );
134
- mbox -> id = osMessageQueueNew (queue_sz , sizeof (void * ), & mbox -> attr );
135
- return (mbox -> id == NULL ) ? (ERR_MEM ) : (ERR_OK );
135
+ mbox -> id = osEventFlagsNew (& mbox -> attr );
136
+ if (mbox -> id == NULL )
137
+ error ("sys_mbox_new create error\n" );
138
+
139
+ osEventFlagsSet (mbox -> id , SYS_MBOX_POST_EVENT );
140
+
141
+ return ERR_OK ;
136
142
}
137
143
138
144
/*---------------------------------------------------------------------------*
@@ -146,7 +152,7 @@ err_t sys_mbox_new(sys_mbox_t *mbox, int queue_sz) {
146
152
* sys_mbox_t *mbox -- Handle of mailbox
147
153
*---------------------------------------------------------------------------*/
148
154
void sys_mbox_free (sys_mbox_t * mbox ) {
149
- if (osMessageQueueGetCount ( mbox -> id ) != 0 )
155
+ if (mbox -> post_idx != mbox -> fetch_idx )
150
156
error ("sys_mbox_free error\n" );
151
157
}
152
158
@@ -160,8 +166,19 @@ void sys_mbox_free(sys_mbox_t *mbox) {
160
166
* void *msg -- Pointer to data to post
161
167
*---------------------------------------------------------------------------*/
162
168
void sys_mbox_post (sys_mbox_t * mbox , void * msg ) {
163
- if (osMessageQueuePut (mbox -> id , & msg , 0 , osWaitForever ) != osOK )
164
- error ("sys_mbox_post error\n" );
169
+ osEventFlagsWait (mbox -> id , SYS_MBOX_POST_EVENT ,
170
+ osFlagsWaitAny | osFlagsNoClear , osWaitForever );
171
+
172
+ int state = osKernelLock ();
173
+
174
+ mbox -> queue [mbox -> post_idx % MB_SIZE ] = msg ;
175
+ mbox -> post_idx += 1 ;
176
+
177
+ osEventFlagsSet (mbox -> id , SYS_MBOX_FETCH_EVENT );
178
+ if (mbox -> post_idx - mbox -> fetch_idx == MB_SIZE - 1 )
179
+ osEventFlagsClear (mbox -> id , SYS_MBOX_POST_EVENT );
180
+
181
+ osKernelRestoreLock (state );
165
182
}
166
183
167
184
/*---------------------------------------------------------------------------*
@@ -178,8 +195,22 @@ void sys_mbox_post(sys_mbox_t *mbox, void *msg) {
178
195
* if not.
179
196
*---------------------------------------------------------------------------*/
180
197
err_t sys_mbox_trypost (sys_mbox_t * mbox , void * msg ) {
181
- osStatus_t status = osMessageQueuePut (mbox -> id , & msg , 0 , 0 );
182
- return (status == osOK ) ? (ERR_OK ) : (ERR_MEM );
198
+ uint32_t flags = osEventFlagsWait (mbox -> id , SYS_MBOX_POST_EVENT ,
199
+ osFlagsWaitAny | osFlagsNoClear , 0 );
200
+ if (!(flags & SYS_MBOX_POST_EVENT ))
201
+ return ERR_MEM ;
202
+
203
+ int state = osKernelLock ();
204
+
205
+ mbox -> queue [mbox -> post_idx % MB_SIZE ] = msg ;
206
+ mbox -> post_idx += 1 ;
207
+
208
+ osEventFlagsSet (mbox -> id , SYS_MBOX_FETCH_EVENT );
209
+ if (mbox -> post_idx - mbox -> fetch_idx == MB_SIZE - 1 )
210
+ osEventFlagsClear (mbox -> id , SYS_MBOX_POST_EVENT );
211
+
212
+ osKernelRestoreLock (state );
213
+ return ERR_OK ;
183
214
}
184
215
185
216
/*---------------------------------------------------------------------------*
@@ -208,12 +239,23 @@ err_t sys_mbox_trypost(sys_mbox_t *mbox, void *msg) {
208
239
* of milliseconds until received.
209
240
*---------------------------------------------------------------------------*/
210
241
u32_t sys_arch_mbox_fetch (sys_mbox_t * mbox , void * * msg , u32_t timeout ) {
211
- u32_t start = us_ticker_read ();
212
-
213
- osStatus_t res = osMessageQueueGet ( mbox -> id , msg , NULL , (timeout != 0 )?( timeout ):( osWaitForever ));
214
- if (res != osOK )
242
+ uint32_t start = us_ticker_read ();
243
+ uint32_t flags = osEventFlagsWait ( mbox -> id , SYS_MBOX_FETCH_EVENT ,
244
+ osFlagsWaitAny | osFlagsNoClear , (timeout ? timeout : osWaitForever ));
245
+ if (!( flags & SYS_MBOX_FETCH_EVENT ) )
215
246
return SYS_ARCH_TIMEOUT ;
216
247
248
+ int state = osKernelLock ();
249
+
250
+ if (msg )
251
+ * msg = mbox -> queue [mbox -> fetch_idx % MB_SIZE ];
252
+ mbox -> fetch_idx += 1 ;
253
+
254
+ osEventFlagsSet (mbox -> id , SYS_MBOX_POST_EVENT );
255
+ if (mbox -> post_idx == mbox -> fetch_idx )
256
+ osEventFlagsClear (mbox -> id , SYS_MBOX_FETCH_EVENT );
257
+
258
+ osKernelRestoreLock (state );
217
259
return (us_ticker_read () - start ) / 1000 ;
218
260
}
219
261
@@ -232,10 +274,22 @@ u32_t sys_arch_mbox_fetch(sys_mbox_t *mbox, void **msg, u32_t timeout) {
232
274
* return ERR_OK.
233
275
*---------------------------------------------------------------------------*/
234
276
u32_t sys_arch_mbox_tryfetch (sys_mbox_t * mbox , void * * msg ) {
235
- osStatus_t res = osMessageQueueGet (mbox -> id , msg , NULL , 0 );
236
- if (res != osOK )
277
+ uint32_t flags = osEventFlagsWait (mbox -> id , SYS_MBOX_FETCH_EVENT ,
278
+ osFlagsWaitAny | osFlagsNoClear , 0 );
279
+ if (!(flags & SYS_MBOX_FETCH_EVENT ))
237
280
return SYS_MBOX_EMPTY ;
238
281
282
+ int state = osKernelLock ();
283
+
284
+ if (msg )
285
+ * msg = mbox -> queue [mbox -> fetch_idx % MB_SIZE ];
286
+ mbox -> fetch_idx += 1 ;
287
+
288
+ osEventFlagsSet (mbox -> id , SYS_MBOX_POST_EVENT );
289
+ if (mbox -> post_idx == mbox -> fetch_idx )
290
+ osEventFlagsClear (mbox -> id , SYS_MBOX_FETCH_EVENT );
291
+
292
+ osKernelRestoreLock (state );
239
293
return ERR_OK ;
240
294
}
241
295
0 commit comments