Você está na página 1de 21

ELECTRÓNICA DIGITAL Y MICROPROCESADORES

ARM Cortex-M4

Apuntes sobre arquitectura y modelo de


programación

Escuela Técnica Superior de Ingeniería y Diseño Industrial


Departamento de Ingeniería Eléctrica, Electrónica, Automática y Física Aplicada
Electrónica Digital y Microprocesadores Apuntes ARM Cortex-M4

Índice
Índice __________________________________________________________________________________ 2
1. Introducción a la arquitectura Arquitectura ARM Cortex-M4 ______________________________ 3
1.1. Pipeline _______________________________________________________________________ 3
1.2. Mapa de memoria _______________________________________________________________ 4
1.3. Acceso a memoria - Endianness ___________________________________________________ 4
1.4. Buses del ARM Cortex-M__________________________________________________________ 5
1.5. STM32F407 ____________________________________________________________________ 6
2. Modelo de programación ___________________________________________________________ 7
2.1. Registros ______________________________________________________________________ 7
2.2. Registros de la unidad de coma flotante (FPU) _______________________________________ 8
2.3. Registro de estado ______________________________________________________________ 8
2.4. Unidad aritmético-lógica (ALU) ____________________________________________________ 9
2.5. Otras características del modelo de programación ____________________________________ 9
3. Juego de instrucciones – ISA (Instruction Set Architecture) ______________________________ 10
3.1. Sintaxis del lenguaje ensamblador ________________________________________________ 10
3.2. Modos de direccionamiento admitidos _____________________________________________ 11
3.3. Instrucciones de procesado de datos ______________________________________________ 12
3.4. Instrucciones de acceso a memoria _______________________________________________ 13
3.6. Instrucciones de salto y control __________________________________________________ 14
3.7. Códigos de condición ___________________________________________________________ 14
3.8. Sintaxis de un fichero para un programa ensamblador ________________________________ 15
3.9. Directivas ____________________________________________________________________ 15
3.10. Toolchain_____________________________________________________________________ 17
3.11. Depuración de código___________________________________________________________ 19
Definición de privilegios de acceso a memoria en el modo Debug ____________________________ 20
4. Bibliografía _____________________________________________________________________ 21
Electrónica Digital y Microprocesadores Apuntes ARM Cortex-M4

1. Introducción a la arquitectura Arquitectura ARM Cortex-M4


La tarjeta de desarrollo STM32 F4 Discovery del laboratorio está basada en el microcontrolador STM32F407
(o el STM32F411) del fabricante ST, que a su vez está basado en el núcleo (procesador) Cortex-M4 de ARM.
El Cortex M-4 es un procesador RISC de 32 bits con arquitectura Harvard mejorada y pipeline de 3 etapas.
El núcleo incluye una unidad de coma flotante - FPU (Floating Point Unit) y un repertorio de instrucciones
para procesamiento digital de señal – DSP (Digital Signal Processing).

La arquitectura de un microprocesador viene descrita por los modelos funcionales que lo describen desde
el punto de vista de un programador: el juego de instrucciones con los que controlar al procesador, el
conjunto de registros disponibles, el mapa de memoria disponible, los buses de transferencia de datos
entre los distintos componentes (datapath), la arquitectura de pipeline, los modos de operación del
procesador o el modo de gestión de las interrupciones. La mayor parte de estos modelos están definidos
en la arquitectura estándar ARMv7-M, que el Cortex-M4 trata de implementar. Otros, son específicos de
la implementación particular del Cortex-M4. Asimismo, el microcontrolador de la tarjeta de desarrollo,
STM32F407 es una implementación de la firma ST del diseño Cortex-M4 ideado por ARM.

1.1. Pipeline
El ARM Cortex-M4 utiliza arquitectura Harvard con pipeline de 3 etapas:

 recuperar instrucción (fetch)


 decodificar instrucción (decode)
 ejecutar (execute)

Gracias a este pipeline, es capaz de recuperar instrucciones (fetch) de forma simultánea con la ejecución
de otra (execute), incluso si esta requiere acceso a memoria de datos gracias a la arquitectura Harvard.
Este paralelismo permite acelerar la ejecución de código. Por ejemplo, ejecutar las 4 instrucciones de la
figura siguiente requeriría 12 ciclos de reloj en ausencia de paralelismo (4 instrucciones x 3
ciclos/instrucción), pero se reduce a 6 ciclos en el Cortex-M.
Electrónica Digital y Microprocesadores Apuntes ARM Cortex-M4

Nota: las instrucciones del Cortex-M utilizan 16 o 32 bits, por lo que el bus de datos es de 32 bits. El
paralelismo mostrado en la etapa fetch es posible si se recuperan instrucciones de 16 bits.

1.2. Mapa de memoria


Dado que Cortex-M tiene un bus de datos de 32 bits, puede accederse a un total de 4 Gi direcciones de
byte, osea, 4 GiB (4 GB en nomenclatura popular). Cortex-M4 reserva espacios de su mapa para diferentes
usos, tal y como se describe en el mapa siguiente:

