www.mikrocontroller.net

Forum: Compiler & IDEs Problem mit Optimirung -Os die zweite


Autor: Pier S. (bigpier)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
leider muss ich Euch nochmals belästigen aber ich habe den letzten Foren 
Eintrag Beitrag "Problem mit Optimirung -Os" zu früh 
beendet.(ohne Optimirung getestet) Ich habe immer noch Probleme mit 
folgendem Codeteil

uint16_t test ;
uint8_t  dataRX[20];

if (flag & (1<<RxComp))
    {
      cli();
      
      test = ((dataRX[4] << 8) | dataRX[3]);
      OCR1A = test;
      flag &= ~(1<<RxComp);
      sei();
    }
ich versteh einfach nicht wieso es ohne Optimierung funktioniert und mit 
Optimierung die Daten zwar in dataRx vorhanden sind (online Debugger)
aber test trotzdem 0 bleibt!

ich hänge das Projekt mal als zip bei.

Vielen Herzlichen Dank

Peter

Autor: Pier S. (bigpier)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Entschuldigung für den Doppelten Anhang !

Peter

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Pier S. schrieb:
> Entschuldigung für den Doppelten Anhang !

Hab ich gelöscht.

Autor: Pier S. (bigpier)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke!

Autor: andreas r. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stichwort volatile:

dataRX[] riecht danach, also ob es im Interrupt "gefüllt" wird, oder?

falls das so ist, schlägt der Optimierer zu:

dataRX ist eine Globale Variable, und damit mit 0 initalisiert.
Da der Compiler keine Ahnung haben kann, wann ein Interrupt aufgerufen 
wird, geht er davon aus, dass er nicht statt findet, und folglich 
dadurch keine globalen Variablen geändert werden. Das nimmt sich der 
Optimierer zu Herzen und meint im Vorraus zu wissen, dass alle 
Lesevorgänge auf das Array 0 liefern, und man sie deshalb einsparen 
kann.

-> durch ein gezieltes "volatile" sagst du dem Compiler, dass er bei 
dieser Variable keine solchen Annahmen treffen darf.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nun, dein dataRX ist ja immer noch nicht "volatile" deklariert.
Damit kann aus Sicht des Compilers dessen Wert sich innerhalb
der Hauptschleife von main() nicht ändern, sodass er gleich die
Konstante 2000 substituiert.

extern-Deklarationen schreibt man übrigens nicht in die Funktionen
hinein, sondern sammelt sie in einem (oder mehreren) Headerfile,
das man dann mit #include überall in die Quellen reinzieht.  Das
zieht man auch dort mit rein (main.c), wo die Definition der auf
diese Weise deklarierten Objekte steht, damit der Compiler
Unstimmigkeiten zwischen der extern-Deklaration und der
tatsächlichen Definition erkennen und monieren kann.

Autor: Pier S. (bigpier)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Entschuldigung das ich erst jetzt schreibe.
Ich hab da wohl total verhedert (viel schäm)!!
Möchte mich für Eure Tips recht Herzlich bedanken .

Schönen Abend
Danke

Gruß

Peter

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.