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" "out __SREG__, r15 \n\t"
: :
: "g"(state) : "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) unsigned int irq_disable(void)
{ {
uint8_t mask = __get_interrupt_state(); uint8_t mask = __get_interrupt_state();
cli(); cli(); /* <-- acts as memory barrier, see doc of avr-libc */
return (unsigned int) mask; return (unsigned int) mask;
} }
@ -70,8 +70,9 @@ unsigned int irq_disable(void)
*/ */
unsigned int irq_enable(void) unsigned int irq_enable(void)
{ {
sei(); uint8_t mask = __get_interrupt_state();
return __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) int irq_is_in(void)
{ {
return __in_isr; int result = __in_isr;
__asm__ volatile("" ::: "memory");
return result;
} }