Forum: Compiler & IDEs Methoden-Definition macht main() kaputt?


von gustaven (Gast)


Lesenswert?

Hallo,

ich habe ein ganz einfachtes Test-Programm, das eine LED zum leuchten 
bringt. Funktioniert auch. Wenn ich nun jedoch oberhalb der main() 
Methode eine neue Methode definiere, funktioniert gar nix mehr. Als 
würde die main() nie mehr aufgerufen!? Dabei ist egal, ob die neue 
Methode aufgerufen wird nicht.

Weiß jemand, woran das liegen kann?

Zum Beispiel:
Folgender Code funktioniert:
---------------------------
#include <avr/io.h>

int main(void) {

  DDRB = 0xff;
  PORTB = 0xff;

  PORTB &= ~ (1<<PB0);

  while(1)
  {
  }

  return 0;
}


folgender Code funktioniert nicht:
---------------------------------
#include <avr/io.h>

void myTestFunction(void) {
}

int main(void) {

  DDRB = 0xff;
  PORTB = 0xff;

  PORTB &= ~ (1<<PB0);

  while(1)
  {
  }

  return 0;
}

von Chris (Gast)


Lesenswert?

Wie sieht der generierte Assembler-Code in beiden Fällen aus (die 
.lss-Dateien, die avr-gcc auf Wunsch erzeugt)?


btw: "Methoden" ist ein Begriff aus der objekt-orientierten 
Programmierung, du meinst "Funktionen".

