Forum: Compiler & IDEs globales Reseten von Variablen auf Null


von Bernd (Gast)


Lesenswert?

beim Simulieren meiner Anwendung in AVR-Studio habe ich ständig 
irgendwelche Werte in Feldern, die ich (noch) nicht beschrieben habe.

es ist aufwendig, eine Löschfunktion für alle Variablen und Felder zu 
erstellen.
Gibts da einen Trick, mit dem alles bei Start der Simulation genullt 
wird?

von yalu (Gast)


Lesenswert?

Meinst du die Variablen des Simulationstools selbst oder diejenigen
des simulierten Anwendungsprogramms?

Mit ersterem kenn ich mich nicht aus. Falls letzteres:

Statische Variablen (also die lokalen mit "static" und alle globalen)
ohne expliziten Intialisierungswert werden beim Programmstart
automatisch genullt.

Automatische Variablen (also lokale ohne "static") werden beim
Eintritt in die Funktion, in der sie definiert sind, temporär auf dem
Stack erzeugt. Dies bedeutet, dass eine Initialisierung erst ab diesem
Zeitpunkt erfolgen kann. Eine "zentrale" Initialisierung beim
Programmstart ist damit nicht möglich. Man könnte zwar den Stack zu
Beginn komplett löschen, aber diese Nullen bekommen nur diejenigen
Funktionen zu Gesicht, die die entsprechenden Speicherstellen als
erste beschreiben.

von Wolfgang Horn (Gast)


Lesenswert?

Hi, Bernd

1. GNUAVR hat in jedem Power-on-Reset eine Routine, die sämtliche 
Stellen im SRAM und Registern löscht. Also: alle globalen Variablen 
starten bei 0.
2. Dasselbe gilt für alle static-Variablen in Deinen Funktionen. Sie 
werden auf Null gesetzt, es sei denn, Du hast einen Wert explizit 
angegeben.
3. Für lokale variablen in Funktionen kann das nicht gelten, da die vom 
Stack genommen werden, wo sie zuvor schon beschrieben waren. Da hilfen 
dann hzweo Strategien.
a) jeder lokalen Variable sofort einen wert zuweisen.
b) geduldig warten, bis diese Zuweisung erfolgt.

In meinen privaten Programmen mache ich b), in den beruflichen eher a), 
aber da spielen die Prozessorpreise auch keine Rolle.

mfg
Wolfgang Horn

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Du kannst auch zu Debugzwecken Code in die section .init3 einbauen, der
den gesamten RAM (es genügt, ab __bss_end zu schreiben) mit einem
Muster vorbelegt.  Das hat den zusätzlichen Vorteil, dass man an Hand
dieses Musters auch später feststellen kann, wie tief der Stack maximal
für einen bestimmten Programmlauf beschrieben worden ist.

Kann man ja in der Release-Version einfach per #ifdef wieder
rauskegeln.

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.