1.3. Acceso a memoria - Endianness


La memoria es direccionable por bytes (la dirección de memoria indican el número de byte), pero el
acceso a memoria puede hacerse por palabras de 32 bits (words), de 16 bits (halfwords) o bytes. Por
ejemplo, la palabra de la dirección 0x200000001 incluye los bytes 0x20000000, 0x20000001,
0x20000002 y 0x20000003. La organización de los bytes dentro de la palabra sigue el convenio little
endian, es decir, el byte menos significativo (LSB) se coloca en la dirección de memoria menor
(0x20000000 en el ejemplo). El byte más significativo iría en la dirección mayor (0x20000003).

1
Recuerde que 0x es una notación para números hexadecimales. 0x20000000 hace referencia a la dirección de
memoria en hexadecimal (20000000)16
Electrónica Digital y Microprocesadores Apuntes ARM Cortex-M4

MSB MSB-1 LSB+1 LSB

Palabra (word) en 0x20000000


Halfword en dirección 0x20000002 Halfword en 0x20000000
Byte en Byte en Byte en Byte en
0x20000003 0x20000002 0x20000001 0x20000000

1.4. Buses del ARM Cortex-M


Cortex-M utiliza una arquitectura Harvard avanzada. El acceso a las instrucciones y a la memoria de datos
se realiza a través de una combinación compleja de buses, separados según el espacio de direcciones al
que se quiera acceder, o a si se trata de recuperar una instrucción, leer datos, o comunicarse con un
periférico. No es preciso conocer en detalle esta estructura.

 El bus I-CODE se utiliza para recuperar (fetch) instrucciones de programa de la zona de memoria
reservada para código
 El bus D-CODE se utiliza para lectura de datos auxiliares (constantes) de la zona reservada para
código
 El bus de sistema da acceso al resto de la memoria y los periféricos

En un microcontrolador sencillo, la memoria de programa estará conectada a los buses D-CODE e I-CODE,
y la SRAM y los periféricos al bus de sistema.
Electrónica Digital y Microprocesadores Apuntes ARM Cortex-M4

1.5. STM32F407
Es un microcontrolador que implementa la arquitectura Cortex-M4, e incluye una larga lista de periféricos:

• Núcleo Cortex-M4
• 64kB RAM acoplada al núcleo
• Memoria de programa (Flash)
• SRAM
• Controlador DMA
• Generadores de reloj de alta y baja frecuencia
• Escaladores de frecuencia (divisores y PLL)
• Real Time Clock
• Temporizadores (TIM)
• Generadores de onda PWM
• Puertos de entrada/salida GPIO
Electrónica Digital y Microprocesadores Apuntes ARM Cortex-M4

• Conversores analógico-digitales (ADC)


• Conversores digital-analógico (DAC)
• Controlador Ethernet
• Interfaces de comunicaciones:
• SPI/I2S
• I2C
• USART/UART
• USB
• CAN
• SDIO
• Interfaz para cámara
• Watchdog
• Circuitos de regulación de tensión y gestión de la alimentación

2. Modelo de programación
La arquitectura del juego de instrucciones (Instruction Set Architecture – ISA) del Cortex-M es de tipo
load-store, es decir, la mayoría de las instrucciones no tienen acceso directo a la memoria, sino que
trabajan exclusivamente con los registros del procesador. Para cargar un dato en los registros desde la
memoria se utiliza la instrucción específica load. Para guardar datos de los registros de nuevo a memoria
se utiliza la instrucción store. De ahí el nombre de la arquitectura.

2.1. Registros
El procesador utiliza 16 registros de 32 bits. Los registros R0 a R12 son de propósito general, se utilizan
para almacenar variables de programa como el resultado de una operación o una dirección de memoria a
la que debe accederse. En cambio, el resto de registros tienen funciones especiales: R13 es el puntero
de pila (stack pointer – SP), del que en realidad existen dos versiones (Main Stack Pointer - MSP y Process
Stack Pointer –PSP) en función del modo de ejecución del procesador (por ejemplo para que el sistema
operativo use una, y la aplicación en ejecución use otra); R14 es el registro de enlace para las llamadas
a subrutinas (link register – LR); R15 es el contador de programa (program counter – PC), que almacena
la dirección de memoria de la siguiente instrucción a ejecutar.

Nota: las instrucciones codificadas en 16 bits no tienen acceso a los registros R8 a R12, por eso se
denominan high registers.
Electrónica Digital y Microprocesadores Apuntes ARM Cortex-M4

2.2. Registros de la unidad de coma flotante (FPU)


