Merge pull request #11452 from maribu/atmega_irq
cpu/atmega_common: Bugfixes in irq_arch.c
This commit is contained in:
commit
abc25f0715
@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user