Exemplo n.º 1
0
void mutex_lock(mutex_t* mutex)
{
    for(;;){
        if(__LDREXB(mutex) == MUTEX_LOCKED) continue;
        if(__STREXB(MUTEX_LOCKED, mutex) == 0) break;
    }
    __DMB();
}
Exemplo n.º 2
0
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;
}
Exemplo n.º 3
0
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;
}
Exemplo n.º 4
0
bool mutex_trylock(mutex_t* mutex)
{
    for(;;){
        if(__LDREXB(mutex) == MUTEX_LOCKED) return false;
        if(__STREXB(MUTEX_LOCKED, mutex) == 0) break;
    }
    __DMB();
    return true;
}
Exemplo n.º 5
0
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);
}
Exemplo n.º 6
0
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));
}
Exemplo n.º 7
0
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);
}
Exemplo n.º 8
0
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;
}
Exemplo n.º 9
0
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;
}
Exemplo n.º 10
0
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();
        }
    }
}