WinAVR volatile und Optimierung - ich blick da nicht durch.

Gast #1388561
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?
Gast #1388577
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.
#1388585
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
Gast #1388588
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?
#1388592
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
Gast #1388635
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
#1388772
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

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