Hallo, an sich ist es ja eher ein schlechtes Zeichen, wenn der avr-gcc (Version 4.1.2 übrigens) RTL-Zeugs ausspuckt, aber was heißt das denn jetzt: avr-gcc -mmcu=atmega128 -Wall -Os -c -g -Wa,-a,-ad,-a=trig.lst trig.c trig.c: In function 'sincos90': trig.c:89: error: unable to find a register to spill in class 'POINTER_REGS' trig.c:89: error: this is the insn: (insn 41 39 42 4 trig.c:70 (set (reg:SI 59 [ D.1371 ]) (mem/s:SI (post_inc:HI (reg/f:HI 48 [ ivtmp.65 ])) [2 arctan_tbl S4 A8])) 14 {*movsi} (nil) (expr_list:REG_INC (reg/f:HI 48 [ ivtmp.65 ]) (nil))) trig.c:89: confused by earlier errors, bailing out Ich versteht zwar davon jetzt nicht viel, aber schaut so aus, als wie wenn er bei einem Speicherzugriff kein Register mehr frei hat. Wenn ich einen der Unter-Funktionsaufrufe auskommentiere, dann tritt der Fehler nicht mehr auf. (Natürlich funktioniert dann mein Programm auch nicht mehr) Am Anfang der Funktion werden 18 Register mit push gesichert. Die Zeile, die er nicht will besteht aus einem Speicherzugriff um einen int32_t aus dem SRAM zu laden und einer 32Bit Multiplikation (mit Aufruf einer Funktion) Ohne -Os tritt es nicht auf, aber weil der Code einwandfrei funktioniert, will ich ihn natürlich jetzt noch optimieren. MfG - C. Lechner
Da wird es nicht viele geben, die diese Fehlermeldung interpretieren können. Deswegen die Frage: Taucht das Problem auch bei 4.2.1 auf? Wenn ein Stück von deinem Programm postest, in dem der Fehler reproduzierbar auftritt, probier ich's gerne für dich aus.
@yulu: Danke für das Angebot. Mit avr-gcc 4.2.1 gehts zwar, aber ich komme nach einer weiteren Optimierung ohne die den Fehler auslösende Anweisung aus. Das Problem war glaube ich mal die Multiplikation, denn da ruft er lt. Listing intern die Funktion __mulsi3 auf, die braucht natürlich Argumente. Mittlerweile hab ich die Multiplikation nämlich durch eine Fallunterscheidung ersetzt, da ich nur mit -1 und +1 multipliziere, da macht er halt ggf. das Zweierkomplement drauf und fertich.
Das sind die wahrhaft intelligenten Optimierungsfähigkeiten des GCC: Den Programmier durch dubiose Fehlermeldungen so zu verwirren, dass er schließlich seinen Code selbst optimiert :D :D :D
Diese Fehlermeldung ist GCCs sprechendere Version von "internal compiler error E54321, please consult support". Sprechend für den Autor, nicht den Nutzer, und nur für den Autor gedacht. Manche diese Fehler sind in Bugzilla dokumentiert.
Such mal in GCC's Bugzilla, ob der Fehler schon berichtet ist. Suche ggf. auch in den bereits geschlossenen Bugs (advanced search, auf Target AVR einschränken), kann ja sein, dass er in der aktuellen Version bereits behoben ist.
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.