Forum: Mikrocontroller und Digitale Elektronik WinAVR optimiert Rückzuweisung an globale RAM-Zelle weg!


von MikroMan (Gast)


Lesenswert?

Hallo,

in einem C-Modul deklariere ich 3 globale RAM-Zellen.
Alle 3 RAM-Zellen werden im RAM allokiert. Ich sehe ihre Adressen im
Watch Fenster.

Eine ist eine reine Eingangsgröße und wird nicht verändert. Die anderen
beiden bekommen Werte aus prozeßlokalen (Register)RAM-Zellen
zugewiesen.

Zu Beginn der lss-Datei werden die RAM-Zellen "lds r30, 0x0076" etc.
an die Arbeitsregister zugewiesen. Am Ende des Codes werden die
Rechenergebnisse an die Register der "globalen" Variablen
zugewiesen.

Das Problem ist allerdings jetzt, daß die Inhalte der Register nicht
zurück ins RAM geschrieben werden. D.h. daß die RAM-Zellen dauerhaft
auf Null bleiben.

Ist ja schön, daß der Compiler RAM spart. Aber wie kann ich den
Compiler anweisen, daß er die Registerinhalte ins RAM zurückschreibt?

von Benedikt (Gast)


Lesenswert?

Variablen als volatile deklarieren.

von Karl H. (kbuchegg)


Lesenswert?

Hmm. Ich werd aus deiner Beschreibung nicht schlau, was
du da konkret gemacht hast, bzw. vor hast.
Könntest du uns einfach mal den Code zeigen? Falls
der zulang ist, könntest du einfach mal ein kurzes
Beispiel konstruieren?

von MikroMan (Gast)


Lesenswert?

Der Code sieht sinngemäß so aus:

u8 a,b,c;

void main void
{
 while(1)
 {
  b = a + 1;
  c = b;
 }
}

Bei voller Optimierung bleiben die berechneten Variable b und c in den
Arbeits Registern  und werden nicht an ihre RAM Adressen
zurückgeschrieben. Ich hätte aber gern die jeweils neu berechneten
Werte im RAM.

von Karl H. (kbuchegg)


Lesenswert?

volatile

von Karl H. (kbuchegg)


Lesenswert?

Sorry. Irrtuemlich auf Return gedrueckt

volatile u8 a,b,c;

volatile teilt dem Compiler mit, dass er sich mit
Optimierungen auf dieser Variable zurückhalten soll,
da es Zugriffe gibt, bzw. diese Variablen ihre Werte
ändern, die für den Compiler nicht detektierbar sind.
zb. eine Uhr die memory mapped betrieben wird: Die
Speicherzellen ändern ihre Werte, ohne das das für den
Compiler in irgendeiner Art und Weise ersichtlich ist.
Du hast den umgekehrten Fall.

von MikroMan (Gast)


Lesenswert?

Danke Leute!
Ich probiers gleich aus.

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.