defining big types on avr-gcc
Massimiliano Cialdi
massimiliano.cialdi@powersoft.it
Tue Aug 3 15:26:00 GMT 2010
I use avr-gcc 4.4.4:
Using built-in specs.
Target: avr
Configured with: ../gcc-4.4.4/configure --target=avr
--enable-languages=c,c++ --disable-nls --disable-libssp --with-dwarf2
--prefix=/usr/local/cross-gcc-avr-4.4.4 --disable-threads --with-gnu-as
--with-gnu-ld
Thread model: single
gcc version 4.4.4 (GCC)
and my target is an ATMega32
I tried to define a type (only define, without allocate any variable):
typedef struct dummy
{
uint8_t data[9000];
} dummy_t;
typedef struct big_dummy
{
dummy_t bigdata[4];
dummy_t singledata;
} big_dummy_t;
I never allocate any big_dummy_t object. I use big_dummy_t only as
placeholder (I use offsetof() macro), only to calculate offsets of
object placed into a big extern serial flash memory.
I get the error from gcc:
error: size of array 'bigdata' is too large
it is 36000 bytes, bigger than 32KB.
after many tests I found a possible solution:
typedef struct dummy
{
uint8_t data[9000];
} dummy_t;
typedef struct big_dummy
{
union
{
dummy_t bigdata[0];
struct
{
dummy_t bigdata0;
dummy_t bigdata1;
dummy_t bigdata2;
dummy_t bigdata3;
};
};
dummy_t singledata;
} big_dummy_t;
now if I want the offset of a field I can do as follows:
uint16_t p = (uint16_t)&(((big_dummy_t*)0)->bigdata[3]);
This works, but if I wand offset of singledata:
uint16_t p = (uint16_t)&(((big_dummy_t*)0)->singledata);
I get a warning: 'integer overflow in expression'
but if I change in this way:
big_dummy_t *p = (big_dummy_t*)0;
uint16_t p = (uint16_t)&(p->singledata);
I get NO warning!!!
This looks incredible to me. I wonder why.
Is it a bug?
thanks
More information about the Gcc-help
mailing list