Forum: Compiler & IDEs Atmel Studio 7 Variablenverwaltung


von Thomas B. (charly068)


Angehängte Dateien:

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

von Stefan F. (Gast)


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:
1
int i=1;
2
printf("i=%d",i);
3
4
while (i<10)
5
{
6
    printf("i=%d",i);
7
    i++;
8
}
9
10
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.

von Thomas B. (charly068)


Angehängte Dateien:

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.

von Stefan F. (Gast)


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.

von Thomas (Gast)


Lesenswert?

Oha, das hatte ich komplett überlesen. Werde es mal versuchen. Sorry.

Antworte per Handy, daher ohne Einloggen.

Thomas

von GeKue (Gast)


Lesenswert?

Stefanus, danke, ging mit ebenso wie Thomas.

von Thomas B. (charly068)


Lesenswert?

Hallo Stefanus,

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

Thomas

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.