¿Qué ISA utiliza Cortex-M/R/A y qué compiladores están disponibles? [cerrado]

¿Qué ISA utiliza Cortex-M/R/A?

¿Cuál es la diferencia entre arm-none-eabi y arm-elf-gcc ? ¿Hay otros compiladores para dispositivos ARM que valga la pena mencionar?

"#2.1 Este es solo para Cortex-M/R, ¿verdad?" El compilador cruzado gcc-arm-none-eabi debería funcionar con cualquier microcontrolador/microprocesador ARM.
1) No, v7a y v7r son v7 completos (brazo + pulgar), pero v7m es solo para pulgar, y no, al igual que no puede (fácilmente) ejecutar (cualquier) programa de Windows en una computadora con Linux, hay más de qué preocuparse que ISA. 2) en su mayoría variantes GCC o clang, none-eabisignifica no OS y EABI como ABI. os también podría ser linux y otros, ABI podría ser gun-eabi/gnu-eabi-hf, etc. 2.1) no, aún puede usarlo para v7a, v6, etc., siempre que no-os y EABI sean lo que usted necesidad. 3) utiliza un abi: elf diferente, una versión anterior de ARM ABI.
@ user3528438 ¿Es cierto que está el ARM IS tradicional (32 bits), luego está Thumb-1 (16 bits) y el "nuevo" Thumb-2 (32 bits)? Vale, lo quitaré. Lo que quería decir es que Cortex-A entiende las instrucciones de un programa creado para Cortex-M además de tener los mismos registros, etc. Pero según tengo entendido, esto es cierto. En cuanto a 3) ¿tiene más información al respecto? Y muchas gracias por tu ayuda.
@ user3528438 Comenté que arm-none-eabi-gcc todavía genera archivos de objetos con formato elf.
Ya que cambiaste la pregunta. El ISA que se utiliza está documentado en los manuales de referencia de arquitectura. todos admiten thumb más varios niveles de extensiones thumb2. Algunos jazelle y coma flotante, otros no. thumb2 son instrucciones de thumb1 anteriormente no definidas, técnicamente si encuentra la información del brazo derecho en el momento en que comenzaron las extensiones de thumb2 (armv6m) que era como el conjunto de instrucciones del quinto pulgar o algo así, no usan esos términos normalmente thumb2 tiene al menos dos sabores principales y son extensiones a thumb1 no es un trato separado.
es por eso que hicieron lo de la sintaxis unificada, que en mi opinión es más un problema que una solución. el conjunto de instrucciones no es el problema aquí, solo obtenga un compilador, el problema es que cada proveedor de chips que usa cualquiera de estos núcleos tiene sus propios periféricos y espacios de direcciones. El conjunto de instrucciones es la parte trivial cuando se trata del desarrollo de armas.

Respuestas (1)

Para cada otro procesador que posee (incluso si no sabe que lo tiene), probablemente tenga al menos una cosa basada en ARM, si no más de una. No puedes escapar de ellos, están en todas partes. Del mismo modo, hay varias cadenas de herramientas, pero GNU funciona bien y es fácil de conseguir. Puede construir uno propio fácilmente desde cero u obtener uno preconstruido, puedo agregar algunos enlaces más adelante en los comentarios.

Los predecesores del nombre de la corteza se usaban ARMV4T (ARM7TMDI) hasta ese punto, todas las instrucciones ARM compatibles y las instrucciones de pulgar. La familia cortex-m es una máquina solo para pulgar, no ejecuta instrucciones ARM. Ha habido algunas extensiones de pulgar-2, una pequeña cantidad en armv6m (cortex-m0 y m0+) y más de 100 en armv7m (cortex-m3 -m4 -m7), además de que la corteza-a de tamaño completo también admite una cantidad de thumb2 extensiones, antes eran solo instrucciones de pulgar indefinidas (16 bits) que se convirtieron en instrucciones de longitud variable (dos instrucciones de ancho) para abrir el puente entre las limitaciones del pulgar y las funciones de brazo de tamaño completo. la compatibilidad con el pulgar se agregó en gcc 3.xx y se ha mantenido desde entonces, las versiones 5.xx y 6.xx actuales conocen los diversos conjuntos de instrucciones de brazo, incluidos el pulgar y el brazo. Por lo tanto, no está limitado al usar la cadena de herramientas gnu que puede desarrollar para las familias cortex-a, cortex-r y cortex-m. Tenga en cuenta que la corteza-r es un brazo de tamaño completo, aunque creo que es más antiguo, pero dos núcleos unidos al mismo tiempo o de tal manera que si uno toma un camino diferente al otro, se produce una alarma de algún tipo. Son para cosas de seguridad/salud. Puedo comprar algunos tableros de evaluación de TI, pero aparte de eso, no los he visto (y por cierto bloqueé al menos dos de mis tableros de TI).

