Hallo, Ich hab heute wieder angefangen etwas mit dem ATTINY2313 zu basteln. Weil ich wenig Erfahrung mit C auf Mikrocontrollern hab, schau ich mir immer etwas genauer an, was der Compiler aus meinem C-Code macht. Das hilft mir einfach bei der Fehlersuche. Manchmal vergleiche ich auch, welche Variante eines Ausdrucks dabei den kleineren Code erzeugt. Dabei hab ich festgestellt, daß bestimmte Programmteile dopplet im Code vorkommen. Ich versteh nur nicht warum ! Die folgende Variante erzeugt ein 124 Byte langes Programm ----
1 | #include "avr/io.h" |
2 | #include "avr/portpins.h" |
3 | |
4 | static void init_display() { |
5 | DDRA|= _BV(PD1) | _BV(PD0); |
6 | DDRA|= _BV(PD1); |
7 | DDRA|= _BV(PD0); |
8 | DDRB|= _BV(PD2) | _BV(PD3) | _BV(PD4); |
9 | PORTB= _BV(PD2) | _BV(PD3) | _BV(PD4); |
10 | DDRD|= _BV(PD0) | _BV(PD1) | _BV(PD2) | _BV(PD3) | _BV(PD4) | _BV(PD5);// + P6; |
11 | }
|
12 | |
13 | // void init() { init_display(); }
|
14 | |
15 | int main(void) { |
16 | init_display(); |
17 | //init();
|
18 | while (-1) |
19 | asm("nop"); |
20 | }
|
---- Schachtle ich das Unterprogramm eine Ebene tiefer, so erzeugt der gcc ein 152 Byte langes Programm ----
1 | #include "avr/io.h" |
2 | #include "avr/portpins.h" |
3 | |
4 | static void init_display() { |
5 | DDRA|= _BV(PD1) | _BV(PD0); |
6 | DDRA|= _BV(PD1); |
7 | DDRA|= _BV(PD0); |
8 | DDRB|= _BV(PD2) | _BV(PD3) | _BV(PD4); |
9 | PORTB= _BV(PD2) | _BV(PD3) | _BV(PD4); |
10 | DDRD|= _BV(PD0) | _BV(PD1) | _BV(PD2) | _BV(PD3) | _BV(PD4) | |
11 | _BV(PD5);// + P6; |
12 | }
|
13 | |
14 | void init() { init_display(); } |
15 | |
16 | int main(void) { |
17 | //init_display();
|
18 | init(); |
19 | while (-1) |
20 | asm("nop"); |
21 | }
|
---- Dabei ist dann der Code für init_display() doppelt vorhanden Was mache ich falsch ? Andreas avr-gcc -Wall -g2 -gstabs -Os -fpack-struct -fshort-enums -std=gnu99 -funsigned-char -funsigned-bitfields -v -mmcu=attiny2313 -DF_CPU=8000000UL -MMD -MP -MF"main.d" -MT"main.d" -c -o"main.o" "../main.c"