www.mikrocontroller.net

Forum: Compiler & IDEs Crash bei Funkt. Aufruf


Autor: Helge Baurmann (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Florian Pfanner (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Helge Baurmann (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Joerg Wunsch (Gast)
Datum:

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.