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


von Pier S. (bigpier)


Angehängte Dateien:

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
1
uint16_t test ;
2
uint8_t  dataRX[20];
3
4
if (flag & (1<<RxComp))
5
    {
6
      cli();
7
      
8
      test = ((dataRX[4] << 8) | dataRX[3]);
9
      OCR1A = test;
10
      flag &= ~(1<<RxComp);
11
      sei();
12
    }
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

von Pier S. (bigpier)


Lesenswert?

Entschuldigung für den Doppelten Anhang !

Peter

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Pier S. schrieb:
> Entschuldigung für den Doppelten Anhang !

Hab ich gelöscht.

von Pier S. (bigpier)


Lesenswert?

Danke!

von andreas r. (Gast)


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.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


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.

von Pier S. (bigpier)


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

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.