[C] Compileroptimierung Abschnittweise abschalten

Herakles

Profifragensteller
Moin!

Ist es möglich, einen bestimmten Teil vom Compiler nicht optimieren zu lassen?

Angenommen, ich möchte ein Projekt mit "-O2" optimieren lassen, eine bestimmte Zeile (sagen wir beispielsweise eine Schleife) soll aber nicht wegoptimiert werden. Gibt es dafür ein Makro oder eine Präprozessor-Direktive?

Vielen Dank
Herakles
 
Hiermit wird's gemacht:

Code:
__attribute__((optimize(0)))

Schreibt man das vor eine Funktion, wird diese mit Optimierungslevel "0" optimiert. Die Info kommt von hier: gcc.gnu.org

Herakles
 
Fix deinen Code so das er keine Annahmen macht über den Compiler die gemäß C99 nicht zulässig sind. Suchst du vllt. das volatile Keyword?
 
Eine interessante Fragestellung. Danke fuer die Aufloesung der Antwort.
Funktioniert es sonst nicht? Was ist der genaue Grund?
 
Der Grund war dieser:

Ich habe ein Mikrocontroller-Projekt, das defaultmäßig auf "-O1" steht. Es ist ein "Example-Project" für den AVR32UC3A von Atmel, was sich in der Software AVRStudio5 - ebenfalls von Atmel - befindet.

Ich muss an einer bestimmten Stelle einen Pin auf high setzen, eine definierte Zeit warten und den Pin dann wieder auf low setzen. Da das Ganze vor dem Start des Schedulers passiert, kann ich meine Task nicht anhalten. Also muss ich das mit einer Schleife machen. Wenn ich aber eine Schleife á la

Code:
for(i=0;i<5;i++);

einfüge, dann optimiert der Compiler die komplett weg und ich habe gar keine Wartezeit erreicht. Setz ich aber die Optimierung auf "0", dann bleibt die Schleife vorhanden und die Kiste verzögert ein wenig.

Evtl. könnte ich sogar das ganze Projekt auf "-O0" laufen lassen. Da ich aber nicht weiß, ob und welche Auswirkungen das auf das Projekt hätte und ich auch nicht die Muße habe, mich in das Thema einzufuchsen(es soll nun einfach funktionieren), nehme ich eben eine Funktion von der Optimierung aus und fertig. Da die Funktion nur einmal beim Starten und danach nie wieder ausgeführt wird, habe ich dabei auch trockene Füße...

Soviel dazu, k_e_x :)
 
Herakles: Für sowas gibt es bestimmt ein delay Makro à la delay_ns(250). Dieses ist hoffentlich mit etwas Präprozessormagie und inline asm durch Loops und nop implementiert.
 
@Herakles

Wie Crest schon gesagt hat, dafuer gibt es entsprechende delay Funktionen, die jedoch nur eine gewisse Praezision sicherstellen koennen ab bestimmen Groessenordnungen.
Noch besser ist es, direkt einen Timer zu nutzen, da delay ein busy-wait macht.

Wenn es mal schnell gehen muss, ist die delay Funktion natuerlich voellig ok.

bei Mikrocontroller-Programmierung sollte man den Compiler gar nicht optimieren lassen!

Bitte aus welchem Grund? Bullshit^3.
 
Bei Microcontroller-Programmierung kann es meiner Meinung nach sehr hakelig werden,
wenn der Compiler optimiert, aber nur wenn man die Sprache und die damit zusammenhängenden,
erlaubten Compiler-Optimierungen nicht verstanden hat.

Ansonsten kannst du bei jeder Optimierungsstufe den Compiler dazu zwingen
Codeteile nicht (weg) zu optimieren.
 
Kamikaze: Entweder ist sein Code voll mit inline Assembler oder er will halt nur ne LED hin und wieder mal blinken lassen.
 
Zurück
Oben