El armv8 es una nueva bestia, tiene aarch32 (que es la instrucción ARM tradicional con registros de 32 bits) luego aarch64 que es el nuevo conjunto de instrucciones de 64 bits, las instrucciones tienen 32 bits de ancho pero los GPR ahora son de 64 bits. Es un conjunto de instrucciones completamente incompatible, completamente nuevo. GNU lo admite, pero al estilo gnu, debe construir la cadena de herramientas para el objetivo aarch64. El objetivo genérico de la cadena de herramientas arm gnu se construirá para todos los núcleos anteriores a armv8, incluso hasta arm3 y tal vez arm2 (ver el núcleo ámbar en opencores, por ejemplo, puede usar las herramientas gnu arm target para ello).

Entonces, por ejemplo, arm-none-eabi-gcc --target-help muestra

  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

entonces armv2 a armv8. Tengo curiosidad por saber que es ese armv8 me pregunto si solo es aarch32.

Pero para divagar, puede crear varios programas compatibles con el pulgar y ARM de 32 bits con una cadena de herramientas. El triplete para la denominación de gnu es confuso y, dado que creo que a veces puedes anularlo con lo que quieras, no es algo global tallado en piedra. Los populares actuales son arm-none-eabi- y arm-linux-gnueabi- el primero tiene la noción de incrustado usando newlib o algo así, el último está diseñado para construir programas contra glibc para ejecutar en Linux. Para bare metal, si escribe su código correctamente, puede usarlo indistintamente.

Entonces, las aplicaciones de cortex-m3 en su iPhone, bueno, no por thumb o thumb2, thumb, el original es el único conjunto de instrucciones que funciona en todos los núcleos desde armv4t hasta el presente. pero debido a que las aplicaciones de cortex-m3 son básicas o son para un sistema operativo pequeño (RTOS como FreeRTOS), es probable que sus llamadas al sistema sean incorrectas y que el formato binario sea incorrecto para ejecutarse en su teléfono. La noción de que el conocimiento de las instrucciones del pulgar para un córtex-m también se aplica a un armv7 es correcta. Y el núcleo de su teléfono puede manejar las instrucciones del pulgar. Pero el lenguaje de programación, la cadena de herramientas y otros elementos dictados por Apple pueden limitar lo que puede o no puede hacer con las aplicaciones del teléfono.

El enlace de la plataforma de lanzamiento que publicaste es el enlace que iba a publicar, pero ahora se ha movido a una herramienta alojada en el brazo que usan las letras rm que son confusas ya que cortex-r son instrucciones de brazo de tamaño completo y cortex-m son solo para pulgar . Pero el cortex-r y el cortex-m son familias que apuntan a microcontroladores o ese nivel de diseño integrado. Por lo tanto, tiene sentido desde esa perspectiva, y recomendaría esa cadena de herramientas si no desea crear la suya propia. Sin embargo, no va a utilizar esa cadena de herramientas para crear aplicaciones de iPhone.

arm-elf-gcc es solo otro triplete, antes del eabi abi, que fue uno de los tripletes populares. no significan demasiado, pero al compilar la cadena de herramientas, el triplete hace que se realicen ciertas elecciones predeterminadas, y si no reconoce el triplete o no tiene un comodín para uno de los elementos, el sistema de creación de stock se recuperará. No he intentado construir arm-elf o arm-none-elf en mucho tiempo.

La cadena de herramientas de la plataforma de lanzamiento y/o la construcción para arm-none-eabi funcionarán en todos los núcleos enumerados, puede construir integrados (bare metal, basados ​​en RTOS, etc.) para cualquiera de esos núcleos, desde un quad core armv7 hasta un cortex- m0+, pero no enlace para binarios de linux. Bare metal o cualquier soporte que proporcione

Los binutils son genéricos, o pueden serlo, el ensamblador puede tomar ensamblaje y hacer un objeto. El vinculador puede vincular objetos en función de las reglas del script del vinculador. El compilador puede tomar un archivo y crear un objeto a partir de él que se pueda vincular con otros objetos. Nada de esto depende del sistema operativo todavía, es cuando combina todas estas cosas más las bibliotecas externas deseadas por los programas gcclib, la biblioteca C y las llamadas al sistema cuando obtiene un sistema operativo específico. Y todos los triples le permitirán crear archivos de objetos desde asm o C y vincularlos siempre que evite las bibliotecas externas. Si siente la necesidad de esas bibliotecas, incluso bibliotecas C o incluso división fija o flotante o multiplicación en software (gcclib), comienza a depender del sistema operativo, las bibliotecas externas comienzan a involucrarse.

Gracias por su respuesta muy, muy detallada. ¡Esto me ayudó mucho!