Forum: Compiler & IDEs Optimierung im code ein- und ausschalten


von Alexxx (Gast)


Lesenswert?

Hallo,

wenn ich folgenden Xmega-Code ohne Optimierung (wg. Debugmöglichkeit) 
übersetze, funktioniert er nicht, weil das geschützte Register nach der 
CCP-Zuweisung nur für 4 Befehle freigeschaltet ist, der Compiler aber so 
umständlich übersetzt, dass 5 Befehle nötig sind:

             CCP= CCP_IOREG_gc;
0000018B  LDI R24,0x34            Load immediate
0000018C  LDI R25,0x00            Load immediate
0000018D  LDI R18,0xD8            Load immediate
0000018E  MOVW R30,R24            Copy register pair
0000018F  STD Z+0,R18             Store indirect with displacement
             CLK.CTRL= CLK_SCLKSEL_PLL_gc;
00000190  LDI R24,0x40            Load immediate
00000191  LDI R25,0x00            Load immediate
00000192  LDI R18,0x04            Load immediate
00000193  MOVW R30,R24            Copy register pair //Warum so 
umständlich?
00000194  STD Z+0,R18             Store indirect with displacement

Wenn ich die Optimierung einschalte, lässt sich das Programm praktisch 
nicht mehr Debuggen.

Kann ich im C-Code die Optimierung nur für die beiden Zeilen 
einschalten?
Ich habe keine funktionierende (Präprozessor-?) Anweisung gefunden.

PS: Ich muss zugeben, dass mir bis jetzt ein Makefile zu 
undurchsichtig/umständlich ist.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Ein gangbarer Mittelweg ist u.U. -O1.

Auf Funktionsebene lässt sich Optimierung mittels 
Pragma/Function-Attribut umstellen -- entsprechende GCC-Version 
vorausgesetzt.

http://gcc.gnu.org/onlinedocs/gcc/Function-Specific-Option-Pragmas.html#Function-Specific-Option-Pragmas

von Bernhard R. (barnyhh)


Lesenswert?

Wenn die 2 C-Instruktionen in einem separaten Sourcefile - umgewandelt 
mit der erforderlichen Optimierung - stehen, dann sollte es doch 
funktionieren.
Alternative: Assembler.

Bernhard

von Alexxx (Gast)


Lesenswert?

Danke für die Tips!
Ich habe die Funktion mit #pragma GCC optimize("-Os") übersetzt, jetzt 
geht es.

Was ich mich nur frage, warum GCC ohne Optimierung einen so extrem 
umständlichen Code produziert??
Registerverschwendung und Codegröße maximal!

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Alexxx schrieb:

> Was ich mich nur frage, warum GCC ohne Optimierung einen so extrem
> umständlichen Code produziert??

Weil er erst einmal nur formal den Algorithmus herunter codiert.

> Registerverschwendung und Codegröße maximal!

Dafür gibt's doch schließlich die Optimierung, deren Aufgabe ist es,
den formalen und umständlichen Code in einen möglichst kleinen und/
oder schnellen zu wandeln.  Wenn du diese aber explizit ausschaltest,
weil entweder du oder dein Debugger nicht in der Lage sind, dem
optimierten Code noch zu folgen, dann brauchst du dich doch aber nicht
beschweren: du hast es dann explizit so verlangt.

Lass die Optimierung an und gewöhn dich dran, den Code in der Form zu
debuggen, wie er später auch verwendet werden soll.  Dazu gehört halt
auch, dass man sich ein paar Methoden erarbeitet, wie man sich
dieses Debuggen organisiert, bspw. das zwischenzeitliche Einfügen von
"Fixpunkten" in den Code (z. B. Ausgabe auf IO-Port), an denen man mit
Sicherheit den Debugger auch anhalten lassen kann, oder das
vorübergehende Speichern interessanter Zwischenwerte in volatile
markierten Variablen, oder einfach das mentale Erfassen des vom
Compiler generierten Assemblercodes um zu sehen, wohin der Compiler
welche Zwischenwerte abgelegt hat, sodass man sich diese zur Laufzeit
aus den Registern kramen kann.  (Das lss-File ist meiner Meinung nach
dabei eher verwirrend denn helfend.  Viel sinnvoller ist es, ein
reines Assembler- oder Disassemblerlisting zu nehmen und den C-Code
daneben zu halten um zu sehen, was der Compiler denn so "gedacht"
hat.)

Ja, das ist Arbeit.  "Einfach mal durchsteppen" geht in der Regel dann
nicht mehr.

Wenn unsere PC-CPUs nicht so strohdoof konzipiert wären, wie es der
i386++ nun mal ist, hättest du dort genau das gleiche Problem.  Been
there, done that, auf einer Motorola m88100 RISC-CPU, viele Jahre
zuvor.

p.s.: Wenn du optimierungsunabhängig eine zeitliche Reihenfolge von
irgendwas garantieren willst, solltest du über inline asm nachdenken.
Aus diesem Grunde liefert die avr-libc in dieser Richtung bereits
einiges von Haus aus mit.  Vermutlich sollte sie das auch für das
von dir hier gewünschte Subsystem tun, das hat halt nur noch keiner
zusammengeschrieben.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.