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?
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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.