Servus, ich spiele gerade ein wenig mit dem XC16 Compiler (kostenlose Version) herum, und merke gerade, das man händisch schon noch sehr viel am C-Code optimieren kann, wahrscheinlich weil es die kostenlose Version ist. Denn sowas einfaches, wie ein Bit-Toggle, für das es sogar einen Maschinenbefehl gibt, wird sehr ineffizient in Assemblercode umgesetzt. von Microchip vorgesehener Code: #define red_Led_Toggle() _LATA1 ^= 1 ergibt: 000456 801624 MOV LATA, W4 000458 D10204 LSR W4, W4 00045A 624261 AND.B W4, #0x1, W4 00045C A20404 BTG.B W4, #0 00045E 624261 AND.B W4, #0x1, W4 000460 FB8204 ZE W4, W4 000462 620261 AND W4, #0x1, W4 000464 420204 ADD W4, W4, W4 000466 801626 MOV LATA, W6 000468 2FFFD5 MOV #0xFFFD, W5 00046A 630285 AND W6, W5, W5 00046C 720205 IOR W4, W5, W4 00046E 881624 MOV W4, LATA mit maximaler Optimierung des Compilers auf Ausführgeschwindigkeit sind es noch immer 9 Instruktionen. der von mir abgeänderte Code: #define red_Led_Toggle() __builtin_btg(&LATA, 1) ergibt: 000456 202C44 MOV #0x2C4, W4 000458 A21014 BTG [W4], #1 Der neue C-Code ist zwar nicht mehr so Portabel wie das Original, aber dafür wird es ja in eine eigene Datei ausgelagert, wo man die Maschinenabhängigkeit reinpackt, bzw. den konkreten Pin beschreibt. Was man sowiso immer auf die Hardware anpasst. Wird sowas bei der teuren Bezahlversion vom Compiler Optimiert? Was sind weitere typische Dinge, die man selber gut in C Optimieren kann?
Michael M. schrieb: > Wird sowas bei der teuren Bezahlversion vom Compiler Optimiert? Mit Sicherheit. Gibts bei diesem Compiler in der kostenlosen Version keinerlei Optimierung? Denn der gezeigte Code macht klar, dass keinerlei Optimierung durchgeführt wird.
:
Bearbeitet durch User
Kurzer Blick ins Handbuch verrät: -O1 ist auch in der freien Version verfügbar. Der Compiler ist eine angepasste Version vom GCC.
A. K. schrieb: > Der Compiler ist eine angepasste Version vom GCC. müsste er dann nicht frei sein? also die Änderung mit veröffentlich werden?
@Peter II Die Sources kann man hier laden: http://www.microchip.com/pagehandler/en-us/devtools/dev-tools-parts.html
Peter II schrieb: >> Der Compiler ist eine angepasste Version vom GCC. > > müsste er dann nicht frei sein? also die Änderung mit veröffentlich > werden? Jene Optimierungen, die GCC von sich aus durchführt, stehen als Quellcode zur Verfügung. Ich hatte den Compiler in einer alten Version aus dsPIC30 Zeiten mal ausprobiert. Da war der Lizenzcheck in ein separates Programm ausgelagert. Auch beim normalen GCC ist das Programm "gcc" nicht wirklich der Compiler, sondern ein Compiler-Driver, der seinerseits Compiler, Assembler und Linker aufruft. Eine spezielle Art vom Optimierung, die an deren 8-Bitter erinnert, hatte Microchip damals implementiert. Eine, die im GCC sonst nicht drin ist. Sowas wie Zusammenfassungen von kurzen Befehlssequenzen in Winzig-Unterprogramme, wenn sich diese Sequenzen an mehreren Stellen finden. Spart Platz zu Lasten von Zeit. Und diese Optimierung findet ebenfalls in einem externen Programm statt, damit sie nicht der GNU-Lizenz unterliegt. Dass sich das wahrscheinlich ohne übermässig grossem Aufwand zumindest zurecht biegen lässt, dass die üblichen GCC Optimierungen inklusive -O2 und -O3 voll zur Verfügung stehen, halte ich für wahrscheinlich. Aber auch -O1 sollte schon völlig ausreichen.
:
Bearbeitet durch User
Michael M. schrieb: > Was sind weitere typische Dinge, die man selber gut in C Optimieren > kann? Bei einem ordentlichen Compiler: so gut wie gar nichts. “Never try optimizing before you have profiled it.”
Michael M. schrieb: > Was sind weitere typische Dinge, die man selber gut in C Optimieren > kann? Vernünftige Algorithmen und Datenstrukturen wählen hilft. Der Versuch, schlauer zu sein als der Compiler, geht meistens schief.
:
Bearbeitet durch User
Was beim gcc hilft (zwecks Codegröße), sind z.B. temporäre Kopien lokaler static-Variablen. Was man ändert, muss man später natürlich zurück sichern. Aber so holt man eigentlich immer ein paar Bytes raus. Zumindest zeigt es, dass der gcc nicht allwissend und allmächtig ist.
horst schrieb: > Was beim gcc hilft (zwecks Codegröße), sind z.B. temporäre Kopien > lokaler static-Variablen. Was man ändert, muss man später natürlich > zurück sichern. Aber so holt man eigentlich immer ein paar Bytes raus. > Zumindest zeigt es, dass der gcc nicht allwissend und allmächtig ist. Es gilt aber auch: Für nicht genutzten Speicherplatz bekommt man kein Geld zurück. ;-)
Also mit -O1 kommt das raus: 00031C 2FFFD7 MOV #0xFFFD, W7 000360 D502C4 LSR LATA, WREG 000362 EA8200 COM W0, W4 000364 620261 AND W4, #0x1, W4 000366 420204 ADD W4, W4, W4 000368 801620 MOV LATA, W0 00036A 638300 AND W7, W0, W6 00036C 720306 IOR W4, W6, W6 00036E 881626 MOV W6, LATA und bei höherer Optimierung gibt es diese Warnung: Options have been disabled due to restricted license Visit http://www.microchip.com/ to purchase a new key. Natürlich kommt das Argument, das man nicht selbs Optimieren soll, weil das der Compiler macht. Aber wenn ich durch einige kleine händische Optimierungen schon so viel erreichen kann, spar ich mir die über 850€ ;)
Michael M. schrieb: > Also mit -O1 > kommt das raus: Ist das LATA1 ein Bitfeld? Probiers mal direkt auf dem Register. Der Code sieht schwer nach hässliche Nebeneffekten der Bitfeld-Definition aus.
Peter II schrieb: > A. K. schrieb: >> Der Compiler ist eine angepasste Version vom GCC. > > müsste er dann nicht frei sein? Ja, ist er. Bedeutet kontret: Wenn du von irgendeinem Autor A die Binaries des Compiler bekommen hast — aus legalem Weg natürlich — dann muss dir A auch die passenden Quellen zur Verfügung stellen; und zwar in einem "allgemein üblichen, maschinenlesbaren" Format und maximal zum Selbstkostenpreis (z.B. für CD + Versand). Nur dadurch, dass A den Compiler geändert hat, hast du noch kein Recht darauf, die Quellen zu bekommen. > also die Änderung mit veröffentlich werden? Ja, siehe obige Bedingungen. Diese Änderung kann z.B. darin bestehen, 'zig Optimierungs-Passes oder nicht unbedingt nötige Pattern aus dem Compiler zu entfernen. Da das Binary dann aus Quellen erzeugt ist, die das Zeug nicht enthalten, muss A das entfernte Zeug auch nicht zur Verfügung stellen. In diesem Fall muss A nicht nur mindestens 2 Generierungsvarianten vorhalten, sondern auch mehrere Quellvarianten. Falls A einen Lizenz-Manager eingebaut hat, dann muss dieser ebenfalls unter GPL stehen falls er (dynamisch oder statisch) gegen GCC gelinkt ist. Weitere Möglichkeit ist, aus gcc (xgcc, cc1, cc1plus, cpp, as, ld oder von wo auch immer) ein externes, von GCC unabhängiges Tool zum Lizenz-Check zu verwenden. In diesem Fall wird das Tool per exec et al. aufgerufen, und die Quellen sollten sich leicht von dem Manager bereinigen lassen.
Johann L. schrieb: > Peter II schrieb: >> A. K. schrieb: >>> Der Compiler ist eine angepasste Version vom GCC. >> >> müsste er dann nicht frei sein? > > Ja, ist er. Bedeutet kontret: Wenn du von irgendeinem Autor A die > Binaries des Compiler bekommen hast — Das muss kein Autor sein, sondern ein beliebiger Benutzer. Jeder, der ein Programm unter GPL bekommen hat, darf es weiter verbreiten (gegen Geld oder auch kostenlos), solange er ebenfalls die GPL einhält.
Johann L. schrieb: >> A. K. schrieb: >>> Der Compiler ist eine angepasste Version vom GCC. >> >> müsste er dann nicht frei sein? > > Ja, ist er. Bedeutet kontret: Wenn du von irgendeinem Autor A die > Binaries des Compiler bekommen hast — aus legalem Weg natürlich — dann > muss dir A auch die passenden Quellen zur Verfügung stellen; und zwar in > einem "allgemein üblichen, maschinenlesbaren" Format und maximal zum > Selbstkostenpreis (z.B. für CD + Versand). > > Nur dadurch, dass A den Compiler geändert hat, hast du noch kein Recht > darauf, die Quellen zu bekommen. Ich würde das anders lesen: "nur bei Vertrieb oder Weitergabe müssen der Quellcode und etwaige Code-Änderungen den Endnutzern zugänglich gemacht werden" sobald es vertrieben wird, egal an wen haben sie die quellen zu veröffentlichen. Bei Mikrochip steht nicht von GPL oder GCC, ich glaube mehr das aktuell nichts (mehr) mit dem GCC zu tun hat. http://www.microchip.com/DevelopmentTools/ProductDetails.aspx?PartNO=MPLAB%20XC%20Site%20License
Peter II schrieb: > Ich würde das anders lesen: > "nur bei Vertrieb oder Weitergabe müssen der Quellcode und etwaige > Code-Änderungen den Endnutzern zugänglich gemacht werden" Was ist daran "anders"? Das ist doch eigentlich genau das, was da oben steht. > sobald es vertrieben wird, egal an wen haben sie die quellen zu > veröffentlichen. Die Quellen müssen nicht allgemein veröffentlicht werden. Es reicht, wenn man demjenigen, dem man die Binaries gegeben hat, auf Nachfrage auch die Quellen zur Verfügung stellt. Peter II schrieb: > Bei Mikrochip steht nicht von GPL oder GCC, Naja, also das XC16-Handbuch startet mit den Worten: "This document describes how to use GNU language tools to write code for 16-bit applications."
:
Bearbeitet durch User
Peter II schrieb: > sobald es vertrieben wird, egal an wen haben sie die quellen zu > veröffentlichen. Ja, und? Das tun sie doch, man muss sie sich nur runterladen. Sogar ein Buildscript ist dabei. Ist um Größenordnungen freundlicher als ein kommerzieller ARM-GCC, den ich mir vor einiger Zeit mal angesehen habe: der basierte offensichtlich auf einem SVN-Snapshot des GCC-Trees (wobei sie die SVN-Revision, auf der sie aufgesetzt haben, natürlich nicht erwähnt haben), und man bekam von ihnen lediglich die Ausgabe von diff -ur gegen diesen Snapshot als Quellen.
Im Users Guide des Microchip Compilers steht aber auch der Tip drin, dass man, um ein Bit zu toggeln, die builtin des Compilers benutzen sollte und nicht das xor (_LATA1 ^= 1).
Bonner schrieb: > Im Users Guide des Microchip Compilers steht aber auch der Tip drin, > dass man, um ein Bit zu toggeln, die builtin des Compilers benutzen > sollte und nicht das xor (_LATA1 ^= 1). Und bei den Beispielen und Codeconfigurator, ignorieren sie ihren eigenen Tipp ;)
Die haben den Ueser Guide wohl selbst nicht gelesen. So ist das halt wenn die Projekte zu groß werden. Da kann nicht jeder alles wissen. Aber ich finds auch ziemlich saumäßig überhaupt schon so was als Tip mit geben zu müssen.
Die Informationen in der pdf-Datei sind auf den alten C18-Compiler bezogen.Aber es sind auch C-Infos darunter die generell von Interesse sein koennten und wenn nicht:die Datei ist schnell wieder geloescht....
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.