Lo primero que hay que aclarar es que los procesadores ARM son todos de 32 bits. No hay de 8 ni de 16 bits.
Hay distintas versiones de núcleos, adaptados a distintas aplicaciones.
Cuando se habla de ARM7 estamos diciendo que la versión de ARM es la 7.
La versión 4 es la línea base. La versión 5 está orientada a procesamiento digital de señales. La versión 6 a encriptación de datos y motores gráficos.
La versión 7 se subdivide en tres ramas:
- A: de "Advance", se utiliza para dispositivos que requieren potencia de cálculo, como celulares y notebooks.
- R: de tiempo real, para aplicaciones donde se requiere que el sistema sea determinístico.
- M: de microcontroladores, se hace foco en el bajo consumo de energía con prestaciones intermedias.
La arquitectura ARM sigue los lineamientos de procesadores RISC (reduced instruction set computer). De hecho ARM significa Advanced RISC Machine. Los lineamientos son:
- Ejecución de instrucciones en 1 solo ciclo de reloj: esto si bien para alguien que programa en C no tiene mayor importancia, sí es importante para preservar una arquitectura sencilla, porque los pipelines se mantienen sencillos; mejor dicho menos complicados que con instrucciones de más de 1 ciclo. Y esto a su vez incide en el tamaño de silicio requerido para hacer la arquitectura, el consumo, etc, etc.
- Conjunto reducido de instrucciones: mentira ! ! !. Esto en realidad ya no es así, hay ARM's con más de 600 instrucciones distintas (sí, 600 ! ! ! ). A medida que se van agregando funcionalidades (unidades de punto flotante, soporte multi-procesador, etc) inevitablemente se agranda el conjunto de instrucciones.
- Instrucciones de manejo de memoria load/store: no se pueden hacer operaciones memoria a memoria, por ejemplo, no hay una instrucción que haga una operación con numeros almacenados en memoria, solo se opera con los registros.
Cuando les preguntaron con que linea conviene empezar para aprender, recomendaron la línea ARM7 y la Cortex-M3.
Una característica que destacaron de los ARM en general, es la baja relación mW/MHz (miliwatts a megahertz).
Para un ARM7 suele andar en 0.35 mW/MHz pudiendo correr a 200 MHz.
Para un Cortex-A8 corriendo a 1200 MHz anda en 0.43 mw/MHz.
Nótese que esa es una característica fundamental cuando pensamos en dispositivos móviles con potencia de procesamiento, mayor disipación requiere refrigeración, y mayor tamaño del dispositivo lo que no es para nada deseable.
Luego mencionaron distintas variantes de la arquitectura:
NEON, Cortex-A: pensada para gŕaficos, reconocimiento de habla, punto flotante.
Cortex-M1: es un procesador especialmente adaptado para meterlo en una FPGA, para que entre ocupando mínimos recursos de la FPGA.
MPCORE: para múltiples núcleos
Hay versiones de conjunto de instrucciones reducidas: Thumb y Thumb2.
Son conjuntos de instrucciones de 16 bits que cubren las instrucciones más utilizadas en los ARM.
Por ejemplo, en vez de hacer una especie de:
add r1,r2,3 (r1=r2+r3) se puede hacer
add r2,r2,r3 que en thumb se trasladaría a add r2,r3. Ahí me ahorra de especificar un operando, y más o menos de esa forma se reduce el tamaño de instrucción de 32 a 16 bits.
¿Por qué es deseable usar instrucciones de 16 bits en vez de 32?:
- Densidad de código: se obtiene una mayor cantidad de instrucciones para el mismo tamaño de memoria
- Precio: la memoria de 16 bits es más barata que la de 32 bits.
- Mayor performance
Solo las instrucciones pueden ser de 16 bits, los datos siempre son de 32 bits, no importa si usa thumb o no.
Thumb2 es otro conjunto de instrucciones de 16 bits, con el que se logra un 25% más de velocidad que thumb, con igual densidad de código.
Dado el pantallazo de las diferencias entre las familias ARM, pasaron a hablar de las cosas comunes de ARM que son distintas a núcleos de otras empresas.
Modos de operación:
- User: modo de operación normal
- FIQ: modo de interrupción rápida
- IRQ: modo de interrupción
- Supervisor: cuando se reinicia (resetea) el dispositivo se entra en este modo
- Abort
- Undef
- System
Los modos Abort, Undef entraban en juego si uno accedía a una posición de memoria inválida, o se cargaba una instrucción con código de operación desconocido. No recuerdo cual es cual, pero esa información está disponible en la web.
Una característica interesante, en particular para el modo FIQ (fast interrupt request, modo de interrupción rápida) es que se usa un conjunto distinto de registros.
Es decir, uno se sigue refiriendo a los registros con los nombres de siempre (R1, R4, etc) pero físicamente son registros diferentes a los de los otros modos. Son registros gemelos.
Esto da un ahorro de tiempo ya que se elimina la necesidad de salvar los valores de los registros, para lo cual se necesita a acceder a memoria que siempre es lenta y consume tiempo.
Hablaron también de excepciones, si mal no recuerdo se referían a los estados Abort y Undef. No recuerdo mucho más de eso, igualmente la intención no es dar una explicación detallada de todas las características de la arquitectura, sino remarcar que es lo que se hablo en el seminario.
La ejecución de todas las instrucciones es condicional, en todos los códigos de operación se incluyen bits para eso.
¿A que me refiero con eso?, a que cualquier instrucción se le pueden poner como sufijo las mismas condiciones que en un salto.
Es extender las clásicas instrucciones bne, beq, bz, bc, bnc, etc; a las demás instrucciones (add, sub, ldr, etc).
Y para terminar, tambien hay especificadores de tamaño.
Por ejemplo, LDREQB cargaría un valor en un registro (LDR) si una comparación de igualdad previa se cumplió (EQ), y el valor a cargar sería de tamaño byte (B).
Esto ahorra saltos, los que siempre hacen perder eficiencia al pipeline.
Bueno, dejo para después una 3ra parte cortita donde hablaron de AMBA (bus de interfaz con el ARM) y desarrollo.
-- Continuará --