MikroKopter - Forum » MikroKopter » Timing vs. Compilerversion

Timing vs. Compilerversion

Seite: 1

Autor Neuer Beitrag
Entwickler, Admin
Registriert seit: Feb 2006
Beiträge: 3883
Ort: Ostfriesland
Hallo,

für alle Programmierer:
Wir haben festgestellt, dass es bei den aktuellen WinAVR-Versionen zu erheblichen Performanceverlusten kommt.

Ich habe mal die Prozessorauslastung der FC gemessen und zwischen meiner alten WinAVR-Version (WinAVR-20060421) und der aktuellesten (WinAVR-20081205) verglichen

User image

Oben: neuer Compiler --> 80% Auslastung (mit Optimize-Einstellung OPT=2 (1-3 machen keinen Unterschied) mit OPT = 0 ist es 100% Auslastung)
Unten: alter Compiler --> 45% Auslastung
(Zu sehen ist die Bearbeitungszeit der Flight-Ctrl-Routine von V0.72)

Die Version WinAVR-20060421 findet man hier: http://downloads.sourceforge.net/winavr/WinAVR-20060421-install.exe?use_mirror=mesh
Diese Version verwendet noch den GCC 3.4.6. alle späteren Versionen verwenden bereits den GCC 4.1.1 oder höher. Dadurch tritt vermutlich der Performanceverlust ein.

Gruss,
Holger
Mitglied
Registriert seit: Apr 2007
Beiträge: 1248
Danke Holger.

Wo wir gerade beim Thema Compiler sind. Wie sieht es denn mit der Umgebung für die NC Software aus?
Welche Versionen verwendet ihr dafür?
Ich bin immer noch dabei eure GPS Struktur "mit Leben zu füllen". Leider bisher noch nicht 100%ig erfolgreich und das schlechte Wetter macht Testen quasi unmöglich.

Jochen
MK-Betatester
Registriert seit: Jul 2007
Beiträge: 557
Hallo Programmier- Experten,
ich habe nun folgendes Problem:
Nachdem ich einige Änderungen in die FC 0.73c eingebaut habe, bekomme ich mit der WinAVR-20060421 nun die Fehlermeldung: "error: unable to find a register to spill in class `BASE_POINTER_REGS'".
Bei den AVR-Bugs gibts die Info: Fixed in >= 4.4.0.
Wenn ich mit der WinAVR-20081205 compiliere, ist die Fehlermeldung dann auch weg, aber ich habe die von Holger genannten Performance- Verluste, wodurch z.B. im Kopter-Tool bei laufenden Motoren keine Daten mehr ankommen.

Hat jemand noch eine Idee, welcher Compiler benutzt werden sollte.

Gruß
MartinR
MK-Betatester
Registriert seit: Jan 2008
Beiträge: 1825
Zeig mal den Codeauszug, bei dem das Problem auftritt.
MK-Betatester
Registriert seit: Jul 2007
Beiträge: 557
killagreg meinte
Zeig mal den Codeauszug, bei dem das Problem auftritt.


Hallo Killagreg,
hier die Fehlermeldung:


Compiling: fc.c
avr-gcc -c -mmcu=atmega644p -I. -O2 -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=fc.lst -std=gnu99 -DVERSION_MAJOR=0 -DVERSION_MINOR=73 -DVERSION_PATCH=2 -DVERSION_SERIAL_MAJOR=10 -DVERSION_SERIAL_MINOR=1 -DNC_SPI_COMPATIBLE=5 fc.c -o fc.o
fc.c: In function `MotorRegler':
fc.c:835: warning: comparison is always false due to limited range of data type
fc.c:836: warning: comparison is always false due to limited range of data type
fc.c:1687: error: unable to find a register to spill in class `BASE_POINTER_REGS'
fc.c:1687: error: this is the insn:
(insn 2646 2645 2647 284 (set (reg:SI 28 r28 [997])
(minus:SI (reg:SI 1801 [ IntegralNick2 ])
(reg:SI 24 r24 [orig:996 IntegralNick ] [996]))) 31 {subsi3} (insn_list 2645 (nil))
(expr_list:REG_DEAD (reg:SI 1801 [ IntegralNick2 ])
(expr_list:REG_DEAD (reg:SI 24 r24 [orig:996 IntegralNick ] [996])
(nil))))
fc.c:1687: confused by earlier errors, bailing out
make.exe: *** [fc.o] Error 1

> Process Exit Code: 2
> Time Taken: 00:08




Hier die fc.c ab Zeile 1677:

1677 Motor = tmp_int;
1687 }
1679 else Motor = 0;
1680 }
1681 /*
1682 if(Poti1 > 20) Motor1 = 0;
1683 if(Poti1 > 90) Motor6 = 0;
1684 if(Poti1 > 140) Motor2 = 0;
1685 //if(Poti1 > 200) Motor7 = 0;
1686 */
1687 }


Gruß
Martin
Mitglied
Registriert seit: Oct 2008
Beiträge: 19
Hallo Martin,

avr-gcc -c -mmcu=atmega644p -I. -O2 


