[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [avr-gcc-list] gcc bug
From: |
Troy |
Subject: |
Re: [avr-gcc-list] gcc bug |
Date: |
Thu, 24 Jun 2004 11:07:55 -0700 (PDT) |
Thanks to all four who came up with the "volatile" reply.
Now it seems very obvious.
Thanks for being a great help.
Troy
>
> Hello
>
> Please try the following
>
> struct smotor { uint16_t count; };
> volatile struct smotor motor;
>
> This should generate the correct code.
> Volatile indicates that the variable is changed by the interrupt function.
> It's not possible for gcc to guess that the variable is changed by another
> function when you don't call the function directly. That is the case with
> interrupt functions.
>
> Cheers
> Rune
>
>
> > -----Original Message-----
> > From: address@hidden
> > [mailto:address@hidden On Behalf Of Troy
> > Sent: Wednesday, June 23, 2004 8:38 PM
> > To: address@hidden
> > Subject: [avr-gcc-list] gcc bug
> >
> >
> > Hi,
> >
> > I am writing on behalf of a friend who has a problem
> > with output from win-avr-gcc (I am writing on his behalf
> > because of language issues).
> >
> > The program has a global variable called "motor"
> > which is a struct containing a uint16_t variable
> > called "count."
> >
> > struct smotor { uint16_t count; } motor;
> >
> > main() {
> > // code to set up a timer which sets up a
> > // signal handler for SIG_OVERFLOW0.
> > ...
> > func();
> > // never returns from func().
> > }
> >
> > func() {
> > motor.count = 10;
> > while(motor.count > 0) {
> > ;
> > }
> > }
> >
> > signal(SIG_OVERFLOW0) {
> > if (motor.count) {
> > motor.count--;
> > }
> > }
> >
> >
> > The assembly code produced by gcc uses register R24 for "motor.count."
> > signal() stores R24 properly in data space, altering its
> > value to 0, as it should.
> > func() has the problem. It doesn't read R24 from data space
> > before each comparison, but instead treats it as a local
> > variable. This causes the
> > busy loop in func() to never exit.
> >
> > Optimizer options used were the default values for the
> > Makefile which came with the latest win-avr-gcc (downloaded
> > one month ago).
> >
> > If the code is altered to include further steps inside func()'s
> > while loop, the generated assembly code is different and
> > works properly. This is, however, not desirable.
> >
> > It seems like an error that the R24 variable's value is not
> > read from data space before each comparison, since it is a
> > global variable.
> >
> >
> >
> >
> > Thank you.
> >
> >
> >
> > Troy (on behalf of Timo)
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> > _______________________________________________
> > avr-gcc-list mailing list
> > address@hidden
> > http://www.avr1.org/mailman/listinfo/avr-gcc-list
> >
> > ---
> > Incoming mail is certified Virus Free.
> > Checked by AVG anti-virus system (http://www.grisoft.com).
> > Version: 6.0.710 / Virus Database: 466 - Release Date: 23-06-2004
> >
> >
>
> ---
> Outgoing mail is certified Virus Free.
> Checked by AVG anti-virus system (http://www.grisoft.com).
> Version: 6.0.710 / Virus Database: 466 - Release Date: 23-06-2004
>
>
>