Forum: Compiler & IDEs Bug oder richtiges verhalten?


von Sylwester S. (sylwester)


Lesenswert?

Moin,

Ich benutze den gcc version 4.3.4 (GCC) unter Unix.
Mir ist folgendes aufgefallen:

Sagen wir mal, wir haben einen Source-Code wie z.B.
1
#include <avr/io.h>
2
#include "main.h"
3
4
int main(void)
5
{
6
        DDRD = 0xFF;
7
        PORTD = 0xFF;
8
        return 0;
9
}

und kompilieren diesen mit:
1
[...]
2
avr-gcc -c -mmcu=atmega8 -I. -gstabs   -O2 -Wall -Wstrict-prototypes -std=gnu99 -Wa,-adhlns=main.lst -DF_CPU=16000000UL -Wl,--relax,--gc-sections main.c -o main.o 
3
avr-gcc -mmcu=atmega8 -I. -gstabs   -O2 -Wall -Wstrict-prototypes -std=gnu99 -Wa,-adhlns=main.o -DF_CPU=16000000UL -Wl,--relax,--gc-sections main.o   --output main.elf     -lm

der Assembler-Dump (avr-objdump -d) zeigt jedoch in der main section:
1
[...]
2
0000005e <main>:
3
  5e:  8f ef         ldi  r24, 0xFF  ; 255
4
  60:  81 bb         out  0x11, r24  ; 17
5
  62:  82 bb         out  0x12, r24  ; 18
6
  64:  80 e0         ldi  r24, 0x00  ; 0
7
  66:  90 e0         ldi  r25, 0x00  ; 0
8
  68:  08 95         ret

Ich frage mich hierbei wofür ein ldi r25 (in 0x66) ausgeführt wird, wenn 
r25 hierbei gar nicht gebraucht wurde (auch nicht in den anderen 
sections).

Hab ich nicht aufgepasst, oder laeuft da etwas schief?

Gruß

von Gaast (Gast)


Lesenswert?

Das ist der return-value. int(0).

von Grrrr (Gast)


Lesenswert?

Ich verspreche die Frage zu beantworten, wenn Du mir zunächst erklärst 
wozu man in einem uC Programm in main ein return braucht.

von Flo (Gast)


Lesenswert?

int main(), also 16 bit beim avrgcc.
Der Rückgabewert muss den Dimensionen entsprechen also 2 x 8 bit.

von Sylwester S. (sylwester)


Lesenswert?

Gaast schrieb:
> Das ist der return-value. int(0).

Eigentlich habe ich "__attribute__((noreturn, naked))" als Attribut
fuer main() genutzt, hab mich jedoch automatisch vertippt (int statt 
void).

Danke.

von Sylwester S. (sylwester)


Lesenswert?

Grrrr schrieb:
> Ich verspreche die Frage zu beantworten, wenn Du mir zunächst erklärst
> wozu man in einem uC Programm in main ein return braucht.

Ja, ist ja gut..
Deshalb ja __attribute__((noreturn, naked))..

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.