das der Bug #31644 ('BASE_POINTER_REGS') bei -O0 nicht auftritt hast du gesehen
und deinen Code damit einmal testweise compiliert?

1678 }
1679 else Motor = 0;
1680 }
...
1687 }

fc.c:1687: confused by earlier errors, bailing out


Also das der Compiler konfus ist, kann ich verstehen. Da fehlt eine Klammer auf in Zeile 1679.
Die Klammer zu in Zeile 1687 ist dann die zugehörige zum Funktionsende, nehme ich an.

Und sowas...

fc.c:835: warning: comparison is always false due to limited range of data type


...gehört auch verboten. Sieh dir bitte mal den Vergleich an der da nicht stimmt.
Das ist bestimmt sowas einfaches falsch wie

uint32_t foo;
if (foo < 0)
{ /* someting */}


Grüße,
Toby
MK-Betatester
Registriert seit: Jul 2007
Beiträge: 557
Hallo Toby,
ich habe es gerade ausprobiert, das Problem tritt nur bei Optimization level =2 auf. 0,1,3 funktionieren.
Danke für den Hinweis.

Zu Deinen anderen Anmerkungen:
- Die Anzahl der Klammern ist richtig. In diesem Bereich habe ich auch nichts geändert.
- Die Warnungen in Zeile 836/ 836 beziehen sich noch auf Original Trunk-Code. Dieser Code stammt nicht von mir. Ich habe es so gelassen, da die Ursache unkritisch ist.

Gruß
Martin
Mitglied
Registriert seit: Oct 2008
Beiträge: 19
Hallo Martin,

gern geschehen.

Die Klammern hätten aber falsch sein können. Die Korrektheit der Gramatik
konnte man an deinem Code-Auszug nicht eindeutig feststellen.

Wegen der Kompiler-Warnungen in FC (SVN Tag V0.72p) hatte ich Holger und
Ingo vor zwei Wochen schon mal eine Mail mit Korrekturen geschrieben.
Vieleicht melden Sie sich ja noch und nehmen auch gleich das zur
Verbesserungen auf.

Grüße,
Toby
Mitglied
Registriert seit: Jul 2007
Beiträge: 1469
Ort: Dresden
HolgerB meinte
Wir haben festgestellt, dass es bei den aktuellen WinAVR-Versionen zu erheblichen Performanceverlusten kommt.

genau dieses Problem trat bei mir auf. Es kam zum Abriss der BT-Verbindung bei Motorstart. Nach Compilieren mit der älteren GCC-Version war das Problem behoben
« Bearbeitet von kopterix am 06.05.2009 07:52. »
Mitglied
Registriert seit: Apr 2008
Beiträge: 174
Ort: Potsdam
Hi,
bin grad am Rechner neu aufsetzen....Ist das Problem mit der neuen Version noch aktuell oder hat sich da was getan?
Möchte ungerne rumprobieren wenn es da schon Erfahrungswerte gibt.
Mitglied
Registriert seit: Apr 2009
Beiträge: 72
Ort: Graz
Hat zu den neuen Versionen schon jemand Erfahrungswerte?
MK-Betatester
Registriert seit: Jan 2008
Beiträge: 1825
Lasst die Finger von den neueren Versionen, die auf dem GCC 4.x aufsetzen.
Mitglied
Registriert seit: Feb 2010
Beiträge: 368
Ähm...
merkt denn der Rest der Welt nicht, dass mit GCC 4.x bescheidener Maschinencode raus kommt?

Denn seit WinAVR-20060421 sind schon seit vorgestern 4 Jahre vergangen! :?

Hat einer sich schon mal den MCode angesehen? Was macht denn GCC 4.x anders als 3.x?
MK-Betatester
Registriert seit: Jan 2008
Beiträge: 1825
@ Walmo

Der GCC 4.x ist unter anderem auch für die größeren Xmegas optimiert. Ich denke bei dem Kompromiss ist wohl etwas bei der Performance für die kleinen 8bit-Prozessoren auf der Strecke geblieben. Der Performence unterschied ist mit ca. Faktor 2 gewaltig. Aber vieleleicht hast du ja Zeit und Lust der Sache mal auf den Gund zu gehen?

Grüße Gregor
Mitglied
Registriert seit: Feb 2010
Beiträge: 368
ich habe ein wenig gegoogled.

Interessanter Thread aus mikrocontroller.net
Gruß

Manfred
« Bearbeitet von WalMo am 24.04.2010 19:17. »
Mitglied
Registriert seit: Sep 2010
Beiträge: 1
Doch mit die alte GCC unterstützt doch den 1284P NICHT? Wie wird dann für diesen Controller kompiliert? Mit der Neuen geht es auch nicht! PLS Help
Mitglied
Registriert seit: May 2009
Beiträge: 1642
Ort: Ba-Wü
Geduld...!

HolgerB meinte
Für Programmierer: ein angepasster Compiler - mit Atmega1284-Unterstützung - folgt

http://forum.mikrokopter.de/topic-post219841.html#post219841

Seite: 1

MikroKopter - Forum » MikroKopter » Timing vs. Compilerversion