El Cortex-M4 cuenta con una unidad de coma flotante (FPU) que realiza operaciones aritméticas sobre
números codificados siguiendo el estándar de coma flotante IEEE 754 con precisión simple (32 bits) o doble
(64 bits), mediante un conjunto dedicado de instrucciones (por ejemplo VADD). Esta unidad utiliza su
propio banco de registros de 32 bits: S0 a S31. Se pueden utilizar directamente con el estándar de
precisión simple, o agrupados de dos en dos (D0 a D15) para formar registros de 64 bits.

2.3. Registro de estado


El registro de estado (Program Status Register) contiene información importante sobre el estado del
procesador y de la ejecución del programa:

El PSR es accesible a través de 3 alias, o versiones enmascaradas del registro completo, como si fueran 3
registros distintos:

 Application Program Status Register (APSR): contiene el estado actual de los bits o flags de
condición activados por las últimas instrucciones que se han ejecutado.
 Interrupt Program Status Register (IPSR): contiene el número de la excepción que se atiende en
una Interrupt Service Routine (se estudiarán en Sistemas Electrónicos Digitales)
 Execution Program Status Register (EPSR): contiene bits de estado sobre la ejecución

Nos fijaremos en el APSR especialmente, puesto que nos permite controlar el flujo de programa mediante
códigos de condición vinculados al estado de los flags N, Z, C, V y Q, que se detallan en la tabla:

Bit Descripción
31 N Flag Negativo / Menor que:
• 0: el resultado de la operación ha sido positivo, cero, “mayor que”, o “igual”
• 1: el resultado de la operación ha sido negativo o “menor que”
30 Z Flag Zero:
• 0: el resultado de la operación no fue cero
• 1: el resultado de la operación fue cero
29 C Flag Carry (acarreo):
• 0: una suma no produjo acarreo, o una resta produjo llevada (borrow)
• 1: una suma produjo acarreo, o una resta no produjo llevada (borrow)
Electrónica Digital y Microprocesadores Apuntes ARM Cortex-M4

28 V Flag oVerflow (desbordamiento):


• 0: la operación no produjo desbordamiento (overflow)
• 1: la operación produjo desbordamiento (por ej. la suma de dos números positivos produjo un
resultado negativo)
27 Q Flag de saturación (para aritmética saturada) o desbordamiento DSP
• 0: no ha habido saturación
• 1: las instrucciones SSAT o USAT han resultado en saturación / desbordamiento DSP

2.4. Unidad aritmético-lógica (ALU)

La unidad de cálculo (Arithmetic Logic Unit – ALU) utiliza operandos de hasta 32 bits. El operando 1 se
toma directamente del banco de registros (Rn). El operando 2 se toma también del banco de registros
(Rm), pero se hace pasar por una unidad desplazadora de bits (barrel shifter) en serie con la ALU, lo que
permite realizar operaciones con operandos desplazados o escalados sin necesidad de invocar
instrucciones adicionales de desplazamiento (ver más adelante las instrucciones shift o rotate). Esto
permite modos de direccionamiento muy potentes para recorrer vectores de datos de forma eficiente.

El resultado de las operaciones se almacena de nuevo en el banco de registros (Rd). El usuario puede
decidir si el resultado afectará o no a los flags (N, Z, C, V…) del registro de estado APSR.

2.5. Otras características del modelo de programación


Existen partes fundamentales del modelo de programación que no es necesario dominar para comprender
el funcionamiento del Cortex-M4, por lo que sólo las mencionaremos brevemente. Se estudiarán con más
detalle en la asignatura Sistemas Electrónicos Digitales:

 Modos de operación del procesador


o Thread mode: para ejecutar aplicaciones
o Handler mode: para atender excepciones
 Niveles de privilegio de ejecución:
o Unprivileged: no se puede acceder al espacio de configuración interna del procesador,
al temporizador de sistema o al controlador de interrupciones
o Privileged: sin restricciones de acceso

Privileged Unprivileged

 Gestión de
Handler excepciones
mode
 Stack: MSP

 Aplicaciones sin  Aplicaciones con


restricciones de acceso restringido
Thread
acceso al sistema al sistema
mode
 Stack: MSP/PSP  Stack: MSP/PSP
Electrónica Digital y Microprocesadores Apuntes ARM Cortex-M4

 Excepciones e interrupciones
o Una excepción es un evento asíncrono que interrumpe el desarrollo normal de la
ejecución de un programa. Puede estar generado por software o por los periféricos (se
denominan “interrupciones”, un tipo de excepción), o por el propio hardware del
sistema (por ejemplo, un fallo de acceso a la memoria de programa). Cuando se genera
una excepción, el procesador suspende la tarea que está realizando en ese momento,
salva el contexto en la pila (es decir, introduce el contenido de los registros más
importantes en la memoria apuntada por el registro R13 o stack pointer) e inicia una
rutina de gestión de la excepción. Las excepciones de sistema se atienden con Exception
Handlers, y las interrupciones, menos dramáticas, con Interrupt Service Routines (ISR).
Una vez que la excepción ha sido atendida, el procesador recoge su contexto de la pila
y se retoma el hilo de ejecución anterior. El registro IPSR visto anteriormente contiene
el numero de ISR que está ejecutándose.
o El Cortex-M4 tiene un sistema de gestión de excepciones hardware y software: Nested
Vectored Interrupt Controller (NVIC), que asigna prioridades y gestiona la atención a
todas las excepciones posibles del sistema.
o El procesador entra en Handler mode siempre que atiende a una excepción.

