2015-01-12 16 views
8

Ich bin dabei, einige Firmwares für Cortex-M-Cores auf STM32-Prozessoren mit C für meine Projekte zu entwickeln, und im Internet habe ich eine Menge verschiedener Compiler gefunden: Keil, IAR , Linaro, Yagarto und GNU Tools for ARM Embedded Processors.ARM Cortex-M Compiler Unterschiede

Ich frage mich, welche funktionalen Unterschiede gibt es zwischen diesen Compilern, die meine Wahl beeinflussen könnten? Zum Beispiel brauche ich als Enthusiast keine Unterstützung oder Hilfe vom Verkäufer, und eine Begrenzung der Code-Größe ist im Moment in Ordnung. Auch die Benutzerfreundlichkeit ist kein Hauptproblem, da ich gerne lerne (und für den Moment habe ich sowohl Keil Lite als auch Eclipse mit GNU ARM konfiguriert und funktioniert).

Ist der generierte Code so unterschiedlich in Bezug auf Größe/Geschwindigkeit zwischen diesen Compilern? Gibt es eine Vergleichstabelle? (Ich habe nur veraltete Informationen im Internet gefunden)

+0

Geht es Ihnen hauptsächlich ums Lernen? Warum interessiert dich dann die Leistung des Compilers? Linaro und Yagarto sind zwei Versionen von gcc (verschiedene Bibliotheken). Ich würde den letzten [den du verlinkt hast] (https://launchpad.net/gcc-arm-embedded) auswählen. Speed ​​/ Size-Nummern basieren immer auf dem synthetischen Benchmark. Machen Sie Ihren Code und kompilieren Sie ihn mit verschiedenen Compilern. Im Allgemeinen spiegeln die Code-Ergebnisse die Ergebnisse mehr wider als der Compiler. Dh der gleiche Algorithmus mit unterschiedlicher 'C'-Implementierung. –

+0

Mein Hauptanliegen ist natürlich zu lernen, aber Leistung ist keine schlechte Sache zu erreichen (und eine Menge Spaß zu arbeiten). Allerdings werde ich Ihrem Vorschlag folgen, den gleichen Code zu verschiedenen Compilern zu nehmen, und ich werde überprüfen, welcher mir vertrauter wird. Danke für den Kommentar –

+0

Die Frage ist auch außerhalb eines Lernkontexts gültig, also bitte nicht mit "es ist egal, welche Sie wählen, wenn Sie lernen". Ich lerne nicht, aber meine Frage ist sehr ähnlich und ich würde zum Beispiel gerne wissen, ob die kommerziellen Optionen signifikante Leistungs - oder Codegrößenunterschiede gegenüber der GNU ARM Toolchain bieten. –

Antwort

3

Benchmarking ist eine Kunstform an und für sich, in der Regel einfach zu manipulieren, um die Ergebnisse zu zeigen, was auch immer Sie wollen. Ich würde nicht erwarten, dass die Compiler dieselben Ergebnisse mit Ausnahme von sehr kleinen Testfällen generieren, und manchmal sind ihre Ergebnisse in diesen kleinen Testfällen identisch oder manchmal sehr unterschiedlich, da Ihr Test eine Optimierung, die ein Compiler kennt/verwendet, und eine andere nicht.

Früher habe ich solche Dinge (Compiler-Performance-Nummern) zum Beispiel mit dhrystone im Auge behalten, aber im Fall von bekannten Benchmarks (nicht dass dhrystone viel mehr bedeutet, sondern andere) können Sie feststellen, dass sich einige Compiler darauf einstellen unter Benchmarks gut aussehen, vielleicht auf Kosten von etwas anderem.

Es gibt keine richtige Antwort, es gibt keine universellen "besten", es ist alles im Auge des Betrachters, Sie. Welches Werkzeug ist einfacher für Sie, was gefällt Ihnen besser, sei es für die GUI oder schöne Farben oder Soundkartensounds oder was auch immer. Und geh von dort. Der Gnu-Compiler im Allgemeinen für Anwendungen, die ich getestet habe, produziert keinen Code als "schnell", was meinen Benchmark im Vergleich zu den anderen darstellt, aber es gibt viel mehr Leute, die die kostenlosen Gnu-Tools verwenden, so dass die Unterstützung dafür wesentlich breiter ist aufgrund der Anzahl der Webseiten und Foren und Beispiele. gnu wird auch keine Größenbeschränkung haben, aber es erfordert vielleicht mehr lernen oder was auch immer zu tun ...

Die Cortex-ms sind in die armv6m und armv7m Familien aufgeteilt, die v6m (cortex-m0) nur haben eine kleine anzahl von thumb2-erweiterungen, die armv7m haben etwa 150 thumbv2-erweiterungen zu thumb, also musst du wissen, was deine tools unterstützen und nicht die falschen sachen auf dem falschen chip verwenden. Dann können und werden die Compiler, wenn sie das alles wissen, unterschiedliche Befehlsmischungen aus demselben Quellcode erzeugen. Innerhalb des gleichen Compilers oder der gleichen Familie mit verschiedenen Befehlszeilenoptionen können/werden Sie erheblich unterschiedlichen Code erhalten. Und darüber hinaus mit einem Cortex-M4 mit Cache auf, wenn Sie einen mit so etwas haben, abhängig davon, wie der Code in den Cache-Zeilen liegt, können Sie sehr unterschiedliche Leistung erhalten, so Benchmarking ist ein Forschungsprojekt für jeden Blob von C-Code, den Sie benchmarken möchten. Der Leistungsbereich innerhalb eines einzelnen Compilers kann einen anderen Compiler überschatten oder die Überlappung kann ausreichen, um keine Rolle zu spielen.

Wenn Sie Zugang zu den Werkzeugen haben, können Sie sich beruflich Mehrwert verschaffen, indem Sie lernen, die konkurrierenden Werkzeuge zu verwenden und in einen Job zu gehen und in Ihrem Job wählen, was Sie als das richtige Werkzeug für den Job oder den Gang ansehen in ein Kieler Haus und in der Lage sein, sofort oder ein Gnu-Haus zu arbeiten und sofort zu arbeiten. Wo Sie einen Job verlieren könnten, wenn Sie nur Gnu sind und der Job für ein Kieler Haus ist.

+0

Danke für den sehr detaillierten Kommentar! Ich überprüfe die Kompatibilität auf thumb2-Erweiterungen und unterstütze Compiler, ich werde dich wissen lassen, wo ich landen werde –

3

Wir haben einige Vergleiche gemacht; IAR und Keil übertreffen GCC normalerweise mit Standardeinstellungen. Aber mit einigen Compiler-Flags können Sie GCC dem Ergebnis von IAR und Keil ziemlich nahe kommen lassen.

Einige der genannten Compiler sind integrierte Entwicklungsumgebungen. Andere sind nur einfache Compiler. Manche Leute bevorzugen eine integrierte Umgebung mit Compiler, Editor und Debugger. Andere ziehen es vor, ihre eigene Umgebung einzurichten. Es ist Geschmackssache.

Neben Yagarto gibt es auch die "Code Sourcery" Distribution von GCC für ARM.