[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[avr-gcc-list] "Volatile"
From: |
Keith Gudger |
Subject: |
[avr-gcc-list] "Volatile" |
Date: |
Fri, 15 Apr 2005 13:48:27 -0700 (PDT) |
Those of us on this list all know the "volatile" drill - it's FAQ #1.
This is sort of the same issue, and I'm wondering if the code that "got
me" is as obvious as the other volatile stuff.
I have a volatile variable, "Flags", that is set and cleared in many
routines, including an interrupt. Here is the disassembly for the
Flags_Clear function:
00000f3e <Flags_Clear>:
f3e: 98 2f mov r25, r24
f40: 90 95 com r25
f42: 80 91 a4 00 lds r24, 0x00A4
f46: 89 23 and r24, r25 ; <- interrupt here
f48: 80 93 a4 00 sts 0x00A4, r24
f4c: 08 95 ret
The interrupt occured right before f46, and set the flag. The interrupt
pushed and popped r24 & r25's values, so when the interrupt returned to
f46, the flags were restored to their *previous* state (the flag unset!
Ack! I'm screwed!)
Two questions: 1) Is this something I should have learned in Embedded
101? If so, I"ll slink quitely away... and if not.. 2) How would the
experts on this list have prevented this?
Thank you.
Keith
- [avr-gcc-list] "Volatile",
Keith Gudger <=
- Re: [avr-gcc-list] "Volatile", E. Weddington, 2005/04/15
- Re: [avr-gcc-list] "Volatile", David Brown, 2005/04/17
- Re: [avr-gcc-list] "Volatile", Jeff Epler, 2005/04/17
- Re: [avr-gcc-list] "Volatile", David Brown, 2005/04/18
- Re: [avr-gcc-list] "Volatile", Graham Davies, 2005/04/18
- Re: [avr-gcc-list] "Volatile", David Brown, 2005/04/18
- Re: [avr-gcc-list] "Volatile", Keith Gudger, 2005/04/18
- Re: [avr-gcc-list] "Volatile", David Brown, 2005/04/18
- Re: [avr-gcc-list] "Volatile", David Kelly, 2005/04/18
- Re: [avr-gcc-list] "Volatile", David Brown, 2005/04/19