3. Juego de instrucciones – ISA (Instruction Set Architecture)


Los programas se almacenan en la memoria como una sucesión de códigos binarios (código máquina) que
el procesador es capaz de decodificar o interpretar y, a continuación, ejecutar. Con el fin de facilitar la
tarea de codificación de instrucciones para el programador humano, se define un lenguaje ensamblador
(assembly language) como una colección de mnemotécnicos y reglas de formación de instrucciones, que
posteriormente un programa ensamblador (assembler) se encargará de convertir en los códigos máquina
adecuados2.

Al contrario que con un lenguaje de alto nivel como C, los códigos binarios que componen las instrucciones
son específicos de cada procesador o de la arquitectura que implementa. El Cortex-M4 está basado en la
arquitectura ARMv7-M, pensada para sistemas que vayan a ser utilizados en microcontroladores con un
uso eficiente de la memoria. ARMv7-M utiliza el juego de instrucciones Thumb2 (a su vez, un estándar de
codificación de instrucciones), que contiene instrucciones tanto de 16 bits como de 32 bits para optimizar
la memoria de código.

Las instrucciones disponibles en la arquitectura ARMv7-M pueden agruparse por el tipo de función que
realizan, principalmente, en:

 Instrucciones de procesado de datos


 Instrucciones de acceso a memoria (load-store)
 Instrucciones de salto y control

El listado completo está definido en el manual de referencia de la arquitectura ARMv7-M, pero existen
buenas síntesis disponibles3.

3.1. Sintaxis del lenguaje ensamblador


ARMv7-M recomienda seguir el estándar de sintaxis UAL (Unified Assembler Language). UAL define unas
reglas de escritura en lenguaje ensamblador para los mnemónicos y los operandos de cada instrucción,
pero éstos pueden traducirse después a codificaciones distintas. Por ejemplo, la suma de dos registros Rn

2
Note la ambigüedad del término “ensamblador”. Esta ambigüedad no existe en inglés.
3
Quick reference card for ARMv7 (Cortex-M4)
Electrónica Digital y Microprocesadores Apuntes ARM Cortex-M4

y Rm, cuyo resultado se almacene en el registro Rd, se realiza con la instrucción ADD Rd, Rn, Rm. Esta
instrucción puede codificarse con 16 o con 32 bits si pertenecen a los registros bajos (R0 a R7):

Codificación con
16 bits

Codificación con
32 bits

El formato típico de una instrucción en lenguaje ensamblador con sintaxis UAL:

<op>{flags}{cond} Rd , Rn , Op2
donde:

 { }: indican componentes opcionales


 <op>: mnemónico con el tipo de operación a realizar
 {flags}: se agrega una S al mnemónico para definir si la instrucción debe afectar a los bits de
estado del registro APSR
 {cond}: se agrega al mnemónico para definir condicionalidad en la ejecución
 Rd: registro de destino
 Rn: registro fuente para el primer operador
 Op2: fuente del segundo operador, de formato muy flexible (ver más adelante)
Por ejemplo, ADDSLT R0,R1,#15 suma el literal decimal “15” al contenido del registro R1, siempre que
se cumpla la condición LT (signed Less Than, ver a continuación los códigos de condición) según los bits
de estado del APSR (los bits N y V deben ser distintos). El resultado se guarda en el registro R0, y debe
afectar a los bits de estado del APSR.

El operando flexible Op2 puede hacer referencia a un literal (constante) o a muy diversas maneras de
utilizar el valor de un registro:

 Un literal: #imm. El literal puede ser cualquier constante de 32 bits que pueda escribirse como
un número de 8 bits rotado a la izquierda por un número cualquiera de bits
 O cualquier constante de la forma 0x00XY00XY, 0xXY00XY00 o 0xXYXYXYXY.
 El valor de un registro desplazado: Rm {, shift}. El desplazamiento shift puede ser:
 ASR #n: desplazamiento aritmético (respeta signo) a la dcha. n bits, 1 ≤n ≤ 32
 LSL #n: desplazamiento lógico a la izqda. n bits, 1 ≤n ≤ 31
 LSR #n: desplazamiento lógico a la dcha. n bits, 1 ≤n ≤ 32
 ROR #n: rotación a la dcha. n bits, 1 ≤n ≤ 31
 RRX: rotar a la dcha. un bit, con extensión
 —: si se omite, se usa Rm sin desplazamiento

3.2. Modos de direccionamiento admitidos


Describen de qué forma se suministran los operandos de una instrucción:

Nombre Ejemplo Descripción


