mikrocontroller.net

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


Autor: MikroMan (Gast)
Datum:

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

Autor: Benedikt (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Variablen als volatile deklarieren.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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

Autor: MikroMan (Gast)
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
volatile

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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

Autor: MikroMan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke Leute!
Ich probiers gleich aus.

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.