[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
RE: [avr-libc-dev] Volatile not working?
From: |
Ron |
Subject: |
RE: [avr-libc-dev] Volatile not working? |
Date: |
Mon, 8 Jan 2007 20:03:22 +1100 |
> -----Original Message-----
> From: Ned Konz [mailto:address@hidden
> Sent: Monday, 8 January 2007 5:54 PM
> To: Ron
> Cc: address@hidden
> Subject: Re: [avr-libc-dev] Volatile not working?
>
>
> Ron wrote:
> > Hi Folks. I would have thought that with -Os the code below should
> > work.
> >
> > static volatile char* Ptr;
> > .
> > .
> > static Send(char* p)
> > {
> > if (p)
> > {
> > while (Ptr != NULL) {;}
> > Ptr = p;
> > UDR1 = *Ptr++;
> > }
> > }
> > .
> > .
> > SIGNAL(SIG_UART1_TRANS)
> > {
> > if (*Ptr == '\0')
> > Ptr = NULL;
> > else
> > UDR1 = *Ptr++;
> > }
> >
> > However, the while loop becomes:
> >
> > LDS R24,0x018D
> > LDS R25,0x018E
> > SBIW R24,0x00
> > BRNE PC-0x01
> >
> > The code is as expected with -O0. Version is 3.4.6. Something I'm
> > missing?
>
> Probably.
>
> You didn't declare Ptr to be volatile.
>
> Instead you declared Ptr to *point to* a volatile char.
>
> So in the while loop (while you're comparing Ptr to NULL) there's no
> reason to re-read Ptr because it's not volatile.
>
> --
> Ned Konz
> address@hidden
> http://bike-nomad.com
>
Yep, that was it. Thanks.
Ron