@@ -167,6 +167,39 @@ bool core_util_atomic_cas_u32(volatile uint32_t *ptr, uint32_t *expectedCurrentV
167
167
return true;
168
168
}
169
169
170
+ uint8_t core_util_atomic_exchange_u8 (volatile uint8_t * valuePtr , uint8_t desiredValue )
171
+ {
172
+ MBED_BARRIER ();
173
+ uint8_t currentValue ;
174
+ do {
175
+ currentValue = __LDREXB (valuePtr );
176
+ } while (__STREXB (desiredValue , valuePtr ));
177
+ MBED_BARRIER ();
178
+ return currentValue ;
179
+ }
180
+
181
+ uint16_t core_util_atomic_exchange_u16 (volatile uint16_t * valuePtr , uint16_t desiredValue )
182
+ {
183
+ MBED_BARRIER ();
184
+ uint16_t currentValue ;
185
+ do {
186
+ currentValue = __LDREXH (valuePtr );
187
+ } while (__STREXH (desiredValue , valuePtr ));
188
+ MBED_BARRIER ();
189
+ return currentValue ;
190
+ }
191
+
192
+ uint32_t core_util_atomic_exchange_u32 (volatile uint32_t * valuePtr , uint32_t desiredValue )
193
+ {
194
+ MBED_BARRIER ();
195
+ uint32_t currentValue ;
196
+ do {
197
+ currentValue = __LDREXW (valuePtr );
198
+ } while (__STREXW (desiredValue , valuePtr ));
199
+ MBED_BARRIER ();
200
+ return currentValue ;
201
+ }
202
+
170
203
uint8_t core_util_atomic_incr_u8 (volatile uint8_t * valuePtr , uint8_t delta )
171
204
{
172
205
MBED_BARRIER ();
@@ -298,6 +331,34 @@ bool core_util_atomic_cas_u32(volatile uint32_t *ptr, uint32_t *expectedCurrentV
298
331
}
299
332
300
333
334
+ uint8_t core_util_atomic_exchange_u8 (volatile uint8_t * ptr , uint8_t desiredValue )
335
+ {
336
+ core_util_critical_section_enter ();
337
+ uint8_t currentValue = * ptr ;
338
+ * ptr = desiredValue ;
339
+ core_util_critical_section_exit ();
340
+ return currentValue ;
341
+ }
342
+
343
+ uint16_t core_util_atomic_exchange_u16 (volatile uint16_t * ptr , uint16_t desiredValue )
344
+ {
345
+ core_util_critical_section_enter ();
346
+ uint16_t currentValue = * ptr ;
347
+ * ptr = desiredValue ;
348
+ core_util_critical_section_exit ();
349
+ return currentValue ;
350
+ }
351
+
352
+ uint32_t core_util_atomic_exchange_u32 (volatile uint32_t * ptr , uint32_t desiredValue )
353
+ {
354
+ core_util_critical_section_enter ();
355
+ uint32_t currentValue = * ptr ;
356
+ * ptr = desiredValue ;
357
+ core_util_critical_section_exit ();
358
+ return currentValue ;
359
+ }
360
+
361
+
301
362
uint8_t core_util_atomic_incr_u8 (volatile uint8_t * valuePtr , uint8_t delta )
302
363
{
303
364
uint8_t newValue ;
@@ -377,6 +438,15 @@ void core_util_atomic_store_u64(volatile uint64_t *valuePtr, uint64_t desiredVal
377
438
core_util_critical_section_exit ();
378
439
}
379
440
441
+ uint64_t core_util_atomic_exchange_u64 (volatile uint64_t * valuePtr , uint64_t desiredValue )
442
+ {
443
+ core_util_critical_section_enter ();
444
+ uint64_t currentValue = * valuePtr ;
445
+ * valuePtr = desiredValue ;
446
+ core_util_critical_section_exit ();
447
+ return currentValue ;
448
+ }
449
+
380
450
bool core_util_atomic_cas_u64 (volatile uint64_t * ptr , uint64_t * expectedCurrentValue , uint64_t desiredValue )
381
451
{
382
452
bool success ;
@@ -414,6 +484,8 @@ uint64_t core_util_atomic_decr_u64(volatile uint64_t *valuePtr, uint64_t delta)
414
484
return newValue ;
415
485
}
416
486
487
+ MBED_STATIC_ASSERT (sizeof (void * ) == sizeof (uint32_t ), "Alas, pointers must be 32-bit" );
488
+
417
489
bool core_util_atomic_cas_ptr (void * volatile * ptr , void * * expectedCurrentValue , void * desiredValue )
418
490
{
419
491
return core_util_atomic_cas_u32 (
@@ -422,6 +494,11 @@ bool core_util_atomic_cas_ptr(void *volatile *ptr, void **expectedCurrentValue,
422
494
(uint32_t )desiredValue );
423
495
}
424
496
497
+ void * core_util_atomic_exchange_ptr (void * volatile * valuePtr , void * desiredValue )
498
+ {
499
+ return (void * )core_util_atomic_exchange_u32 ((volatile uint32_t * )valuePtr , (uint32_t )desiredValue );
500
+ }
501
+
425
502
void * core_util_atomic_incr_ptr (void * volatile * valuePtr , ptrdiff_t delta )
426
503
{
427
504
return (void * )core_util_atomic_incr_u32 ((volatile uint32_t * )valuePtr , (uint32_t )delta );
0 commit comments