Crash bei Funkt. Aufruf

Gast #76115
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
Gast
Stell bitte mal deinen Code ins Forum. So kann ich dir sehr schlecht
weiterhelfen.
Stack o.ä. macht der Compiler normal von selbst.

Gruß, Florian
Gast
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
Angehängte Dateien:

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 22 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.