Forum: Compiler & IDEs merkwürdiges Problem!


von Re T. (toobatch)


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

von Stefan B. (stefan) Benutzerseite


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.

von Re T. (toobatch)


Lesenswert?

wie kann ich sowas erfassen , das  der stack überläuft ?

von Stefan B. (stefan) Benutzerseite


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.

von NurEinGast (Gast)


Lesenswert?


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.