von gustaven (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

hier der *.lss Datei-Inhalt:

Funktionierender Code (Ohne Funktion-Definition):
------------------------------------------------
Bandtuner.elf:     file format elf32-avr

Sections:
Idx Name          Size      VMA       LMA       File off  Algn
  0 .text         000000dc  00000000  00000000  00000054  2**1
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
  1 .debug_aranges 00000020  00000000  00000000  00000130  2**0
                  CONTENTS, READONLY, DEBUGGING
  2 .debug_pubnames 0000001b  00000000  00000000  00000150  2**0
                  CONTENTS, READONLY, DEBUGGING
  3 .debug_info   00000076  00000000  00000000  0000016b  2**0
                  CONTENTS, READONLY, DEBUGGING
  4 .debug_abbrev 00000041  00000000  00000000  000001e1  2**0
                  CONTENTS, READONLY, DEBUGGING
  5 .debug_line   00000077  00000000  00000000  00000222  2**0
                  CONTENTS, READONLY, DEBUGGING
  6 .debug_frame  00000020  00000000  00000000  0000029c  2**2
                  CONTENTS, READONLY, DEBUGGING
  7 .debug_str    00000086  00000000  00000000  000002bc  2**0
                  CONTENTS, READONLY, DEBUGGING
Disassembly of section .text:

00000000 <__vectors>:
   0:  0c 94 46 00   jmp  0x8c  ; 0x8c <__ctors_end>
   4:  0c 94 65 00   jmp  0xca  ; 0xca <__bad_interrupt>
   8:  0c 94 65 00   jmp  0xca  ; 0xca <__bad_interrupt>
   c:  0c 94 65 00   jmp  0xca  ; 0xca <__bad_interrupt>
  10:  0c 94 65 00   jmp  0xca  ; 0xca <__bad_interrupt>
  14:  0c 94 65 00   jmp  0xca  ; 0xca <__bad_interrupt>
  18:  0c 94 65 00   jmp  0xca  ; 0xca <__bad_interrupt>
  1c:  0c 94 65 00   jmp  0xca  ; 0xca <__bad_interrupt>
  20:  0c 94 65 00   jmp  0xca  ; 0xca <__bad_interrupt>
  24:  0c 94 65 00   jmp  0xca  ; 0xca <__bad_interrupt>
  28:  0c 94 65 00   jmp  0xca  ; 0xca <__bad_interrupt>
  2c:  0c 94 65 00   jmp  0xca  ; 0xca <__bad_interrupt>
  30:  0c 94 65 00   jmp  0xca  ; 0xca <__bad_interrupt>
  34:  0c 94 65 00   jmp  0xca  ; 0xca <__bad_interrupt>
  38:  0c 94 65 00   jmp  0xca  ; 0xca <__bad_interrupt>
  3c:  0c 94 65 00   jmp  0xca  ; 0xca <__bad_interrupt>
  40:  0c 94 65 00   jmp  0xca  ; 0xca <__bad_interrupt>
  44:  0c 94 65 00   jmp  0xca  ; 0xca <__bad_interrupt>
  48:  0c 94 65 00   jmp  0xca  ; 0xca <__bad_interrupt>
  4c:  0c 94 65 00   jmp  0xca  ; 0xca <__bad_interrupt>
  50:  0c 94 65 00   jmp  0xca  ; 0xca <__bad_interrupt>
  54:  0c 94 65 00   jmp  0xca  ; 0xca <__bad_interrupt>
  58:  0c 94 65 00   jmp  0xca  ; 0xca <__bad_interrupt>
  5c:  0c 94 65 00   jmp  0xca  ; 0xca <__bad_interrupt>
  60:  0c 94 65 00   jmp  0xca  ; 0xca <__bad_interrupt>
  64:  0c 94 65 00   jmp  0xca  ; 0xca <__bad_interrupt>
  68:  0c 94 65 00   jmp  0xca  ; 0xca <__bad_interrupt>
  6c:  0c 94 65 00   jmp  0xca  ; 0xca <__bad_interrupt>
  70:  0c 94 65 00   jmp  0xca  ; 0xca <__bad_interrupt>
  74:  0c 94 65 00   jmp  0xca  ; 0xca <__bad_interrupt>
  78:  0c 94 65 00   jmp  0xca  ; 0xca <__bad_interrupt>
  7c:  0c 94 65 00   jmp  0xca  ; 0xca <__bad_interrupt>
  80:  0c 94 65 00   jmp  0xca  ; 0xca <__bad_interrupt>
  84:  0c 94 65 00   jmp  0xca  ; 0xca <__bad_interrupt>
  88:  0c 94 65 00   jmp  0xca  ; 0xca <__bad_interrupt>

0000008c <__ctors_end>:
  8c:  11 24         eor  r1, r1
  8e:  1f be         out  0x3f, r1  ; 63
  90:  cf ef         ldi  r28, 0xFF  ; 255
  92:  d0 e1         ldi  r29, 0x10  ; 16
  94:  de bf         out  0x3e, r29  ; 62
  96:  cd bf         out  0x3d, r28  ; 61

00000098 <__do_copy_data>:
  98:  11 e0         ldi  r17, 0x01  ; 1
  9a:  a0 e0         ldi  r26, 0x00  ; 0
  9c:  b1 e0         ldi  r27, 0x01  ; 1
  9e:  ec ed         ldi  r30, 0xDC  ; 220
  a0:  f0 e0         ldi  r31, 0x00  ; 0
  a2:  00 e0         ldi  r16, 0x00  ; 0
  a4:  0b bf         out  0x3b, r16  ; 59
  a6:  02 c0         rjmp  .+4        ; 0xac <__do_copy_data+0x14>
  a8:  07 90         elpm  r0, Z+
  aa:  0d 92         st  X+, r0
  ac:  a0 30         cpi  r26, 0x00  ; 0
  ae:  b1 07         cpc  r27, r17
  b0:  d9 f7         brne  .-10       ; 0xa8 <__do_copy_data+0x10>

000000b2 <__do_clear_bss>:
  b2:  11 e0         ldi  r17, 0x01  ; 1
  b4:  a0 e0         ldi  r26, 0x00  ; 0
  b6:  b1 e0         ldi  r27, 0x01  ; 1
  b8:  01 c0         rjmp  .+2        ; 0xbc <.do_clear_bss_start>

000000ba <.do_clear_bss_loop>:
  ba:  1d 92         st  X+, r1

000000bc <.do_clear_bss_start>:
  bc:  a0 30         cpi  r26, 0x00  ; 0
  be:  b1 07         cpc  r27, r17
  c0:  e1 f7         brne  .-8        ; 0xba <.do_clear_bss_loop>
  c2:  0e 94 67 00   call  0xce  ; 0xce <main>
  c6:  0c 94 6c 00   jmp  0xd8  ; 0xd8 <_exit>

000000ca <__bad_interrupt>:
  ca:  0c 94 00 00   jmp  0  ; 0x0 <__vectors>

000000ce <main>:
#include <avr/io.h>


int main(void) {
  ce:  8f ef         ldi  r24, 0xFF  ; 255
  d0:  87 bb         out  0x17, r24  ; 23

  DDRB = 0xff;
  PORTB = 0xff;
  d2:  88 bb         out  0x18, r24  ; 24

  PORTB &= ~ (1<<PB0);
  d4:  c0 98         cbi  0x18, 0  ; 24
  d6:  ff cf         rjmp  .-2        ; 0xd6 <main+0x8>

000000d8 <_exit>:
  d8:  f8 94         cli

000000da <__stop_program>:
  da:  ff cf         rjmp  .-2        ; 0xda <__stop_program>




Nicht funktionierender Code (mit Funktions-Definition):
---------------------------------------------------------
Bandtuner.elf:     file format elf32-avr

Sections:
Idx Name          Size      VMA       LMA       File off  Algn
  0 .text         000000de  00000000  00000000  00000054  2**1
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
  1 .debug_aranges 00000020  00000000  00000000  00000132  2**0
                  CONTENTS, READONLY, DEBUGGING
  2 .debug_pubnames 0000002e  00000000  00000000  00000152  2**0
                  CONTENTS, READONLY, DEBUGGING
  3 .debug_info   0000008a  00000000  00000000  00000180  2**0
                  CONTENTS, READONLY, DEBUGGING
  4 .debug_abbrev 00000056  00000000  00000000  0000020a  2**0
                  CONTENTS, READONLY, DEBUGGING
  5 .debug_line   00000087  00000000  00000000  00000260  2**0
                  CONTENTS, READONLY, DEBUGGING
  6 .debug_frame  00000030  00000000  00000000  000002e8  2**2
                  CONTENTS, READONLY, DEBUGGING
  7 .debug_str    00000095  00000000  00000000  00000318  2**0
                  CONTENTS, READONLY, DEBUGGING
Disassembly of section .text:

00000000 <__vectors>:
   0:  0c 94 46 00   jmp  0x8c  ; 0x8c <__ctors_end>
   4:  0c 94 65 00   jmp  0xca  ; 0xca <__bad_interrupt>
   8:  0c 94 65 00   jmp  0xca  ; 0xca <__bad_interrupt>
   c:  0c 94 65 00   jmp  0xca  ; 0xca <__bad_interrupt>
  10:  0c 94 65 00   jmp  0xca  ; 0xca <__bad_interrupt>
  14:  0c 94 65 00   jmp  0xca  ; 0xca <__bad_interrupt>
  18:  0c 94 65 00   jmp  0xca  ; 0xca <__bad_interrupt>
  1c:  0c 94 65 00   jmp  0xca  ; 0xca <__bad_interrupt>
  20:  0c 94 65 00   jmp  0xca  ; 0xca <__bad_interrupt>
  24:  0c 94 65 00   jmp  0xca  ; 0xca <__bad_interrupt>
  28:  0c 94 65 00   jmp  0xca  ; 0xca <__bad_interrupt>
  2c:  0c 94 65 00   jmp  0xca  ; 0xca <__bad_interrupt>
  30:  0c 94 65 00   jmp  0xca  ; 0xca <__bad_interrupt>
  34:  0c 94 65 00   jmp  0xca  ; 0xca <__bad_interrupt>
  38:  0c 94 65 00   jmp  0xca  ; 0xca <__bad_interrupt>
  3c:  0c 94 65 00   jmp  0xca  ; 0xca <__bad_interrupt>
  40:  0c 94 65 00   jmp  0xca  ; 0xca <__bad_interrupt>
  44:  0c 94 65 00   jmp  0xca  ; 0xca <__bad_interrupt>
  48:  0c 94 65 00   jmp  0xca  ; 0xca <__bad_interrupt>
  4c:  0c 94 65 00   jmp  0xca  ; 0xca <__bad_interrupt>
  50:  0c 94 65 00   jmp  0xca  ; 0xca <__bad_interrupt>
  54:  0c 94 65 00   jmp  0xca  ; 0xca <__bad_interrupt>
  58:  0c 94 65 00   jmp  0xca  ; 0xca <__bad_interrupt>
  5c:  0c 94 65 00   jmp  0xca  ; 0xca <__bad_interrupt>
  60:  0c 94 65 00   jmp  0xca  ; 0xca <__bad_interrupt>
  64:  0c 94 65 00   jmp  0xca  ; 0xca <__bad_interrupt>
  68:  0c 94 65 00   jmp  0xca  ; 0xca <__bad_interrupt>
  6c:  0c 94 65 00   jmp  0xca  ; 0xca <__bad_interrupt>
  70:  0c 94 65 00   jmp  0xca  ; 0xca <__bad_interrupt>
  74:  0c 94 65 00   jmp  0xca  ; 0xca <__bad_interrupt>
  78:  0c 94 65 00   jmp  0xca  ; 0xca <__bad_interrupt>
  7c:  0c 94 65 00   jmp  0xca  ; 0xca <__bad_interrupt>
  80:  0c 94 65 00   jmp  0xca  ; 0xca <__bad_interrupt>
  84:  0c 94 65 00   jmp  0xca  ; 0xca <__bad_interrupt>
  88:  0c 94 65 00   jmp  0xca  ; 0xca <__bad_interrupt>

0000008c <__ctors_end>:
  8c:  11 24         eor  r1, r1
  8e:  1f be         out  0x3f, r1  ; 63
  90:  cf ef         ldi  r28, 0xFF  ; 255
  92:  d0 e1         ldi  r29, 0x10  ; 16
  94:  de bf         out  0x3e, r29  ; 62
  96:  cd bf         out  0x3d, r28  ; 61

00000098 <__do_copy_data>:
  98:  11 e0         ldi  r17, 0x01  ; 1
  9a:  a0 e0         ldi  r26, 0x00  ; 0
  9c:  b1 e0         ldi  r27, 0x01  ; 1
  9e:  ee ed         ldi  r30, 0xDE  ; 222
  a0:  f0 e0         ldi  r31, 0x00  ; 0
  a2:  00 e0         ldi  r16, 0x00  ; 0
  a4:  0b bf         out  0x3b, r16  ; 59
  a6:  02 c0         rjmp  .+4        ; 0xac <__do_copy_data+0x14>
  a8:  07 90         elpm  r0, Z+
  aa:  0d 92         st  X+, r0
  ac:  a0 30         cpi  r26, 0x00  ; 0
  ae:  b1 07         cpc  r27, r17
  b0:  d9 f7         brne  .-10       ; 0xa8 <__do_copy_data+0x10>

000000b2 <__do_clear_bss>:
  b2:  11 e0         ldi  r17, 0x01  ; 1
  b4:  a0 e0         ldi  r26, 0x00  ; 0
  b6:  b1 e0         ldi  r27, 0x01  ; 1
  b8:  01 c0         rjmp  .+2        ; 0xbc <.do_clear_bss_start>

000000ba <.do_clear_bss_loop>:
  ba:  1d 92         st  X+, r1

000000bc <.do_clear_bss_start>:
  bc:  a0 30         cpi  r26, 0x00  ; 0
  be:  b1 07         cpc  r27, r17
  c0:  e1 f7         brne  .-8        ; 0xba <.do_clear_bss_loop>
  c2:  0e 94 68 00   call  0xd0  ; 0xd0 <main>
  c6:  0c 94 6d 00   jmp  0xda  ; 0xda <_exit>

000000ca <__bad_interrupt>:
  ca:  0c 94 00 00   jmp  0  ; 0x0 <__vectors>

000000ce <myTestFunction>:
#include <avr/io.h>

void myTestFunction(void) {
  ce:  08 95         ret

000000d0 <main>:
}


int main(void) {
  d0:  8f ef         ldi  r24, 0xFF  ; 255
  d2:  87 bb         out  0x17, r24  ; 23

  DDRB = 0xff;
  PORTB = 0xff;
  d4:  88 bb         out  0x18, r24  ; 24

  PORTB &= ~ (1<<PB0);
  d6:  c0 98         cbi  0x18, 0  ; 24
  d8:  ff cf         rjmp  .-2        ; 0xd8 <main+0x8>

000000da <_exit>:
  da:  f8 94         cli

000000dc <__stop_program>:
  dc:  ff cf         rjmp  .-2        ; 0xdc <__stop_program>

von B e r n d W. (smiley46)


Lesenswert?

Ich seh auf die Schnelle keinen Fehler.
Aber könntest Du es mal so probieren?

#include <avr/io.h>

extern void myTestFunction(void);

int main(void) {

  DDRB = 0xff;
  PORTB = 0xff;

  PORTB &= ~ (1<<PB0);

  while(1)
  {
  }

  return 0;
}

void myTestFunction(void) {
}

von gustaven (Gast)


Lesenswert?

Hallo,

ja, mit extern klappts. Hab auch mal das Anmachen der LED in die Methode 
verschoben, funktioniert auch.

Aber, warum klappt die Funktions-Definition oberhalb der main() nicht?

von B e r n d W. (smiley46)


Lesenswert?

Bei der ersten Version liegt die Einspungadresse von main() bei 0xCE, 
bei der nicht funktionierenden liegt dort myTestFunction().

Kann es sein, dass das Programmiergerät nur die Funktionen, jedoch nicht 
die Startsequenz getauscht hat? Aber vorher muss man den AVR doch 
komplett löschen.

Arbeitest Du unter AVR-Studio mit dem Simulator? Kannst Du mal alle 
erzeugten Files löschen einschliesslich Object, Hex-Files ... Dann 
nochmal alles neu compilieren. Taucht der Fehler dann auch noch auf?

Gruss, Bernd

von gustaven (Gast)


Lesenswert?

Ich benutze AVR Studio 4 und PonyProg2000 über LPT.

Ich hatte das Programm auch paar mal mit dem Simulator gestartet.

Wie du sagtest, Bernd, habe ich alle Ausgabe-Dateien entfernt und neu 
gebaut -> Das Problem ist immer noch da.

Ich habe testweise auch ein neues AVR Studio-Projekt angelegt und nur 
den Source-Code kopiert -> Das Problem ist immer noch da.

Ich hab im PonyProg auch mal den Knopf "Erase all of the device to FF" 
ausprobiert -> Das Problem ist immer noch da.

Grüße,
gustaven

von gustaven (Gast)


Lesenswert?

Hallo,

ich hab den Fehler nun selbst gefunden:

Habe für den Atmega32 kompiliert (mit dem ich vorher rumgespielt hatte), 
obwohl ich aktuell einen AT90S4433 nutze.

Grüße,
gustaven

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.