Пример #1
0
/*******************************************************************************
* Function Name  : USART1_IRQHandler
* Description    : This function handles USART1 global interrupt request.
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void USART1_IRQHandler(void)
{
	if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) {
		/* Send the received data to the PC Host*/
		USART_To_USB_Send_Data();
	}

	/* If overrun condition occurs, clear the ORE flag and recover communication */
	if (USART_GetFlagStatus(USART1, USART_FLAG_ORE) != RESET) {
		(void)USART_ReceiveData(USART1);
	}



#if	0
	uint32_t t=1;
	uint8_t value=1;
	uint8_t *addr=0;
	t = __STREXB(value,addr);
	(void) t;

	uint32_t u=1;
	uint16_t value2=1;
	uint16_t *addr2=0;
	u = __STREXH(value2,addr2);
	(void) u;

	uint32_t v=1;
	uint32_t value3=1;
	uint32_t *addr3=0;
	v = __STREXW(value3,addr3);
	(void) v;
#endif

}
Пример #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;
}
Пример #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;
}
Пример #4
0
void mutex_lock(mutex_t* mutex)
{
    for(;;){
        if(__LDREXB(mutex) == MUTEX_LOCKED) continue;
        if(__STREXB(MUTEX_LOCKED, mutex) == 0) break;
    }
    __DMB();
}
Пример #5
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;
}
Пример #6
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);
}
Пример #7
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));
}
Пример #8
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);
}
Пример #9
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;
}
Пример #10
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;
}
Пример #11
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();
        }
    }
}