Forum: Compiler & IDEs ARM GCC Optimierung auf Variablen


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von qwertz (Gast)


Lesenswert?

Hallo,

ich nutze den arm-none-eabi-gcc und stelle ein paar Überlegungen zur 
Verwendung von volatile bei der Deklaration von Variablen an.

Der Sinn, Zweck und Einsatz von volatile ist mir bewusst.
Allerdings schwingt immer die Aussage mit
"der Compiler kann eventuell eine Optimierung an Variablen vornehmen 
(z.B. caching)".

Hinsichtlich Optimierung gibt es zahlreiche Optionen:

https://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html

Aber Beispiele bezogen auf das Caching mit Verwendung/bzw. nicht 
Verwendung von volatile gibt es nur mit höheren Optimierungen (z.B. -O2 
oder -Os):

https://developer.arm.com/documentation/100748/0614/Writing-Optimized-Code/Effect-of-the-volatile-keyword-on-compiler-optimization

https://developer.arm.com/documentation/dui0472/c/compiler-coding-practices/compiler-optimization-and-the-volatile-keyword

Jetzt die Frage:
Kann die Optimierung von Variablen global verboten werden?
Welche Option(en) sind dafür zuständig?

Vielen Dank & Viele Grüße

von Oliver S. (oliverso)


Lesenswert?

qwertz schrieb:
> Kann die Optimierung von Variablen global verboten werden?

Nein.

qwertz schrieb:
> Welche Option(en) sind dafür zuständig?

-O0, aber ohne jegliche Garantie

qwertz schrieb:
> Der Sinn, Zweck und Einsatz von volatile ist mir bewusst.

Deine Frage lässt etwas anderes vermuten.

Und jetzt zur eigentlichen Frage: Was sind für dich Variablen, und was 
genau verstehst du unter deren Optimierung?
Oder: Was ist das eigentliche Problem, das du lösen musst?

Oliver

von Εrnst B. (ernst)


Lesenswert?

Probiers einfach mal aus, z.B:
1
// volatile
2
int x;
3
4
void test(){
5
    for (int i=0; i < 1000; ++i) {
6
        x++;
7
        // asm volatile("": : :"memory");
8
    }
9
}
mit dem Hintergedanken, dass eine ISR während dem Lauf von test() auf 
die Variable "x" zugreift.

Spoiler: Ohne volatile / ohne die Memory-Barrier compiliert der GCC das 
als "x+=1000". Die ISR wird also nie Zwischenwerte sehen können.

Ansonsten ist in diesem Beispiel egal, welche der Varianten man wählt.

Ich finde bei diesem Beispiel die Memory-Barrier eleganter, weil man 
exakt festlegen kann an welchen Stellen die Variable garantiert 
zurückgeschrieben sein muss, ohne gleich generell alle Optimierungen zu 
unterbinden.

Zum Spielen:

https://godbolt.org/z/zrKfvW8KE

von Nop (Gast)


Lesenswert?

qwertz schrieb:

> Jetzt die Frage:
> Kann die Optimierung von Variablen global verboten werden?

Nein, nicht zuverlässig, weil der C-Standard selber unter der "as 
if"-Regel steht. D.h. ein C-Compiler darf nach Standard tun, was immer 
er möchte, solange das extern beobachtbare Verhalten dasselbe bleibt.

Rein praktisch gesehen wird GCC bei -O0 keine solchen Optimierungen 
durchführen, aber garantiert ist es nicht.

Wenn Du den Sinn von volatile wirklich verstanden hättest, kämest Du gar 
nicht erst auf so eine Frage.

von Nop (Gast)


Lesenswert?

Εrnst B. schrieb:

> Ich finde bei diesem Beispiel die Memory-Barrier eleganter

Du hast aber keine verwendet, sondern nur eine compiler barrier.

von Εrnst B. (ernst)


Lesenswert?

Nop schrieb:
> Du hast aber keine verwendet, sondern nur eine compiler barrier.

hast Recht. Bei kleinen Single-Core ARMs macht das keinen relevanten 
Unterschied, aber ich hätte es trotzdem richtig bezeichnen sollen.

von qwertz (Gast)


Lesenswert?

Danke NOP.

von Rolf M. (rmagnus)


Lesenswert?

qwertz schrieb:
> Der Sinn, Zweck und Einsatz von volatile ist mir bewusst.
> Allerdings schwingt immer die Aussage mit
> "der Compiler kann eventuell eine Optimierung an Variablen vornehmen
> (z.B. caching)".

Diese beiden Sätze passen nicht recht zusammen, denn volatile ist gerade 
dazu da, dass der Compiler sowas nicht macht.

von Wilhelm M. (wimalopaan)


Lesenswert?

qwertz schrieb:
> Jetzt die Frage:
> Kann die Optimierung von Variablen global verboten werden?
> Welche Option(en) sind dafür zuständig?

Global auf Optimierung zu verzichten: -O0 (wurde schon oben gesagt).
Das wirst aber nicht wirklich wollen.

Und den Compiler zu zwingen, den Zugriff auf ein Objekt auszuführen, 
also genau nicht zu optimieren, dazu dient u.a. das Schlüsselwort 
volatile (das scheinst Du nicht verstanden zu haben).

: Bearbeitet durch User
von Hans (Gast)


Lesenswert?

qwertz schrieb:
> Der Sinn, Zweck und Einsatz von volatile ist mir bewusst.

Garantiert Nein. Du hast das Thema nicht verstanden.

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]
  • [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.

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