¿Por qué el microcontrolador AT91SAM7X tiene diferentes modos de instrucción?

2

El microcontrolador AT91SAM7X tiene varios modos de instrucción:

  • TDMI32bit
  • TUMB16bit
  • Jazelle8bit

Cada uno de estos modos tiene su propio código de instrucción.

¿Por qué Atmel hizo un microcontrolador de 32 bits (TDMI32bit) pero hizo que las instrucciones de 16 bits (TUMB16bit) fueran las predeterminadas?

    
pregunta vahid ilkhani

3 respuestas

2

La realidad de los microcontroladores es que el espacio de código es muy importante. Ser capaz de reducir el tamaño de las instrucciones reduce el tamaño del código y permite empaquetar más código en el mismo flash. El conjunto de instrucciones Thumb permite al programador obtener mucho más de la ARM, pero tiene sus advertencias y, por lo tanto, debe usarse con cuidado. Esto se debe a que existen concesiones para tener menos bits y, por lo tanto, se reduce la capacidad de instrucción. Sin embargo, un buen compilador puede ayudarte a utilizar esta función.

Thumb2 intentó mejorar esto y cerrar la brecha entre los límites de instrucciones en Thumb y los de las instrucciones de 32 bits.

    
respondido por el Gustavo Litovsky
1

Atmel es solo el proveedor de chips. El procesador es de ARM. El conjunto de instrucciones del brazo normal es el sabor de 32 bits. thumb es un conjunto de instrucciones reducido, instrucciones de 16 bits para reducir el tamaño del código y el ancho de banda en una sobrecarga tolerable en número de instrucciones y rendimiento, por ejemplo, un 10-20% más de instrucciones para implementar el mismo programa en comparación con el modo ARM. Jazelle es su propio acuerdo destinado a apoyar a java, por lo que puedo decir que es humo y espejos, un brazo habilitado para Jazelle no parece tener un conjunto de instrucciones java, lo que parece ser que si pagas más dinero, el brazo te venderá algún software que ejecute en su procesador habilitado para java que le permite ejecutar java. Otros dos conjuntos de instrucciones que no mencionó quizás porque su procesador no los tiene son thumb2, que son solo extensiones de pulgar, y el otro es un fpu, que básicamente se denomina instrucciones de coprocesador.

por el momento, todo esto es raro, la mayoría de los procesadores de brazo con pulgar no tienen brazo o no tienen pulgar2 (sí, el brazo es un procesador que es solo para el pulgar, no hay instrucciones de brazo de tamaño completo. Serie Cortex-M). algunos de los procesadores de brazo grande más nuevos tienen todo lo anterior.

El sam7 se basa en el núcleo ARM7TDMI. Que es un ARMv4T. Así que tiene brazo y pulgar pero no pulgar2 y no jazelle. Todas las excepciones son el modo ARM, incluido el reinicio. Después de que el software tenga que cambiar al modo pulgar usando la instrucción bx. Es posible que esté utilizando un software de atmel o en otro lugar que se basa principalmente en el pulgar y da la impresión de que el modo pulgar es el predeterminado, a excepción del cortex-M (armv6m y armv7m), no hay un procesador de brazo que por defecto esté en modo pulgar.

    
respondido por el old_timer
0

El conjunto de instrucciones ARM es muy poderoso, y una única instrucción ARM puede hacer algunas combinaciones de cosas que requerirían múltiples instrucciones al usar muchos otros conjuntos de instrucciones. Sin embargo, este poder tiene un costo: cada instrucción ARM necesita cuatro bytes para almacenarse; mientras que las instrucciones ARM pueden en promedio hacer un "trabajo" algo más útil de lo que sería posible con una instrucción de dos bytes, no hacen el doble. Además, en una aplicación típica habrá secciones del código que necesitarán instrucciones más poderosas, pero también habrá secciones grandes del código que recibirán relativamente poco beneficio de ellas.

El propósito original del conjunto de instrucciones Thumb no era servir como una alternativa completa a ARM, sino permitir que las partes de la aplicación que necesitan las instrucciones más poderosas las usen, mientras que las partes que no lo hacen Necesito que esas instrucciones se puedan almacenar de forma más compacta. Incluso si el 90% de un programa está escrito en modo Thumb, esa parte puede llamar fácilmente a una subrutina escrita en modo ARM si necesita hacer algo en el modo ARM. En consecuencia, los diseñadores tenían la libertad de omitir de las instrucciones del modo Pulgar, que establecen ciertas operaciones que la mayoría de las aplicaciones no tendrían que realizar muy a menudo, incluso si las aplicaciones tuvieran que hacerlo en algún momento.

En sus últimos núcleos, ARM se ha alejado del diseño de dos modos, yendo en dos direcciones diferentes. Algunos núcleos como el Cortex-M3 usan solo un modo de instrucción de 16 bits, pero usan algunos patrones de instrucción de 16 bits que de otra manera no se usan para representar la primera mitad de una instrucción de dos palabras. Esto hace que la mayoría de las instrucciones ARM estén disponibles incluso en el modo de 16 bits. Otros núcleos como el Cortex-M0 se limitan principalmente al conjunto de instrucciones original del pulgar, pero aumentarlo con instrucciones adicionales suficientes para que sea posible hacer las cosas que de otro modo habrían requerido cambiar al modo ARM.

Personalmente, estoy un poco triste al ver que se abandona el modo ARM. Si bien el enfoque de Cortex-M3 funciona casi igual de bien, el modo ARM podría hacer algunas cosas que Cortex-M3 no puede hacer tan bien. Por ejemplo, en el modo ARM cada instrucción tenía un campo de "condición" que causaría que se ejecutara solo si se establecían ciertos indicadores. Esto hizo posible hacer ciertos tipos de código de permutación de bits usando tres instrucciones por cada dos bits.

; Capture bits 2 and 3 of R0 in sign and carry flags, respectively
    movs  r0,r0,rol #29
    orrmi r4,r4,#128 ; Set bit 7 of R4 if bit 2 of R0 was set
    orrcs r5,r5,#128 ; Set bit 7 of R5 if bit 3 of R0 was set

El Cortex-M3 tiene una instrucción "if-then-else" bastante poderosa que se puede usar para hacer que la ejecución de las siguientes instrucciones sea condicional en función de las banderas, y tiene modos para, p. ej. "ejecutar la siguiente instrucción solo si se configura el acarreo, y la siguiente solo si está claro", pero todas las instrucciones controladas por una instrucción particular "if-then-else" deben usar el mismo indicador de condición. En consecuencia, la secuencia de tres instrucciones anterior se convertiría en cinco.

    
respondido por el supercat

Lea otras preguntas en las etiquetas