Welche ISA wird von Cortex-M/R/A verwendet und welche Compiler sind verfügbar? [geschlossen]

Welche ISA wird von Cortex-M/R/A verwendet?

Was ist der Unterschied zwischen arm-none-eabi und arm-elf-gcc ? Gibt es noch andere erwähnenswerte Compiler für ARM-Geräte?

"#2.1 Dieser ist nur für Cortex-M/R richtig?" Der Cross-Compiler gcc-arm-none-eabi sollte mit jedem ARM-Mikrocontroller/Mikroprozessor funktionieren.
1) Nein, v7a und v7r sind vollständige v7 (Arm+Daumen), aber v7m ist nur Daumen, und nein, genauso wie Sie ein (beliebiges) Windows-Programm nicht (einfach) auf einem Linux-Computer ausführen können, gibt es mehr zu befürchten als ISA. 2) meist GCC oder Clang Varianten, none-eabisteht für no OS und EABI als ABI. os könnte auch linux und andere sein, ABI könnte gun-eabi/gnu-eabi-hf usw. sein. 2.1) Nein, Sie können es immer noch für v7a, v6 usw. verwenden, solange no-os und EABI das sind, was Sie wollen brauchen. 3) Es verwendet ein anderes abi: elf, eine frühere Version von ARM ABI.
@user3528438 Stimmt es, dass es den traditionellen ARM IS (32Bit) gibt, dann gibt es Thumb-1 (16Bit) und den "neuen" Thumb-2 (32Bit)? Ok, das entferne ich. Was ich sagen wollte, ist, dass Cortex-A Anweisungen eines für Cortex-M erstellten Programms versteht, abgesehen davon, dass es dieselben Register usw. hat. Aber so wie ich es verstehe, ist dies wahr. Wie für 3) haben Sie weitere Informationen darüber? Und vielen Dank für Ihre Hilfe.
@ user3528438 Ich habe bemerkt, dass arm-none-eabi-gcc immer noch Objektdateien im Elf-Format generiert.
Da Sie die Frage geändert haben. Welche ISA verwendet wird, ist in den Architekturreferenzhandbüchern dokumentiert. alle unterstützen daumen plus verschiedene ebenen von thumb2-erweiterungen. Einige Jazelle und Fließkomma, andere nicht. thumb2 waren früher undefinierte thumb1-Anweisungen. Technisch gesehen, wenn Sie zum Zeitpunkt des Starts der thumb2-Erweiterungen (armv6m) die Informationen zum rechten Arm finden, die wie der fünfte Daumen-Anweisungssatz oder so waren, verwenden sie diese Begriffe normalerweise nicht. thumb2 hat mindestens zwei Hauptvarianten und sind Erweiterungen zu thumb1 sind kein separater Deal.
Aus diesem Grund haben sie die vereinheitlichte Syntaxsache gemacht, die meiner Meinung nach eher ein Problem als eine Lösung darstellt. Der Befehlssatz ist hier nicht das Problem, besorgen Sie sich einfach einen Compiler. Das Problem ist, dass jeder Chiphersteller, der einen dieser Kerne verwendet, seine eigenen Peripheriegeräte und Adressräume hat. Der Befehlssatz ist der triviale Teil, wenn es um die Armentwicklung geht.

Antworten (1)

Für jeden anderen Prozessor, den Sie besitzen (auch wenn Sie es nicht wissen), haben Sie wahrscheinlich mindestens ein ARM-basiertes Ding, wenn nicht mehr als eines. Du kannst ihnen nicht entkommen, sie sind überall. Ebenso Toolchains, es gibt eine Reihe davon, aber GNU funktioniert gut und ist leicht zu bekommen. Sie können ganz einfach Ihre eigenen von Grund auf neu erstellen oder eine vorgefertigte erhalten. Ich kann später in den Kommentaren einige Links hinzufügen.

