Forum: Compiler & IDEs WinAVR volatile und Optimierung - ich blick da nicht durch.


von Achim (Gast)


Lesenswert?

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?

von Peter (Gast)


Lesenswert?

da ja LIPO_HV = false ist, wird er den ganzen block wegoptimieren. Wird 
ja nie aufgerufen.

von Gast (Gast)


Lesenswert?

wo im code wird LIPO_HV denn verändert?

von Gast (Gast)


Lesenswert?

> 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.

von 900ss (900ss)


Lesenswert?

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

von Achim (Gast)


Lesenswert?

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?

von Achim (Gast)


Lesenswert?

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.

von 900ss (900ss)


Lesenswert?

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

von Achim (Gast)


Lesenswert?

@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

von C-Kenner (Gast)


Lesenswert?

Hier wird LIPO_HV niemals wegoptimiert, da es nicht statisch ist und 
demzufolge natürlich in der Objekt-Datei auftaucht!

von 900ss (900ss)


Lesenswert?

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

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.