diff --git a/libcpu/avr32/uc3/exception.S b/libcpu/avr32/uc3/exception.S index dabd93d889c266878d4d9803bf4e484a463e3bf2..3146cc7734066f75f8cf0224cc5402498deb09da 100644 --- a/libcpu/avr32/uc3/exception.S +++ b/libcpu/avr32/uc3/exception.S @@ -202,16 +202,21 @@ _int\priority: call rt_interrupt_enter icall r12 call rt_interrupt_leave -_spint\priority: - lda.w r12, rt_thread_switch_interrupt_flag + ssrf AVR32_SR_GM_OFFSET /* Disable global interrupt */ + lda.w r12, rt_interrupt_nest /* Is nested interrupt? */ + ld.w r11, r12[0] + cp.w r11, 0 + brne _spint\priority + lda.w r12, rt_thread_switch_interrupt_flag /* Is thread switch required? */ ld.w r11, r12[0] cp.w r11, 1 breq rt_hw_context_switch_interrupt_do +_spint\priority: + csrf AVR32_SR_GM_OFFSET /* Enable global interrupt */ rete // If this was a spurious interrupt (R12 == NULL), return from event handler. .endr rt_hw_context_switch_interrupt_do: - ssrf AVR32_SR_GM_OFFSET /* Disable global interrupt */ mov r11, 0 st.w r12[0], r11 /* Clear rt_thread_switch_interrupt_flag */ stm --sp, r0-r7 /* Push R0-R7 */ diff --git a/libcpu/avr32/uc3/serial.c b/libcpu/avr32/uc3/serial.c index e68423353f505fa399fa027d7cef0fa0a2c6a965..3cefbd584310b6209e82e47dcbe34cb9dee91c41 100644 --- a/libcpu/avr32/uc3/serial.c +++ b/libcpu/avr32/uc3/serial.c @@ -160,7 +160,7 @@ static rt_size_t rt_serial_write (rt_device_t dev, rt_off_t pos, const void* buf /* write data directly */ while (size) { - while (usart_write_char(uart->uart_device, (int) *ptr) != USART_SUCCESS); + while (usart_bw_write_char(uart->uart_device, (int) *ptr) != USART_SUCCESS); ++ptr; --size; }