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.
  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
Wenn die 2 C-Instruktionen in einem separaten Sourcefile - umgewandelt mit der erforderlichen Optimierung - stehen, dann sollte es doch funktionieren. Alternative: Assembler. Bernhard
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!
  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
Mit Google-Account einloggen
  Noch kein Account? Hier anmelden.