ARM GCC Optimierung auf Variablen

Gast #7069394
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
#7069428
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
#7069473
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
Gast #7069499
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.
#7070219
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).

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