www.mikrocontroller.net

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


Autor: Achim (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.
bool     LIPO_HV = false;

void eeprom_write_byte_save(uint8_t *__p, uint8_t __value)
{
  /*if (LIPO_HV)
    {
  */
      cli();
  
    eeprom_write_byte (__p,__value);
    sei();
  /*
  }
  else
  {
      blink_err();
  }
  */
}
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?

Autor: Peter (Gast)
Datum:

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

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wo im code wird LIPO_HV denn verändert?

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: 900ss D. (900ss)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Achim (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
uups, sorry, jetzt raff ich nix mehr. Die Compilatgröße ändert sich doch 
nicht mit volatile.
00000572: eeprom_write_word_save
291:      {
+00000572:   019C        MOVW      R18,R24        Copy register pair
292:        if (LIPO_HV)
+00000573:   91800078    LDS       R24,0x0078     Load direct from data space
+00000575:   2388        TST       R24            Test for Zero or Minus
+00000576:   F039        BREQ      PC+0x08        Branch if equal
294:            cli();
+00000577:   94F8        CLI                      Global Interrupt Disable
338: File not found
+00000578:   01C9        MOVW      R24,R18        Copy register pair
+00000579:   E34D        LDI       R20,0x3D       Load immediate
+0000057A:   E050        LDI       R21,0x00       Load immediate
+0000057B:   D1E4        RCALL     PC+0x01E5      Relative call subroutine
296:          sei();
+0000057C:   9478        SEI                      Global Interrupt Enable
+0000057D:   9508        RET                      Subroutine return
300:              blink_err();
+0000057E:   DB3E        RCALL     PC-0x04C1      Relative call subroutine
+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?

Autor: Achim (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: 900ss D. (900ss)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Achim (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: C-Kenner (Gast)
Datum:

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

Autor: 900ss D. (900ss)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.