avr-gcc-list
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [avr-gcc-list] "Volatile"


From: Douglas Dotson
Subject: Re: [avr-gcc-list] "Volatile"
Date: Fri, 15 Apr 2005 17:39:06 -0700 (PDT)

You need to read up on critical sections and
mutual exclusion. Using the "Volatile" keyword
has nothing to do with the problem you are having.
Easirst solution is to disable interupts while
modifying the flag.

Doug

--- Keith Gudger <address@hidden> wrote:

> 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 mailing list
> address@hidden
>
http://lists.nongnu.org/mailman/listinfo/avr-gcc-list
> 





reply via email to

[Prev in Thread] Current Thread [Next in Thread]