Problem mit Optimirung -Os die zweite

OP #1543503
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
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
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

Eine eigene Frage? Dieser Thread ist über 16 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.