WinAVR volatile und Optimierung - ich blick da nicht durch.

Gast #1388561
Hallo,
ich blich nicht ganz durch. Folgende Routine hat deutlich kleineres 
Compilat wenn ich /* wegnehme. Scheint dass WinAVR LIPO_HV wegoptimiert.
LIPO_HV wird aber in Main erst neu bestimmt.
1
bool     LIPO_HV = false;
2

3
void eeprom_write_byte_save(uint8_t *__p, uint8_t __value)
4
{
5
  /*if (LIPO_HV)
6
    {
7
  */
8
      cli();
9
  
10
    eeprom_write_byte (__p,__value);
11
    sei();
12
  /*
13
  }
14
  else
15
  {
16
      blink_err();
17
  }
18
  */
19
}
Wenn ich LIPO_HV volatile deklariere ist das nicht so.

Bisher habe ich soweit verstanden:
Volatile dann, wenn globale Variablen in ISR und Main benutzt werden.
Wie kann ich sicher wissen, welche Variablen ich volatile deklarieren 
muss?
Gast #1388577
> Wie kann ich sicher wissen, welche Variablen ich volatile deklarieren
> muss?

Antwort hast du dir doch bereits selber gegeben:

> Volatile dann, wenn globale Variablen in ISR und Main benutzt werden.

volatile hat aber mit dem von dir gezeigten Code Ausschnitt nix am Hut. 
Mehr Code.
#1388585
Der Compiler "sieht", dass du LIPO_HV=FALSE setzt. Wenn du jetzt die 
Kommentare entfernst, dann optimiert er dir den oberen if-Zweig weg 'if( 
LIPO_HV)', da er nicht erkennen kann, dass das evtl mal TRUE wird. Wofür 
also den oberen Zweig behalten, da er nie durchlaufen wird. Bei volatile 
geht er davon aus, dass LIPO_HV doch verändert werden kann.

Müsstest du auch im erzeugten Assembler erkennen können.

900ss
Gast #1388588
uups, sorry, jetzt raff ich nix mehr. Die Compilatgröße ändert sich doch 
nicht mit volatile.
1
00000572: eeprom_write_word_save
2
291:      {
3
+00000572:   019C        MOVW      R18,R24        Copy register pair
4
292:        if (LIPO_HV)
5
+00000573:   91800078    LDS       R24,0x0078     Load direct from data space
6
+00000575:   2388        TST       R24            Test for Zero or Minus
7
+00000576:   F039        BREQ      PC+0x08        Branch if equal
8
294:            cli();
9
+00000577:   94F8        CLI                      Global Interrupt Disable
10
338: File not found
11
+00000578:   01C9        MOVW      R24,R18        Copy register pair
12
+00000579:   E34D        LDI       R20,0x3D       Load immediate
13
+0000057A:   E050        LDI       R21,0x00       Load immediate
14
+0000057B:   D1E4        RCALL     PC+0x01E5      Relative call subroutine
15
296:          sei();
16
+0000057C:   9478        SEI                      Global Interrupt Enable
17
+0000057D:   9508        RET                      Subroutine return
18
300:              blink_err();
19
+0000057E:   DB3E        RCALL     PC-0x04C1      Relative call subroutine
20
+0000057F:   9508        RET
Und jetzt stimmt auch die Compilatgröße mit meinen Erwartungen 
überein...
Irgendwie hab ich manchmal unterschiedliche Größen und verstehe nicht 
warum.
Gibt es vielleicht einen Knackpunkt zwischen Build und Rebuild ALL in 
AVR-Studio?
Gast #1388591
Danke für die schnelle Hilfe!!!
Zur Komplettierung. LIPO_HV wird nur im Hauptprogramm geändert und die 
benannte Routine auch nur von Main aus aufgerufen.
#1388592
Achim schrieb:

> Gibt es vielleicht einen Knackpunkt zwischen Build und Rebuild ALL in
> AVR-Studio?

Rebuild All kompiliert dir IMMER alle Sourcefiles neu. Build nur die 
geänderten. Du mußt im AVR-Studio erst speichern, bevor du ein Build 
machst. Er speichert meines Wissens nicht automatisch. Dann kompiliert 
er dir die Änderungen auch nicht.

900ss
Gast #1388635
@900ss:
> Du mußt im AVR-Studio erst speichern, bevor du ein Build
> machst. Er speichert meines Wissens nicht automatisch. Dann kompiliert
> er dir die Änderungen auch nicht.

danke für den Tip. Ich habe aber festgestellt dass es wohl nichts macht, 
da die Version im Editor compiliert wird und auch auf die Platte 
geschrieben wird.

Grüße
Achim
#1388772
C-Kenner schrieb:
> Hier wird LIPO_HV niemals wegoptimiert, da es nicht statisch ist und
> demzufolge natürlich in der Objekt-Datei auftaucht!

Wo er Recht hat hat er Recht. Das hatte ich übersehen. Wird nicht 
wegoptimiert. Sorry für die Fehlinformation.

900ss

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 17 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.