@@ -116,6 +116,9 @@ u32_t sys_now(void) {
116
116
/* CMSIS-RTOS implementation of the lwip operating system abstraction */
117
117
#include "arch/sys_arch.h"
118
118
119
+ /* modulus subtract: (a - b) mod m, where a, b belongs to mod m ring */
120
+ #define SUB_MOD (a , b , m ) ((a) >= (b) ? (a) - (b) : (m) - (b) + (a))
121
+
119
122
/*---------------------------------------------------------------------------*
120
123
* Routine: sys_mbox_new
121
124
*---------------------------------------------------------------------------*
@@ -174,11 +177,11 @@ void sys_mbox_post(sys_mbox_t *mbox, void *msg) {
174
177
175
178
int state = osKernelLock ();
176
179
177
- mbox -> queue [mbox -> post_idx % MB_SIZE ] = msg ;
178
- mbox -> post_idx += 1 ;
180
+ mbox -> queue [mbox -> post_idx ] = msg ;
181
+ mbox -> post_idx = ( mbox -> post_idx + 1 ) % MB_SIZE ;
179
182
180
183
osEventFlagsSet (mbox -> id , SYS_MBOX_FETCH_EVENT );
181
- if (mbox -> post_idx - mbox -> fetch_idx = = MB_SIZE - 1 )
184
+ if (SUB_MOD ( mbox -> post_idx , mbox -> fetch_idx , MB_SIZE ) > = MB_SIZE - 1 )
182
185
osEventFlagsClear (mbox -> id , SYS_MBOX_POST_EVENT );
183
186
184
187
osKernelRestoreLock (state );
@@ -207,11 +210,11 @@ err_t sys_mbox_trypost(sys_mbox_t *mbox, void *msg) {
207
210
208
211
int state = osKernelLock ();
209
212
210
- mbox -> queue [mbox -> post_idx % MB_SIZE ] = msg ;
211
- mbox -> post_idx += 1 ;
213
+ mbox -> queue [mbox -> post_idx ] = msg ;
214
+ mbox -> post_idx = ( mbox -> post_idx + 1 ) % MB_SIZE ;
212
215
213
216
osEventFlagsSet (mbox -> id , SYS_MBOX_FETCH_EVENT );
214
- if (mbox -> post_idx - mbox -> fetch_idx = = MB_SIZE - 1 )
217
+ if (SUB_MOD ( mbox -> post_idx , mbox -> fetch_idx , MB_SIZE ) > = MB_SIZE - 1 )
215
218
osEventFlagsClear (mbox -> id , SYS_MBOX_POST_EVENT );
216
219
217
220
osKernelRestoreLock (state );
@@ -261,8 +264,8 @@ u32_t sys_arch_mbox_fetch(sys_mbox_t *mbox, void **msg, u32_t timeout) {
261
264
int state = osKernelLock ();
262
265
263
266
if (msg )
264
- * msg = mbox -> queue [mbox -> fetch_idx % MB_SIZE ];
265
- mbox -> fetch_idx += 1 ;
267
+ * msg = mbox -> queue [mbox -> fetch_idx ];
268
+ mbox -> fetch_idx = ( mbox -> fetch_idx + 1 ) % MB_SIZE ;
266
269
267
270
osEventFlagsSet (mbox -> id , SYS_MBOX_POST_EVENT );
268
271
if (mbox -> post_idx == mbox -> fetch_idx )
@@ -297,8 +300,8 @@ u32_t sys_arch_mbox_tryfetch(sys_mbox_t *mbox, void **msg) {
297
300
int state = osKernelLock ();
298
301
299
302
if (msg )
300
- * msg = mbox -> queue [mbox -> fetch_idx % MB_SIZE ];
301
- mbox -> fetch_idx += 1 ;
303
+ * msg = mbox -> queue [mbox -> fetch_idx ];
304
+ mbox -> fetch_idx = ( mbox -> fetch_idx + 1 ) % MB_SIZE ;
302
305
303
306
osEventFlagsSet (mbox -> id , SYS_MBOX_POST_EVENT );
304
307
if (mbox -> post_idx == mbox -> fetch_idx )
0 commit comments