Merge pull request #11452 from maribu/atmega_irq

cpu/atmega_common: Bugfixes in irq_arch.c
This commit is contained in:
Juan I Carrano 2019-09-10 13:39:53 +02:00 committed by GitHub
commit abc25f0715
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -52,7 +52,7 @@ __attribute__((always_inline)) inline void __set_interrupt_state(uint8_t state)
"out __SREG__, r15 \n\t"
:
: "g"(state)
: "r15", "r16");
: "r15", "r16", "memory");
}
/**
@ -61,7 +61,7 @@ __attribute__((always_inline)) inline void __set_interrupt_state(uint8_t state)
unsigned int irq_disable(void)
{
uint8_t mask = __get_interrupt_state();
cli();
cli(); /* <-- acts as memory barrier, see doc of avr-libc */
return (unsigned int) mask;
}
@ -70,8 +70,9 @@ unsigned int irq_disable(void)
*/
unsigned int irq_enable(void)
{
sei();
return __get_interrupt_state();
uint8_t mask = __get_interrupt_state();
sei(); /* <-- acts as memory barrier, see doc of avr-libc */
return mask;
}
/**
@ -87,5 +88,7 @@ void irq_restore(unsigned int state)
*/
int irq_is_in(void)
{
return __in_isr;
int result = __in_isr;
__asm__ volatile("" ::: "memory");
return result;
}