I. ARQUITECTURA ARM CORTEX‐M3: I.1. Introducción: Las soluciones System‐on‐chip basadas en procesadores embebidos ARM
Views 154 Downloads 69 File size 2MB
I. ARQUITECTURA ARM CORTEX‐M3: I.1. Introducción: Las soluciones System‐on‐chip basadas en procesadores embebidos ARM están pensadas para llegar a diferentes sectores de mercado por lo que deben de dar cobertura a gran cantidad de posibles aplicaciones. Por ello ARM tiene varias familias de procesadores basadas en la arquitectura ARMv7, que se diferencian según las aplicaciones a las que están orientadas:
Cortex‐A, para aplicaciones que corren en sistemas operativos. Cortex‐R, para sistemas en tiempo real. Cortex‐M, para aplicaciones con microcontroladores.
A finales del 2005 ARM publica la primera versión del Manual de Referencia de la familia Cortex‐M3 ó Cortex‐M3 Technical Reference Manual, comenzando así la comercialización de la nueva familia de procesadores. El procesador Cortex‐M3 es el primer procesador basado en la arquitectura ARMv7‐M que ha sido específicamente diseñado para lograr un alto rendimiento en la relación potencia‐coste para aplicaciones embebidas. El núcleo del procesador (core) del Cortex‐M3 está basado en una arquitectura de bus Harvard (memoria de datos y de programa separadas) con 3 niveles en la ejecución de instrucciones ó 3‐Stage Pipeline. El core incorpora internamente un multiplicador (de ciclo único) y un divisor con una eficiencia de DMIPS/MHz (Millones de instrucciones sin coma flotante por segundo). Además el procesador Cortex‐M3 implementa el set de instrucciones Thumb‐2 que combinada con características como el almacenamiento de datos no alineados o la manipulación a nivel de bit, consigue funcionalidades de 32 bits con un coste de rendimiento equivalente al de los dispositivos actuales de 16 y 8 bits. I.1.1. Características principales: Arquitectura ARMv7‐M, optimizada para microcontroladores y aplicaciones de bajo coste. Set de instrucciones Thumb‐2. Se consigue una mejor densidad de código y mayor rapidez de ejecución del mismo.
Estructura jerárquica de los periféricos integrados: o Núcleo del procesador (core) CM3: Arquitectura de bus Harvard (memorias de programa y de datos separadas). Ejecución de instrucciones con 3‐stage pipeline con branch speculation. Controlador de interrupciones vectoriales anidadas (NVIC). o Unidad de protección de memoria (MPU): Unidad de protección de memoria (MPU). Componente opcional. Separa las tareas en ejecución y protege los datos. 8 Regiones de protección de memoria divididas a su vez en otras 8 subregiones. Las regiones pueden estar comprendidas desde 32 bytes hasta los 4 Gigabytes de memoria direccionables. o Embedded Trace Macrocell (ETM): Componente opcional. Reproduce una traza de instrucciones en tiempo real. o Watchpoints y unidad de traza (DWT) Sirve para implementar breakpoints hardware y proporcionar estadísticas de la ejecución de instrucciones. o Flashpatch y unidad de breakpoint (FPB) Puede implementar hasta 6 breakpoints en el programa y 2 breakpoints de datos (detienen el programa al referencia a una determinada variable) o Puerto de depuración (SW‐DP ó SWJ‐DP) Depuración configurable a través de puerto serie ó interface JTAG.
o Multiplicadores de ciclo único e instrucciones de división Multiplicaciones de 32 bits en un único ciclo. Operaciones de división con y sin signo entre 2 y 12 ciclos. o Mapa de memoria preconfigurado. o 4 Gigabytes de memoria direccionables. o Manipulación a nivel de bits en bit‐banding: Acceso directo a datos de tipo bit. 2 Regiones de bit‐banding de 1 Megabyte cada una. Las operaciones a nivel de bit no pueden ser interrumpidas por las actividades de otro bus. o Almacenamiento y acceso a datos no alineados: Almacenamiento continuo de datos de diferente tamaño. Acceso a datos en un único ciclo de acceso del core. o Modos sleep integrados: Modo sleep now para pasar inmediatamente a modo de bajo consumo. Modo sleep exit para pasar a bajo consumo después de atender a una interrupción. Capacidad de poner en power saving (modo de bajo consumo tras transcurrir un determinado tiempo) a otros componentes del sistema. I.1.2. Principales ventajas: Alta funcionalidad o 1.25 DMIPS/MHz o El uso del set de instrucciones Thumb‐2 proporciona una mejor densidad de código y mayor rapidez de ejecución que en otras familias o tecnologías.
Bajo coste de manufactura por el alto nivel de integración, menor requerimiento de memoria y reducción de pines para reducir el coste del encapsulado. Eficiencia energética. Mayor facilidad para mantenerse mucho tiempo en el mercado: o Facilidad de diseño (NVIC, ETM, MPU, depuración integrada). o Facilidad de desarrollo del software (set de instrucciones Thumb‐ 2, NVIC). Buena elección para migrar diseños basados en 8 ó 16 bits a 32 bits, ya que el modelo de programación es compatible con la arquitectura tradicional de ARM I.1.3. Ejecución de instrucciones (execution pipeline stages): El núcleo del procesador ejecuta las instrucciones en tres pasos:
Cuando una instrucción en ejecución pasa del primer al segundo paso de ejecución, la siguiente instrucción pasa al primero y así continuamente en los tres pasos. De esta manera se consigue acelerar la ejecución de instrucciones. A continuación se describen los tres procesos: Fe: Es llevado acabo por la prefetch unit del núcleo del procesador. En este paso el core carga la instrucción de donde corresponda. De: Éste es el paso en el que la instrucción se decodifica. Si en este paso la instrucción decodificada resulta ser un salto condicional se produce un branch o bifurcación, en donde se ha de elegir la siguiente instrucción a ejecutar (la que debe entrar en el primer paso). Lo complicado es saber cuál es esta instrucción cuando aún no se ha ejecutado la anterior. Para ello el procesador usa una técnica llamada branch prediction ó branch speculation, que consiste en una circuitería que “predice” la siguiente instrucción a ejecutar. Si resulta ser correcta el proceso sigue con normalidad, si no se tendrá que pasar por todo el proceso de nuevo, aumentando el tiempo de ejecución. Ex: Ejecución de la instrucción. Tras esta fase se conoce si la dirección cargada tras el branch era correcta o no. Ésta no pretende ser una explicación detallada del proceso de ejecución de instrucciones, pues ese no es el tema central del TFC, ni del capítulo, pero basta para hacerse una idea del proceso. I.2. Modelo del programador (Programmer’s model): El procesador lleva implementada la arquitectura ARMv7. Incluye el set de instrucciones Thumb‐2 de 16 y 32 bits, pero no puede ejecutar instrucciones ARM. Para mayor información de la arquitectura ARMv7‐M ó del set de instrucciones Thumb‐2 consultar el documento ARMv7‐M Architecture Reference Manual en la página web de ARM. I.2.1. Modos de funcionamiento:
El procesador soporta dos modos de operación:
Threat mode: Entra en este modo tras un reset, aunque también puede entrar como resultado de un retorno de excepción. El código puede correr en este modo tenga o no privilegios (privileged code y unprivileged code respectivamente).
Handler mode: Entra en este modo como resultado de una excepción. En este modo todo el código es privilegiado (privileged code).
El procesador, además, puede operar en 2 estados de operación:
Thumb state: ejecución normal, corriendo instrucciones thumb de 16 y 32 bits.
Debug state: Cuando está depurando.
El procesador soporta los siguientes tipos de datos:
Palabras de 32 bits (words).
Medias palabas de 16 bits (halfwords).
Bytes (8 bits).
I.2.2. Acceso privilegiado y no privilegiado: El código puede ser ejecutado como privilegiado o no privilegiado. Si se ejecuta como no privilegiado no se tiene acceso a algunos recursos:
Uso de algunas instrucciones (como CPS, que sirve para el manejo de los registros de enmascaramiento de interrupciones).
Acceder a la mayoría de registros des “espacio de control del sistema” (System Control Space, SCS).
El modo Thread es privilegiado tras el reset, pero puede cambiarse a no privilegiado cambiando el bit de control CONTROL[0] (registro de control de propósito especial. Tiene 2 bits, uno indica el modo de ejecución de las instrucciones, y el otro cómo se usará la pila); con la instrucción MSR. En el Thread mode no se puede cambiar la ejecución del código a privilegiado. Para ello primero hay que pasar a Handler mode.
I.2.3. Registros:
El procesador tiene los siguientes registros de 32 bits: R0 R1 R2 R3 R4 R5 R6 R7 R8 R9 R10 R11 R12 R13 (SP) R14 (LR) R15 (PC) xPSR
R0 – R7: Low registers. R8 – R12: High registers. R0 – R12: Registros de propósito general. R13: Puntero de pila. Puede contener la dirección sp_main (cuando se ejecuta privileged code) ó sp_process (cuando se ejecuta unprivileged code). R14: Link register. R15: Contador de programa (Program counter). xPSR: Special purpose program status register.
A continuación se detallará el uso de los registros mencionados: Low registers: Registros del R0 al R7. Son accesibles con todas las instrucciones que los especifiquen. High registers: Registros del R8 al R12. Sólo son accesibles a través de instrucciones de 32 bits (no de 16 bits). Stack pointer (SP): El registro R13 es usado como puntero de pila. En Handler mode contiene SP_main (código privilegiado), en Thread mode puede contener SP_main ó SP_process (código no privilegiado). Link register (LR): El registro R14 recibe la dirección que retorna el contador de programa cuando ejecuta las instrucciones de salto BL (Branch with link) ó BLX (Branch with link and exchange). También puede usarse como retorno de excepción. Si no se está usando con nada de lo anterior, puede usarse como registro de propósito general. Program counter (PC): El registro R15 es el contador de programa
Special purpose program status register (xPSR): El registro xPSR está formado a su vez por 3 registros a los que se puede acceder de forma individual (APSR, IPSR, EPSR):
o APSR (Aplication PSR): Contiene los flags de condición. Antes de entrar una excepción el procesador salva los flags de condición en la pila. Para acceder a éste registro se usan las instrucciones MSR y MRS: N: Resultado negativo o menor que (1), ó positivo o mayor que (0). Z: Resultado igual a 0 (1), ó distinto de 0 (0). C: Hay carry ó borrow (1), o no lo hay (0). V: Hay overflow (1), o no lo hay (0). Q: Flag de saturación. o IPSR (Interrupt PSR): Contiene la Interrupt Service Routine (ISR). Número de la interrupción que está activada. o EPSR (Execution PSR): El registro EPSR no es directamente accesible. 2 Eventos pueden identificarlo: Una interrupción ocurrida durante las instrucciones durante las instrucciones LDS ó STM. Ejecución de una instrucción if‐then.
El registro EPSR tiene dos campos solapados:
Interruptable‐Continuable Instruction (ICI): Mantiene la información requerida en instrucciones de carga ó almacenamiento múltiple desde el momento en el que ocurre la interrupción.
If‐then (IT): Contiene los bits de estado para la ejecución de la instrucción if‐then.
Como los campos ICI e IT están solapados, las cargas ó almacenamientos múltiples dentro de un bloque if‐then no pueden ser interrupt‐continued. I.2.4. Formatos de memoria: El procesador ve la memoria como una serie lineal de bytes numerados en orden ascendente desde 0. El procesador puede acceder a las palabras de datos en memoria en formato Little endian (por defecto en procesadores ARM) ó big endian. En el formato Little endian el byte de menor dirección en la palabra, es el byte menos significativo de la palabra. El procesador tiene un pin de configuración (BIGEND) para configurar el modo. Éste pin es sampleado tras un reset. Cualquier cambio en dicho pin después del reset es ignorado. El acceso al System Control Space (SCS), es siempre little endian. Lo mismo ocurre con el acceso al Private Peripheral Bus (PPB). I.2.5. Set de instrucciones: El procesador de la familia Cortex‐M3 puede ejecutar las siguientes instrucciones Thumb‐2 de 16 y 32 bits:
Instrucciones de 16 bits: Operation Add register value and C flag to register value Add immediate 3‐bit value to register Add immediate 8‐bit value to register Add low register value to low register value Add high register value to low or high register value Add 4* (immediate 8‐bit value) with PC to register Add 4* (immediate 8‐bit value) with SP to register Add 4* (immediate 7‐bit value) to SP Bitwise AND register values Arithmetic shift right by immediate number Arithmetic shift right by number in register Branch conditional Branch unconditional Bit clear Software breakpoint
Assembler ADC , ADD , , # ADD , # ADD , , ADD , ADD , PC, # * 4 ADD , SP, # * 4 ADD SP, # * 4 AND , ASR , , # ASR , B B BIC , BKPT
Branch with link Branch with link and exchange Branch and exchange Compare not zero and branch Compare zero and branch Compare negation of register value with another register value Compare immediate 8-bit value Compare registers Compare high register to low or high register Change processor state Copy high or low register value to another high or low register Bitwise exclusive OR register values Condition the following instruction Condition the following two instructions Condition the following three instructions Condition the following four instructions Multiple sequential memory word loads Load memory word from base register address + 5-bit immediate offset Load memory word from base register address + register offset Load memory word from PC address + 8-bit immediate offset Load memory word from SP address + 8-bit immediate offset Load memory byte [7:0] from register address + 5-bit immediate offset Load memory byte [7:0] from register address + register offset Load memory halfword [15:0] from register address + 5-bit immediate offset Load halfword [15:0] from register address + register offset Load signed byte [7:0] from register address + register offset Load signed halfword [15:0] from register address + register offset Logical shift left by immediate number Logical shift left by number in register Logical shift right by immediate number Logical shift right by number in register Move immediate 8-bit value to register Move low register value to low register Move high or low register value to high or low register Multiply register values Move complement of register value to register Negate register value and store in register No operation Bitwise logical OR register values Pop registers from stack Pop registers and PC from stack Push registers onto stack Push LR and registers onto stack Reverse bytes in word and copy to register Reverse bytes in two halfwords and copy to register Reverse bytes in low halfword [15:0], sign-extend, and copy to register Rotate right by amount in register Subtract register value and C flag from register value Send event Store multiple register words to sequential memory locations Store register word to register address + 5-bit immediate offset Store register word to register address Store register word to SP address + 8-bit immediate offset Store register byte [7:0] to register address + 5-bit immediate offset Store register byte [7:0] to register address Store register halfword [15:0] to register address + 5-bit immediate offset
BL BLX BX CBNZ , CBZ , CMN , CMP , # CMP , CMP , CPS , CPY EOR , IT IT IT IT LDMIA !, LDR , [, # * 4] LDR , [, ] LDR , [PC, # * 4] LDR, , [SP, # * 4] LDRB , [, #] LDRB , [, ] LDRH , [, # * 2] LDRH , [, ] LDRSB , [, ] LDRSH , [, ] LSL , , # LSL , LSR , , # LSR , MOV , # MOV , MOV , MUL , MVN , NEG , NOP ORR , POP POP PUSH PUSH REV , REV16 , REVSH , ROR , SBC , SEV STMIA !, STR , [, # * 4] STR , [, ] STR , [SP, # * 4] STRB , [, #] STRB , [, ] STRH , [, # * 2]
Store register halfword [15:0] to register address + register offset Subtract immediate 3-bit value from register Subtract immediate 8-bit value from register value Subtract register values Subtract 4 (immediate 7-bit value) from SP Operating system service call with 8-bit immediate call code Extract byte [7:0] from register, move to register, and sign-extend to 32 bits Extract halfword [15:0] from register, move to register, and sign-extend to 32 bits Test register value for set bits by ANDing it with another register value Extract byte [7:0] from register, move to register, and zero-extend to 32 bits Extract halfword [15:0] from register, move to register, and zero-extend to 32 bits Wait for event Wait for interrupt
STRH , [, ] SUB , , # SUB , # SUB , , SUB SP, # * 4 SVC SXTB , SXTH , TST , UXTB , UXTH , WFE WFI
Instrucciones de 32 bits: Operation
Assembler
Add register value, immediate 12-bit value, and C bit
ADC{S}.W , , #
Add register value, shifted register value, and C bit
ADC{S}.W , , {, }
Add register value and immediate 12-bit value
ADD{S}.W , , #
Add register value and shifted register value Add register value and immediate 12-bit value
ADD{S}.W , {, }
Bitwise AND register value with immediate 12-bit value
AND{S}.W , , #
Bitwise AND register value with shifted register value Arithmetic shift right by number in register Conditional branch Clear bit field Insert bit field from one register value into another Bitwise AND register value with complement of immediate 12-bit value Bitwise AND register value with complement of shifted register value Branch with link Branch with link (immediate) Unconditional branch Clear exclusive clears the local record of the executing processor that an address has had a request for an exclusive access. Return number of leading zeros in register value Compare register value with two’s complement of immediate 12-bit value Compare register value with two’s complement of shifted register value Compare register value with immediate 12-bit value Compare register value with shifted register value Data memory barrier Data synchronization barrier
AND{S}.W , , Rm>{, }
Exclusive OR register value with immediate 12-bit value
EOR{S}.W , , #
Exclusive OR register value with shifted register value Instruction synchronization barrier
EOR{S}.W , , {, }
ADDW.W , , #
ASR{S}.W , , B{cond}.W BFC.W , #, # BFI.W , , #, # BIC{S}.W , , # BIC{S}.W , , {, } BL BL B.W CLREX CLZ.W , CMN.W , # CMN.W , {, } CMP.W , # CMP.W , {, } DMB DSB
ISB
Load multiple memory registers, increment after or decrement before Memory word from base register address + immediate 12-bit offset Memory word to PC from register address + immediate 12-bit offset Memory word to PC from base register address immediate 8-bit offset, postindexed Memory word from base register address immediate 8-bit offset, postindexed Memory word from base register address immediate 8-bit offset, preindexed Memory word to PC from base register address immediate 8-bit offset, preindexed Memory word from register address shifted left by 0, 1, 2, or 3 places Memory word to PC from register address shifted left by 0, 1, 2, or 3 places Memory word from PC address immediate 12-bit offset Memory word to PC from PC address immediate 12-bit offset Memory byte [7:0] from base register address + immediate 12-bit offset Memory byte [7:0] from base register address immediate 8-bit offset, postindexed Memory byte [7:0] from register address shifted left by 0, 1, 2, or 3 places Memory byte [7:0] from base register address immediate 8-bit offset, preindexed Memory byte from PC address immediate 12-bit offset Memory doubleword from register address 8-bit offset 4, preindexed Memory doubleword from register address 8-bit offset 4, postindexed Load register exclusive calculates an address from a base register value and an immediate offset, loads a word from memory, writes it to a register Load register exclusive halfword calculates an address from a base register value and an immediate offset, loads a halfword from memory, writes it to a register Load register exclusive byte calculates an address from a base register value and an immediate offset, loads a byte from memory, writes it to a register Memory halfword [15:0] from base register address + immediate 12-bit offset Memory halfword [15:0] from base register address immediate 8-bit offset, preindexed Memory halfword [15:0] from base register address immediate 8-bit offset, postindexed Memory halfword [15:0] from register address shifted left by 0, 1, 2, or 3 places Memory halfword from PC address immediate 12-bit offset Memory signed byte [7:0] from base register address + immediate 12-bit offset Memory signed byte [7:0] from base register address immediate 8-bit offset, postindexed Memory signed byte [7:0] from base register address immediate 8-bit offset, preindexed Memory signed byte [7:0] from register address shifted left by 0, 1, 2, or 3 places Memory signed byte from PC address immediate 12-bit offset
LDM{IA|DB}.W {!}, LDR.W , [, #] LDR.W PC, [, #] LDR.W PC, [Rn], #