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
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.
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.
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.
Oha, das hatte ich komplett überlesen. Werde es mal versuchen. Sorry. Antworte per Handy, daher ohne Einloggen. Thomas
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.