Forum: Compiler & IDEs Crash bei Funkt. Aufruf


von Helge Baurmann (Gast)


Lesenswert?

Hallo,

ich fange gerade an mit dem AVR zu programmieren. Ich habe folgendes
festgestellt jedesmal wenn ich eine Funktion aufrufe stürzt (bleibt
stehen) das Programm ab. Habe ich was vergessen wie Stack
initialisieren.

Ich benutze WinAVR mit GCC 3.3.1
STK500 Board mit AtMega 128.
Ich habe das Makefile von WinAVR benutzt.

Grüße Helge

von Florian Pfanner (Gast)


Lesenswert?

Stell bitte mal deinen Code ins Forum. So kann ich dir sehr schlecht
weiterhelfen.
Stack o.ä. macht der Compiler normal von selbst.

Gruß, Florian

von Helge Baurmann (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

So anbei die die wichtigsten Daten. Ich habe mein Programm gekürzt
(Wollte einen UART programmieren)Der Effekt wohl der selbe. In dem
kurzen Testprogramm habe ich geshen das der Stack initialisiert wurde
und nach dem Rücksprung aus der Unterroutine bootet er neu. Push und
Pops habe ich in dem Assemblerfile nicht gesehen.

void test(void)
{
   BYTE led;
   WORD i,l;
   led = 0x80 | 0x40 | 0x20 | 0x10 ;   /* Test für Funktion test() */
   outp(~led, PORTB);   /* init variable representing the LED state */

  //wait
       for (i=0; i<0xFFFF; i++)   /* outer delay loop */
       l++;            /* just do something - could also be a NOP */

  i=0x55;  // fuer Debugging
  l=0x80;
}

void main(void)
{
   BYTE led;
   WORD i,l;
   outp(0xff,DDRB);            /* use all pins on PortB for output */

   led = 0x08 | 0x04 | 0x02 | 0x01;

  outp(~led, PORTB);   /* init variable representing the LED state */

  //wait
       for (i=0; i<0xFFFF; i++)   /* outer delay loop */
       l++;            /* just do something - could also be a NOP */

    test();

  led = 0x02;         /* setze neu fuer Funktions Ruecksprung */
  outp(~led, PORTB);   /* init variable representing the LED state */

  //sei();           /* Enable interrupts => enable UART interrupts */

/* aus Beispielsourcen kopiert */
   for (;;)
   {

       outp(~led, PORTB);      /* invert the output since a zero means:
LED on */
       led <<= 1;              /* move to next LED */
       if (!led)               /* overflow: start with Port B0 again
*/
           led = 1;
 //wait
       for (i=0; i<0xFFFF; i++)   /* outer delay loop */
       l++;            /* just do something - could also be a NOP */
   }
}

Danke und Grüße Helge

von Joerg Wunsch (Gast)


Lesenswert?

Außerdem hilft es natürlich, die FAQ zu lesen.  Es sollte mich nicht
wundern, wenn's die M103C fuse wäre...

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.