www.mikrocontroller.net

Forum: Compiler & IDEs merkwürdiges Problem!


Autor: Re To (toobatch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi, ich brauch hilfe ...

ich linke ein compiliertes >(selbstgeschriebenes)  modul zu einem 
bereits bestehendem projekt
hinzu und das gesamte programm macht nichtmehr was es machen soll, ob
wohl ersteinmal testweise überhaupt kein aufruf der funktionen in dem
neu hinzugefügten modul aus dem programm vorhanden sind ( auch keine IRQ
in dem neuen Modul).

was  ist dort schief gelaufen ??   ich mein eig. dürfte der code des
neuen moduls ja nie ausgeführt werden wenn ich ihn nicht aus dem
programm aufrufe oder ??


_
atmega2561 mit avr gcc

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Variablen aus dem hinzugelinkten Modul fressen aber Platz im RAM und 
können dazu beitragen, dass jetzt der Stack im RAM überläuft.

Autor: Re To (toobatch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wie kann ich sowas erfassen , das  der stack überläuft ?

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
"Kanarienvogel ins Programm einbauen"

Früher sind die Bergleute mit Kanarienvögeln (bzw. Singvögeln) in die 
Grube eingefahren und wenn die Tiere umkippten, wussten sie, dass 
tödliche Gase im Stollen stehen....

Programmierer bauen Kanarienvögel in den Programmen ein, die melden bzw. 
anzeigen, dass z.B. der Stack überläuft oder übergelaufen ist.

Das kann z.B. eine Variable mit auffälligem (magischem) Inhalt sein, die 
am Ende des kritischen Bereichs plaziert wird. Eine Routine prüft ab, ob 
die Variable noch den erwarteten Wert hat oder vom stack überschrieben 
wurde.

auf dem µC würde man als kritischen Bereich das z.B. Ende des 
Variablenbereichs wählen, also dort wo der Stack endet, wenn man keine 
dynamische Speocherverwaltung benutzt.

Wenn man malloc und Co. direkt oder indirekt (printf...) benutzt, muss 
man schauen, wo der Heap liegt, der von malloc benutzt wird und 
entsprechend die Stackobergrenze markieren. Näheres zu dem 
Speichermodell in der Doku der avr-libc.

Idealerweise verbraucht die Prüfroutine selbst keinen oder wenig Stack 
und wird regelmäßig genug aufgerufen. Das heisst die Prüfroutine kann 
nicht grossartig Ausgaben machen.

Ich kann mir vorstellen dafür einen Timer zu opfern oder mitzubenutzen 
und ggf. den µC tot umfallen zu lassen (Anzeige an einem Pin und µC 
anhalten). Bei mehr freien Resourcen kann man auch versuchen den 
aktuellen Stackpointer über eine Schnittstelle nach aussen zu geben.

Autor: NurEinGast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

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.