Hallo!
Habe da einen seltsamen "Effekt" bei meinem neuen Projekt:
Der folgende Code-schnipsel:
1 | void loop4ever(uint16_t *t);
|
2 | typedef struct test {
|
3 | void (*init)(uint16_t* t);
|
4 | } test_t;
|
5 | const test_t mytest __attribute__((progmem)) __attribute__((aligned (8))) = {
|
6 | .init=&loop4ever,
|
7 | };
|
8 | void loop4ever(uint16_t *t) { while(1) { t++;} }
|
produziert im gedumpten elf (avr-objdump -Dz main.elf):
1 | ...
|
2 | 00000088 <mytest>:
|
3 | 88: a6 00 .word 0x00a6 ; ????
|
4 | 8a: 00 00 nop
|
5 | 8c: 00 00 nop
|
6 | 8e: 00 00 nop
|
7 | ...
|
8 | 0000014c <loop4ever>:
|
9 | 14c: ff cf rjmp .-2 ; 0x14c <loop4ever>
|
man sieht, daß der Pointer in mytest eindeutig an eine falsche Adresse
zeigt (0x00a6 und nicht an 0x014c) - und ja, ich sehe es auch wenn ich
mir die Adresse von meinem Code auf USART ausgeben lasse...
Sitze ich da einem compiler/linker bug auf?
Denn IMO sollte der code eigentlich ja korrekte Pointer produzieren...
Hat jemand schon ein ähnliches Problem gehabt und auch vielleicht auch
gelöst?
Danke,
Martin
P.s: und das nicht funktionierende Alignment in C mit progmem sei hier
nur eine Randnotiz
P.s: der avr-gcc ist 4.7.0