Inmediato / Literal SUB R3, R2, #25 R3 ← R2 - 25
Sin desplazamiento ADD R3, R2, R1 R3 ← R2 + R1
Directo a registro con
SUB R4, R5, R9, LSR #2 R4 ← R5 - (R9 >> 2)
Directo a registro desplazamiento inmediato
Directo a registro con
ORR R0, R10, R2, ROR R7 R0 ← R10 | (R2 ROR R7)
desplazamiento por registro
Sin offset (Indirecto por registro) STR R6, [R11] mem[R11] ← R6
Indexado Indexado con offset inmediato STR R6, [R11, #77] mem[R11+77] ← R6
Indexado con offset por registro LDR R12, [R1, -R5] R12 ← mem[R1 - R5]
Electrónica Digital y Microprocesadores Apuntes ARM Cortex-M4

Indexado con offset por registro,


LDR R8, [R9, R2, LSL #2] R8 ← mem[R9 + (R2 << 2)]
con desplazamiento inmediato
R0 ← mem[PC + offset]
Relativo a PC LDR R0, [PC, #offset] PC es la dirección de la
instrucción actual + 4

Los modos indexados presentan 3 variaciones en función del cálculo de la dirección efectiva a acceder y
de si se actualiza o no el valor de la base:

Dirección efectiva Valor final de


Tipo de indexado Ejemplo accedida la base (Rb)

Pre-indexado, sin LDR Rd, [Rb, #offset] Rb + offset Rb


actualización de la base LDR Rd, [Rb, Ro] Rb + Ro Rb

Pre-indexado, con LDR Rd, [Rb, #offset]! Rb + offset Rb + offset


actualización de la base LDR Rd, [Rb, Ro]! Rb + Ro Rb + Ro
LDR Rd, [Rb], #offset Rb Rb + offset
Post-indexado
LDR Rd, [Rb], Ro Rb Rb + Ro

3.3. Instrucciones de procesado de datos


El objetivo esencial de un programa es realizar algún tipo de manipulación o procesado sobre un conjunto
de datos. Todos estos procesados pueden reducirse a un conjunto sencillo de operaciones:

 Desplazar o rotar los bits dentro de una palabra


 Operaciones lógicas a nivel de bit
 Operaciones aritméticas como la suma
 Mover datos de un registro a otro
 Manipulación individual de uno o varios bits
 Comparación

En la tabla siguiente se resumen las principales operaciones de procesado de datos:

Mnemónico Operandos Descripción Flags*


ADD{S} {Rd,} Rn, Op2 Add N,Z,C,V
AND{S} {Rd,} Rn, Op2 Logical AND N,Z,C
ASR{S} Rd, Rm, <Rs|#n> Arithmetic Shift Right N,Z,C
BIC{S} {Rd,} Rn, Op2 Bit Clear N,Z,C
CMP Rn, Op2 Compare N,Z,C,V
EOR{S} {Rd,} Rn, Op2 Exclusive OR N,Z,C
LSL{S} Rd, Rm, <Rs|#n> Logical Shift Left N,Z,C
LSR{S} Rd, Rm, <Rs|#n> Logical Shift Right N,Z,C
MUL{S} {Rd,} Rn, Rm Multiply, 32-bit result N,Z
MOV{S} Rd, Op2 Move N,Z,C
MVN{S} Rd, Op2 Move NOT N,Z,C
ORN{S} {Rd,} Rn, Op2 Logical OR NOT N,Z,C
ORR{S} {Rd,} Rn, Op2 Logical OR N,Z,C
ROR{S} Rd, Rm, <Rs|#n> Rotate Right N,Z,C
SUB{S} {Rd,} Rn, Op2 Subtract
TEQ Rn, Op2 Test Equivalence N,Z,C
* sólo si S se añade al mnemónico, salvo para CMP,CMN, que actualizan siempre los flags
Electrónica Digital y Microprocesadores Apuntes ARM Cortex-M4

Figura 1. Algunos ejemplos de operaciones lógicas bit a bit

Figura 2. Algunos ejemplos de operaciones de desplazamiento

3.4. Instrucciones de acceso a memoria


Al tratarse de una arquitectura load-store, las instrucciones de procesado de datos no pueden acceder a
la memoria: los datos de la memoria deben cargarse en registros (load) antes de poder procesarlos. Al
terminar el procesado, los datos se guardan en memoria (store).

Mnem. Operandos Descripción


Load Register with word
LDR Rt, [Rn, #offset] Almacena en el registro Rt la palabra contenida en la posición de memoria
apuntada por [Rn + #offset]
Load Multiple registers, increment after
Carga el contenido de la memoria apuntada por Rn en la lista de registros
LDM Rn{!}, reglist
especificada, y luego incrementa el puntero en Rn con el número de
palabras leídas
Store Register word
STR Rt, [Rn, #offset] Toma la palabra contenida en el registro Rt y la almacena en la posición de
memoria apuntada por [Rn + #offset]
STM Rn{!}, reglist Store Multiple registers, increment after
POP reglist Devolver a los registros de la lista los valores almacenados en la pila (SP)
PUSH reglist Guardar registros de la lista en la pila (SP)
*reglist es una lista de registros separada por comas y delimitada con {}. Ej.: {R1, R5}
Electrónica Digital y Microprocesadores Apuntes ARM Cortex-M4

3.6. Instrucciones de salto y control


Es raro que un programa deba ejecutar todas sus instrucciones de forma correlativa tal y como han sido
almacenadas en memoria. Para crear estructuras de control de flujo, se utilizan las instrucciones de
ramificación o salto, y de control, además de la condicionalidad de la ejecución que se describe en la
sección “Códigos de condición”.

Mnemónico Operandos Descripción


Branch – La siguiente instrucción a ejecutar será aquella
apuntada por etiqueta
B etiqueta
PC := etiqueta
etiqueta puede estar alejada ±32MB
Para llamar a una subrutina o función
Branch with Link
BL etiqueta LR := dirección de la instrucción siguiente
PC := etiqueta.
etiqueta puede estar alejada ±32MB
BLX Rm Branch indirect with Link
Para retorno de una subrutina: BL, LR
BX Rm Branch indirect: PC := Rm
En el caso de retorno de una subrutina (BL, LR): PC := LR
Rn, Compare and Branch if Non Zero
CBNZ
etiqueta
Rn, Compare and Branch if Zero
CBZ
etiqueta
NOP No Operation
WFE Wait For Event
WFI Wait For Interrupt

3.7. Códigos de condición


En ARM puede introducirse condicionalidad en la ejecución de prácticamente cualquier instrucción
mediante la adición de códigos de condición. Son mnemónicos que se añaden a la mayoría de las
instrucciones para introducir condicionalidad en su ejecución. Cada mnemónico evalúa el contenido de
distintos flags del registro de estado APSR, y la instrucción se ejecuta sólo si dicha condición se cumple.
Casi todas las instrucciones pueden ejecutarse de forma condicional de este modo. Por ejemplo ADD
R0,R1,R2 realiza una suma incondicional de los registros R1 y R2, poniendo el resultado en R0. Sin
embargo, ADDEQ R0,R1,R2 realiza la misma suma, pero solo si el bit Z del APSR vale 1.

Sufijo Flags Significado


EQ Z=1 Equal
NE Z=0 Not equal
CS/HS C=1 Carry set / Higher or same, unsigned ≥
CC/LO C=0 Carry clear / Lower, unsigned <
MI N=1 Negativo
PL N=0 Positivo o Cero
VS V=1 Overflow (desbordamiento)
VC V=0 Sin desbordamiento
HI C=1yZ=0 Higher, unsigned >
LS C=0oZ=1 Lower or same, unsigned ≤
GE N=V Greater than or equal, signed ≥
LT N != V Less than, signed <
GT Z=0yN=V Greater than, signed >
LE Z = 1 y N != V Less than or equal, signed ≤
AL Cualquier valor Always – Incondicional

Las instrucciones Thumb-2 requieren incluir las instrucciones condicionales dentro de bloques if-then. Se
trata de una instrucción especial (IT) que avisa al procesador de que hasta 4 instrucciones siguientes
serán ejecutadas de forma condicional:

IT{x{y{z}}} cond
Electrónica Digital y Microprocesadores Apuntes ARM Cortex-M4

 cond especifica la condición para que la primera instrucción del bloque se ejecute
 para una segunda instrucción opcional, {x} especifica si se ejecuta cuando se cumple cond (en
cuyo caso se escribe T, de then) o cuando se cumple su inversa (en cuyo caso se escribe E, de
else)
 para una tercera instrucción opcional, {y} especifica si la tercera instrucción se ejecuta según
cond (T) o su inversa (E)
 para una cuarta instrucción opcional,{z} especifica si la segunda instrucción se ejecuta según
cond (T) o su inversa (E)

CMP R0, R1 ; Si R0 == R1 -> Z = 1

ITTEE EQ ; Las próximas 4 instrucciones son condicionales


; cond = EQ, por lo que se evalúa si R0 == R1 comprobando
; si el flag Z == 1
MOVEQ R0, R1 ; T(1): MOVE si se cumple la condición (Z == 1)
ADDEQ R2, R2, #10 ; T(2): ADD si se cumple la condición (Z == 1)
ANDNE R3, R3, #1 ; E(3): AND si NO se cumple la condición Z == 1
; o sea, AND si Z == 0 (R0 != R1)
BNE.W dloop ; E(4): Branch si NO se cumple la condición Z == 1
; Las instrucciones Branch sólo pueden estar en la última
; posición de un bloque IT

3.8. Sintaxis de un fichero para un programa ensamblador


El código ensamblador suele escribirse en ficheros de texto simple (.s), siguiendo unas reglas de sintaxis
propias de cada programa ensamblador (o sea, dependen del toolchain elegido). Estas son las reglas
utilizadas en el entorno de desarrollo Keil µVision del laboratorio (ensamblador armasm):

; esto es un comentario
DIRECTIVA ; obligatorio dejar un espacio antes del texto
; las directivas son propias de cada programa ensamblador
etiqueta ; da nombre a la posición de memoria de la siguiente instrucción
; no debe haber espacios antes de una etiqueta
instrucción op1, op2 ; obligatorio dejar espacio antes

3.9. Directivas
Las directivas no son parte del código ensamblador, sino instrucciones destinadas a controlar el
comportamiento del programa ensamblador o el linker, es decir, son específicas de cada entorno de
desarrollo. Por ejemplo, la directiva AREA se usa para declarar una sección de código o datos nueva, y su
funcionalidad. En la tabla siguiente se resumen algunas de las directivas del emsamblador Keil µVision
(armasm) más utilizadas y su utilidad:

Directiva Keil Uso


AREA Define un bloque de código o datos
RN Asociar un nombre a un registro
EQU Asocia una etiqueta a una constante
ENTRY Declara el punto de inicio del programa
Reserva memoria y especifica el
DCB,DCW,DCD
contenido inicial de la misma
Alinea datos o código a un tamaño de
ALIGN
memoria
Electrónica Digital y Microprocesadores Apuntes ARM Cortex-M4

Reserva un bloque de memoria de un


SPACE
tamaño particular, inicializado a cero
Declara punto de inicio para un pool de
LTORG
literales (constantes globales)
END Señala el fin del código

El código a continuación muestra el uso de las directivas más importantes con un programa completo en
lenguaje ensamblador (en µVision, estaría definido en un fichero de texto con extensión .s) que realiza
la suma de los cinco primeros números pares, con algunas rutinas de inicialización típicas:

THUMB ; Codificar instrucciones como Thumb-2

StackSize EQU 0x00000100 ; Definir constante “StackSize ” = 256

AREA STACK, NOINIT, READWRITE, ALIGN=3 ;área de pila, lectura/escritura,


;alineada en grupos de 8=2^3 bytes
;no va a inicializarse (NOINIT)
MyStackMem SPACE StackSize ; Reservar zona de 256 bytes para la pila

AREA RESET, READONLY ; Zona de sólo lectura llamada “RESET”


EXPORT __Vectors ; Permite al linker usar la etiqueta “__Vectors”
; de forma global en otros ficheros objeto o lib,
; por ejemplo si está definida en otro archivo .s
__Vectors
DCD MyStackMem + StackSize ; puntero a la pila vacía
DCD Reset_Handler ; vector reset

AREA MYCODE,CODE,READONLY ; Zona de código, de sólo lectura


ENTRY ; Punto de entrada del programa

EXPORT Reset_Handler ; Permite usar la etiqueta de forma global


Reset_Handler

MOV R0, #0 ; R0 = 0
MOV R1, #2 ; R1 = 2
MOV R2, #5 ; R2 = 5
Lbegin ;etiqueta para la dirección de memoria de la siguiente
; instrucción, es decir, CBZ R2, lend
CBZ R2, lend ; Si R2 == 0 -> saltar a la dirección de la etiqueta lend
ADD R0, R1 ; R0 = R0 + R1
ADD R1, #2 ; R1 = R1 + 2
SUB R2, #1 ; R2 = R2 - 1
B lbegin ; saltar a la dirección de la etiqueta Lbegin (CBZ...)
lend
END
Electrónica Digital y Microprocesadores Apuntes ARM Cortex-M4

3.10. Toolchain
Para poder generar código ejecutable por el microprocesador, es necesario contar una serie de
herramientas de desarrollo de software: compilador de alto nivel, ensamblador, linker o enlazador,
cargador y depurador. Estas herramientas se utilizan típicamente en cascada, de mayor a menor nivel de
abstracción, y de menor a mayor nivel dependencia del microprocesador/microcontrolador concreto para
el que se desarrolla:

ARM Keil MDK (Microcontroller Development Kit) es un toolchain completo de desarrollo software para
microcontroladores o sistemas empotrados basados en microprocesadores ARM. En la figura se muestra un
ejemplo típico de flujo de desarrollo:

MDK utiliza µVision, una suite desarrollo completa que incluye:

 IDE para gestión de proyectos con Run-Time Environment, edición de código, recursos para
depuración… en la figura siguiente se muestran sus controles principales.
Electrónica Digital y Microprocesadores Apuntes ARM Cortex-M4

 Depurador (Debug) y trazador (Trace, para inspección del procesador en tiempo real) con
capacidad de simulación del Cortex-M
 Compilador ARM C/C++
 Ensamblador
 Gestor de componentes software

 Instalador de software packs para el microcontrolador en uso, que permite gestionar los
componentes software a utilizar como librerías CMSIS (Cortex Microcontroller Software Interface
Standard, librerías estandarizados para MCU basados en Cortex-M que permiten reutilizar o portar
código más fácilmente), ficheros de configuración e inicialización, plantillas de código de
ejemplo, middleware, documentación…

Por supuesto, existen muchos otros entornos de desarrollo completes como IAR Embedded Workbench,
Atollic True Studio o SW4STM32 - System Workbench. Los dos últimos son especialmente interesantes por
tratarse de IDE gratuitas basadas en eclipse/GCC y directamente soportadas por STM.
Electrónica Digital y Microprocesadores Apuntes ARM Cortex-M4

3.11. Depuración de código


Es posible realizar una ejecución virtual de un programa sin contar físicamente con el dispositivo porque
Keil cuenta con un simulador de la arquitectura Cortex-M4. Esto se utiliza para realizar una depuración
(debug) del programa y anticipar problemas de diseño sin necesidad de adquirir el dispositivo. La mayor
limitación de este enfoque es que no es posible simular el comportamiento de los periféricos, y que el
comportamiento del dispositivo está idealizado. El simulador se activa a través del menú de µVision:
Project > Options for Target. Dentro de la ventana que aparecen, seleccione la pestaña Debug. Pulse Use
Simulator en el menu de la izqda., como indica la figura:

A partir de ahí la depuración puede realizarse paso a paso como con la tarjeta física utilizandoel botón
siguiente, Ctrl+F5 o el menú Debug > Start/Stop Debug Session

El entorno uVision adopta la configuración de la figura siguiente en el modo de depuración. Los registros
R0 a R15 aparecen a la izquierda, junto con el registro de estado xPSR, que debe desplegarse pinchando
en (+).

Controles de depuración

Código desensamblado con sus ubicaciones definitivas en memoria

Registros
Listado de código en ejecución

Visualizador de memoria, variables,


Avisos del sistema y línea de comandos
excepciones
Electrónica Digital y Microprocesadores Apuntes ARM Cortex-M4

Definición de privilegios de acceso a memoria en el modo Debug

Ciertos accesos a memoria pueden no estar adecuadamente inicializados y la simulación podría generar
errores como el de la figura:

Para reconfigurar privilegios adecuados de acceso a memoria, una vez iniciado el modo Debug, se accede
a Debug > Memory Map… Se configura el rango de memoria deseado, los privilegios adecuados
(lectura/escritura/código ejecutable) y se añade la zona clicando en Map Range.

Esta definición sólo es válida durante la sesión de Debug iniciada, por lo que si se quieren guardar las
zonas de memoria definidas debe usarse un fichero .ini. Se trata de un fichero de texto simple que
contiene una línea por cada zona de memoria a definir. Por ejemplo, podemos crear con el Bloc de
Notas el fichero RAM.ini que contenga esta única línea:
MAP 0x40000000, 0x5FFFFFFF READ WRITE

Este fichero se carga en la ventana Project > Options for Target, dentro del tab Debug, clicando en el
botón ‘...’ para cargar un fichero Initialization File.
Electrónica Digital y Microprocesadores Apuntes ARM Cortex-M4

4. Bibliografía

Tema Referencia
Manual de aprendizaje de la
 Yiu, The Definitive Guide to ARM Cortex-M3 andCortex-M4
arquitectura y leng uaje
Processors
ensamblador ARM Cortex -M4

 Prog ra m m ing Ma nu al - S T M3 2F 4 S eri es Cortex ® - M 4


Arquitectura ARM Cortex -M4
 ARM® and Thumb®-2 Instruction Set - Quick Reference Card
(Instruction Set Architecture )
 Quick reference card for ARMv7 (Cortex-M4)

 Ref eren ce M an ual - ST M 32 F 40 7/ 4 17 , ad va nc ed Ar m® -


Microcontrolador STM32F407 ba se d 32 -b it MC U s
 STM32F407xx datasheet

Descripción de las librerías  U M1 72 5 Us er Ma nu al D es cr ip tio n of S T M3 2F 4 H AL an d LL


HAL y LL para el STM32F4 dri ver s

 Us er Ma nu al - Di s cove ry k it w it h ST M 32 F 40 7V G MC U
Tarjeta de desarrollo
 User Manual - Getting started with software and firmware
STM32 F4 Discovery
environments for the STM32F4DISCOVERY Kit

 Softw are AR M Ke il M DK
 Get ti ng st art ed w ith MD K Cre ate ap pl ic at ion s w i th
Entorno de desarrollo
µV is ion® for AR M® Cor tex ® - M mi cro controll ers
ARM Keil MDK
 MD K V5 .1 0 L a b fo r t he S T M3 2F 4 D is cov ery Boar d -
Tutor ial

Herramienta de configuración  Softw are S TM 3 2Cu be MX


e inicialización de código  User manual - STM32CubeMX for STM32 configuration and
STM32CubeMX initialization C code generation

Você também pode gostar