Weddington, Eric wrote: > > > >> -----Original Message----- >> From: >> avr-gcc-list-bounces+eweddington=cso.atmel....@nongnu.org >> [mailto:avr-gcc-list-bounces+eweddington=cso.atmel....@nongnu. >> org] On Behalf Of Robert von Knobloch >> Sent: Monday, February 02, 2009 8:49 AM >> To: avr-gcc-list@nongnu.org >> Subject: [avr-gcc-list] Accessing function and strings in >> flash in theATMega 644 >> >> > > >> if (pgm_read_byte((PGM_P)(TESTIMAGE + (IMAGE_SIZE * projnum) + >> SIGNATURE) != 0)) >> > <snip> > >> Can anyone tell me a: why this does not work and/or what I am assuming >> that is wrong? >> > > Remember that pgm_read_byte() is a *macro* and not a function. And to top it > off, that macro generates inline assembly. You have a very complex expression > in the parameter portion of the macro. > > I strongly suggest that you take out the expression and assign it to another > variable, and just use that variable in place of the pgem_read_byte() > paramater. As a precaution, take out the call to pgm_read_byte() from the if > statement. > > Like so: > > address = (TESTIMAGE + (IMAGE_SIZE * projnum) + SIGNATURE); > byte = pgm_read_byte(address); > if (byte != 0) > { > // code > } > > See if that helps. > > Eric Weddington > > > Yes Eric, that produces quite sensible code that actually works. Thank you for the insight. Just two small questions:
1. Why is this 'too complex for the compiler' ? 2. How can I know when the compiler's complexity limit has been reached? (OK, I don't really expect you to be able to answer. It's just that I expect a compiler to relieve me of worrying about complex statements. The only complexity is really (IMAGE_SIZE * projnum), all the rest are just adding constants - in my simple view). Many thanks, Robert _______________________________________________ AVR-GCC-list mailing list AVR-GCC-list@nongnu.org http://lists.nongnu.org/mailman/listinfo/avr-gcc-list