Die Vorgänger des verwendeten Cortex-Namens ARMV4T (ARM7TMDI) unterstützten bis dahin alle ARM-Befehle und Daumenbefehle. Die Cortex-m-Familie ist eine reine Daumenmaschine, sie führt keine ARM-Anweisungen aus. Es gab einige Thumb-2-Erweiterungen, eine kleine Anzahl in armv6m (Cortex-m0 und m0+) und über 100 in armv7m (Cortex-m3 -m4 -m7), außerdem unterstützt der Cortex-a in voller Größe auch eine Reihe von thumb2 Erweiterungen sind sie nur früher undefinierte Daumenanweisungen (16 Bit), die zu Anweisungen mit variabler Länge (zwei Anweisungen breit) wurden, um die Brücke zwischen Daumenbeschränkungen und Armfunktionen in voller Größe zu schlagen. Die Daumenunterstützung wurde in gcc 3.xx hinzugefügt und wird seitdem beibehalten, die aktuellen 5.xx und 6.xx kennen die verschiedenen Arm-Befehlssätze, einschließlich Daumen und Arm. Sie sind also nicht auf die Verwendung der GNU-Toolchain beschränkt, die Sie für die Cortex-a-, Cortex-r- und Cortex-m-Familien entwickeln können. Beachten Sie, dass der Cortex-r ein Arm in voller Größe ist, obwohl ich denke, dass er älter ist, aber zwei Kerne im Gleichschritt oder so gebunden sind, dass, wenn einer einen anderen Weg als der andere einschlägt, eine Art Alarm ausgelöst wird. Sie sind für Sicherheits-/Gesundheitssachen. Kann einige Eval-Boards von TI kaufen, aber ansonsten habe ich sie nicht gesehen (und ich habe übrigens mindestens zwei meiner TI-Boards gemauert).

Der armv8 ist ein neues Biest, er hat aarch32 (das ist der traditionelle ARM-Befehl mit 32-Bit-Registern), dann aarch64, das ist der neue 64-Bit-Befehlssatz, die Befehle sind 32 Bit breit, aber die GPRs sind jetzt 64 Bit. Es ist ein völlig inkompatibler Befehlssatz, völlig neu. GNU unterstützt es, aber in GNU-Manier müssen Sie die Toolchain für das Ziel aarch64 erstellen. Das generische Arm-GNU-Toolchain-Target wird für alle Pre-Armv8-Kerne erstellt, sogar zurück zu Arm3 und vielleicht Arm2 (siehe zum Beispiel den Amber-Kern bei OpenCores, der die GNU-Arm-Target-Tools dafür verwenden kann).

Also zum Beispiel arm-none-eabi-gcc --target-help zeigt

  Known ARM CPUs (for use with the -mcpu= and -mtune= options):
    arm1020e arm1020t arm1022e arm1026ej-s arm10e arm10tdmi arm1136j-s arm1136jf-s arm1156t2-s arm1156t2f-s arm1176jz-s arm1176jzf-s arm2 arm250
    arm3 arm6 arm60 arm600 arm610 arm620 arm7 arm70 arm700 arm700i arm710 arm7100 arm710c arm710t arm720 arm720t arm740t arm7500 arm7500fe arm7d
    arm7di arm7dm arm7dmi arm7m arm7tdmi arm7tdmi-s arm8 arm810 arm9 arm920 arm920t arm922t arm926ej-s arm940t arm946e-s arm966e-s arm968e-s arm9e
    arm9tdmi cortex-a12 cortex-a15 cortex-a15.cortex-a7 cortex-a17 cortex-a17.cortex-a7 cortex-a32 cortex-a35 cortex-a5 cortex-a53 cortex-a57
    cortex-a57.cortex-a53 cortex-a7 cortex-a72 cortex-a72.cortex-a53 cortex-a8 cortex-a9 cortex-m0 cortex-m0.small-multiply cortex-m0plus
    cortex-m0plus.small-multiply cortex-m1 cortex-m1.small-multiply cortex-m3 cortex-m4 cortex-m7 cortex-r4 cortex-r4f cortex-r5 cortex-r7
    cortex-r8 ep9312 exynos-m1 fa526 fa606te fa626 fa626te fa726te fmp626 generic-armv7-a iwmmxt iwmmxt2 marvell-pj4 mpcore mpcorenovfp native
    qdf24xx strongarm strongarm110 strongarm1100 strongarm1110 xgene1 xscale


  Known ARM architectures (for use with the -march= option):
    armv2 armv2a armv3 armv3m armv4 armv4t armv5 armv5e armv5t armv5te armv6 armv6-m armv6j armv6k armv6kz armv6s-m armv6t2 armv6z armv6zk armv7
    armv7-a armv7-m armv7-r armv7e-m armv7ve armv8-a armv8-a+crc armv8.1-a armv8.1-a+crc iwmmxt iwmmxt2 native

also armv2 bis armv8. Ich bin neugierig zu wissen, was das für armv8 ist. Ich frage mich, ob es nur aarch32 ist.

