www.mikrocontroller.net

Forum: Compiler & IDEs globales Reseten von Variablen auf Null


Autor: Bernd (Gast)
Datum:

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

Autor: yalu (Gast)
Datum:

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

Autor: Wolfgang Horn (Gast)
Datum:

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

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

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

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.