void mutex_lock(mutex_t* mutex) { for(;;){ if(__LDREXB(mutex) == MUTEX_LOCKED) continue; if(__STREXB(MUTEX_LOCKED, mutex) == 0) break; } __DMB(); }
uint8_t core_util_atomic_decr_u8(uint8_t *valuePtr, uint8_t delta) { uint8_t newValue; do { newValue = __LDREXB((volatile uint8_t*)valuePtr) - delta; } while (__STREXB(newValue, (volatile uint8_t*)valuePtr)); return newValue; }
uint8_t core_util_atomic_incr_u8(volatile uint8_t *valuePtr, uint8_t delta) { uint8_t newValue; do { newValue = __LDREXB(valuePtr) + delta; } while (__STREXB(newValue, valuePtr)); return newValue; }
bool mutex_trylock(mutex_t* mutex) { for(;;){ if(__LDREXB(mutex) == MUTEX_LOCKED) return false; if(__STREXB(MUTEX_LOCKED, mutex) == 0) break; } __DMB(); return true; }
bool core_util_atomic_cas_u8(uint8_t *ptr, uint8_t *expectedCurrentValue, uint8_t desiredValue) { uint8_t currentValue = __LDREXB((volatile uint8_t*)ptr); if (currentValue != *expectedCurrentValue) { *expectedCurrentValue = currentValue; __CLREX(); return false; } return !__STREXB(desiredValue, (volatile uint8_t*)ptr); }
static void rsch_pending_evt_set(rsch_prio_t prio) { volatile uint8_t rsch_pending_evt; // Dummy variable to prevent compilers from removing ldrex do { rsch_pending_evt = __LDREXB(&m_rsch_pending_evt); (void)rsch_pending_evt; } while (__STREXB((uint8_t)prio, &m_rsch_pending_evt)); }
bool atomic_cas<uint8_t>(uint8_t *ptr, uint8_t *expectedCurrentValue, uint8_t desiredValue) { uint8_t currentValue = __LDREXB(ptr); if (currentValue != *expectedCurrentValue) { *expectedCurrentValue = currentValue; __CLREX(); return false; } return !__STREXB(desiredValue, ptr); }
bool core_util_atomic_cas_u8(volatile uint8_t *ptr, uint8_t *expectedCurrentValue, uint8_t desiredValue) { do { uint8_t currentValue = __LDREXB(ptr); if (currentValue != *expectedCurrentValue) { *expectedCurrentValue = currentValue; __CLREX(); return false; } } while (__STREXB(desiredValue, ptr)); return true; }
static rsch_prio_t rsch_pending_evt_clear(void) { uint8_t evt_value; do { evt_value = __LDREXB(&m_rsch_pending_evt); } while (__STREXB(RSCH_EVT_NONE, &m_rsch_pending_evt)); return (rsch_prio_t)evt_value; }
void timer_check(void) { for (unsigned i = 0; i < NTIMERS; i++) { bool triggered = false; uint8_t tmp; do { tmp = __LDREXB(&timer[i].flags); triggered = (tmp & TIMER_FLAG_TRIGGERED); if (triggered) { tmp &= ~TIMER_FLAG_TRIGGERED; } } while (__STREXB(tmp, &timer[i].flags)); if (triggered) { timer[i].timer_fn(); } } }