Aber um abzuschweifen, Sie können mit der einen Toolchain Daumen-basierte verschiedene Daumen-Unterstützung und 32-Bit-ARM-Programme erstellen. Das Tripel für die Gnu-Benennung ist verwirrend, und da ich denke, dass Sie manchmal alles überschreiben können, was Sie wollen, sind Sie kein globales, in Stein gemeißeltes Ding. Die derzeit beliebtesten sind arm-none-eabi- und arm-linux-gnueabi – ersteres hat die Vorstellung von eingebettet unter Verwendung von newlib oder so etwas, letzteres ist dazu gedacht, Programme gegen glibc zu erstellen, die unter Linux laufen. Wenn Sie Ihren Code für Bare Metal richtig schreiben, können Sie beides austauschbar verwenden.

Also Cortex-m3-Anwendungen auf Ihrem iPhone, nein, nicht wegen Daumen oder Daumen2, Daumen, das Original ist der einzige Befehlssatz, der auf allen Kernen vom armv4t bis zur Gegenwart funktioniert. Da Cortex-m3-Anwendungen jedoch Bare-Metal-Anwendungen oder für ein kleines Betriebssystem (RTOS wie FreeRTOS) sind, sind Ihre Systemaufrufe wahrscheinlich falsch und das Binärformat ist wahrscheinlich falsch, um auf Ihrem Telefon ausgeführt zu werden. Die Vorstellung, dass die Kenntnis von Daumenanweisungen für einen Cortex-m auch für einen Armv7 gilt, ist richtig. Und der Kern Ihres Telefons kann Daumenanweisungen verarbeiten. Aber die Programmiersprache, die Toolchain und andere von Apple vorgegebene Elemente können einschränken, was Sie für Telefon-Apps tun können oder nicht.

Der von Ihnen gepostete Launchpad-Link ist der Link, den ich posten wollte, aber der wurde jetzt zu einem am Arm gehosteten Tool verschoben, das die Buchstaben rm verwendet, die verwirrend sind, da cortex-r Armanweisungen in voller Größe und cortex-m nur Daumen sind . Aber der Cortex-r und der Cortex-m sind beides Familien, die auf Mikrocontroller oder diese Ebene des eingebetteten Designs abzielen. Aus dieser Perspektive macht es also Sinn, und ich würde diese Toolchain empfehlen, wenn Sie keine eigene erstellen möchten. Sie werden diese Toolchain jedoch nicht zum Erstellen von iPhone-Apps verwenden.

arm-elf-gcc ist nur ein weiteres Triplett vor dem eabi abi, das eines der beliebten Tripletts war. Sie bedeuten nicht zu viel, aber beim Kompilieren der Toolchain bewirkt das Triplett, dass bestimmte Standardauswahlen getroffen werden, und wenn es das Triplett nicht erkennt oder keinen Platzhalter für eines der Elemente hat, springt das Stock-Build-System aus. Ich habe seit einiger Zeit nicht mehr versucht, Arm-Elf oder Arm-Nicht-Elf zu bauen.

Die Launchpad-Toolchain und/oder das Erstellen für arm-none-eabi funktioniert auf allen aufgeführten Kernen, Sie können eingebettete (Bare Metal, RTOS-basiert usw.) für jeden dieser Kerne von einem Quad-Core-Armv7 bis hin zu einem Cortex- m0+, aber kein Link für Linux-Binärdateien. Bare Metal oder welche Betriebssystemunterstützung Sie auch immer anbieten

Die Binutils sind generisch, oder der Assembler kann die Assemblierung übernehmen und ein Objekt erstellen. Der Linker kann Objekte basierend auf den Regeln im Linker-Skript verknüpfen. Der Compiler kann aus einer Datei ein Objekt machen, das mit anderen Objekten verknüpft werden kann. Nichts davon ist noch betriebssystemabhängig, es ist, wenn Sie all diese Dinge plus externe Bibliotheken kombinieren, die von den Programmen gcclib, C-Bibliothek und Systemaufrufen gewünscht werden, wenn Sie betriebssystemspezifisch werden. Und alle Tripel ermöglichen es Ihnen, Objektdateien aus asm oder C zu erstellen und sie zu verknüpfen, solange Sie externe Bibliotheken vermeiden. Wenn Sie das Bedürfnis nach diesen Bibliotheken verspüren, sogar C-Bibliotheken oder sogar feste oder Float-Division oder -Multiplikation in Software (gcclib), wird es langsam betriebssystemabhängig, externe Bibliotheken fangen an, sich zu beteiligen.

Danke für deine sehr, sehr ausführliche Antwort. Das hat mir sehr geholfen!