mikrocontroller.net

Forum: Compiler & IDEs Atmel Studio 7 Variablenverwaltung


Autor: Thomas B. (charly068)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich versuche mich gerade mal wieder an C und AVR. Ich habe schon ein 
paar winzige Programme geschrieben, aber jetzt komme ich einfach nicht 
weiter. Ich wollte mir auf die Schnelle mal eine kleine Uhr 
programmieren und habe mich dabei an Strukturen herangewagt. Aber 
irgendwie verwaltet der Debugger die Variablen nicht wie ich es erwarte. 
Ich habe die Uhrenfunktion mal herausgelöst um das Problem zu erkennen, 
leider ohne Erfolg.
Ich habe wegen der Zeilennummern mal einen Screenshot gemacht. Mein 
Problem ist, dass die Variablen im Programmlauf selbst in den Registern 
gehalten werden, wenn ich sie über die Watch-List aber abfrage bzw. auf 
einen Wert setze, dann geschieht dies im RAM.
Beispiel:
Z28 Inkrementieren der Sekunden erfolgt in R24 (0x0B), in der Watchlist 
ist die Adresse für "second" der Struct mit 0x0060 angegeben. Den Wert 
habe ich auf 50 gesetzt und ändert sich über die Laufzeit nicht.
Gehe ich mit dem Mauszeiger in Z29 über "second" erscheint "unknown 
identifier".
Testweise habe ich in Zeile 48 mal "minute" direkt gesetzt. Die Zeile 
wird im Simalator nicht angesprungen und ist im Assembling nicht 
vorhanden.

Um meine Herangehensweise zu testen, hatte ich zuvor alles mit einfachen 
Variablen aufgebaut. Da hat es funktioniert und ist in Resten noch 
vorhanden. Ich möchte aber gern die Ursache ermitteln.
Scheinbar sehe ich den Wald vor lauter Bäumen nicht.

Ich bin für jeden Tipp, der mich der Ursache näher bringt.

Danke schon mal.

Thomas

Autor: Stefanus F. (stefanus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Variablen sind normalerweise im RAM.

Aber die werden im Sinne der Performanceoptimierung oft in Register 
kopiert und dann benutzt der vom Compiler generierte Code nur noch die 
Register solange es geht. Ein typisches Beispiel:
int i=1;
printf("i=%d",i);

while (i<10)
{
    printf("i=%d",i);
    i++;
}

printf("i=%d",i);

Hier wird die Variable i zuerst in ein Register kopiert, dann wird die 
Schleife ein paar mal durchlaufen, und danach wird er letzte Wert (11) 
in die Variable zurück geschrieben.

Du hast zwei Möglichkeiten, diese Optimierung zu unterdrücken:

a) Durch Deaktivierung sämtlicher Optimierungen (gcc Parameter -O0)
b) Indem du der Variable das Schlüsselwort "volatile" voran stellst.

> Testweise habe ich in Zeile 48 mal "minute" direkt gesetzt. Die Zeile
> wird im Simalator nicht angesprungen und ist im Assembling nicht
> vorhanden.

Code, der letztendlich nichts bewirkt, wird vom Compiler ganz entfernt. 
Das betrifft auch das Ändern von (nicht volatilen) Variablen, wenn die 
anschließend nicht gelesen wird. Wenn du bei dem obigen Beispiel mit der 
While Schleife die printf() Aufrufe weg lässt, wird der Compiler den 
gesamten Quelltext weg optimieren, weil er nichts bewirkt.

Tu uns allen bitte einen Gefallen und benutze das Wort "Verwaltung" 
nicht. Das kann nämlich alles Mögliche bedeuten. Bei Verwaltung denke 
ich an die Hausverwaltung, die uns jedes Jahr mit einer netten 
Nebenkostenabrechnung beglückt.

: Bearbeitet durch User
Autor: Thomas B. (charly068)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Stefanus,

danke für deine schnelle Antwort. Ich werde das Wort Verwaltung in 
diesem Zusamenhang zukünftig meiden. :-)

Ich habe den Code jetzt komplett auf Pointerzugriff zur Struktur 
angpasst (außer zu Testzwecken für Sekunden) und siehe da, diese zuvor 
eleminierte Zeile wurde nun berücksichtigt. freu
Habe die Zeile nun wieder entfernt, da nur zum Test.

Der Code als solches funktioniert, nur wird die Struktur bereits mit 
Ausgangswerten definiert (struct Time  CLK_Time = {50,50,0,0};). Diese 
werden aber nicht berücksichtigt. Im Watch-Fenster bleiben sie während 
der Simulation unverändert, da die struct-Werte im Programmlauf in den 
Registern bleiben. Der Compiler sollte doch die Speicherorte der 
Variablen kennen und diese bei der Definition nicht im RAM ablegen, 
während sie zur Laufzeit in den Registern gehalten werden. Zumindest die 
Definitionswerte sollte er zuvor in die Register kopieren?

Ich glaube irgendeine Kleinigkeit mache ich da komplett falsch.

Autor: Stefanus F. (stefanus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Thomas B. schrieb:
> Ich glaube irgendeine Kleinigkeit mache ich da komplett falsch.

Allerdings: Du hast meine beiden Lösungsvorschläge völlig ignoriert. 
Meine Erklärung, warum es nicht funktioniert, ist immer noch gültig.

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oha, das hatte ich komplett überlesen. Werde es mal versuchen. Sorry.

Antworte per Handy, daher ohne Einloggen.

Thomas

Autor: GeKue (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stefanus, danke, ging mit ebenso wie Thomas.

Autor: Thomas B. (charly068)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Stefanus,

ich habe den Wald gefunden... Ein volatile hilft Wunder. Danke für deine 
schnelle Hilfe.

Thomas

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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.