Problem mit Optimirung -Os die zweite

OP #1543503
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
Angehängte Dateien:
Gast #1543561
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.
Moderator Persönliche Seite #1543562
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren