Actualizado el 21 de Marzo del 2018 (Publicado el 2 de Febrero del 2018)
1.199 visualizaciones desde el 2 de Febrero del 2018
4,3 MB
196 paginas
Creado hace 8a (04/08/2015)
ANTONIO JOSÉ VILLENA GODOY
RAFAEL ASENJO PLAZA
FRANCISCO J. CORBERA PEÑA
PRÁCTICAS DE ENSAMBLADOR
BASADAS EN
RASPBERRY PI
Departamento de Arquitectura de Computadores
UNIVERSIDAD DE MÁLAGA / MANUALES
ii
Aviso
Este material ha sido preparado por:
Antonio José Villena Godoy
Rafael Asenjo Plaza
Francisco J. Corbera Peña
Dept. de Arquitectura de Computadores. Universidad de Málaga.
c Esta obra está bajo una Licencia Creative Commons Atribución-NoComercial-
SinDerivar 4.0 Internacional.
b Debe dar crédito en la obra en la forma especificada por el autor o
licenciante.
e El licenciante permite copiar, distribuir y comunicar publicamente la
obra. A cambio, esta obra no puede ser utilizada con fines comerciales – a
menos que se obtenga el permiso expreso del licenciante.
d El licenciante permite copiar, distribuir, transmitir y comunicar públi-
camente solamente copias inalteradas de la obra – no obras derivadas basadas
en ella.
Si desea enviar sugerencias, comentarios o propuestas de mejora sobre el con-
tenido de este material, envie un correo electrónico a la dirección asenjo@uma.
es.
iv
Acrónimos
AAPCS
ARM
CPSR
CPU
CHI
CLO
CS
E/S
ETSII
FIQ
GNU
GCC
GDB
GPAFEN
GPAREN
GPEDS
GPFEN
GPHEN
GPIO
ARM Architecture Procedure Call Standard
Advanced RISC Machines
Current Program Status Register
Central Processing Unit
system timer Counter HIgher
system timer Counter LOwer
system timer Control/Status
Entrada/Salida
Escuela Técnica Superior de Ingeniería Informática
Fast Interrupt reQuest
GNU is Not Unix
GNU C Compiler
GNU DeBugger
GPIO Pin Async. Falling Edge Detect
GPIO Pin Async. Rising Edge Detect
GPIO Pin Event Detect Status
GPIO Pin Falling Edge Detect Enable
GPIO Pin High Detect Enable
General-Purpose Input/Output
GPL
GPLEN
GPLEV
GPPUD
General Public License
GPIO Pin Low Detect Enable
GPIO Pin LEVel
GPIO Pin High Detect Enable
GPPUDCLK
GPREN
GPIO Pin High Detect Enable CLocK
GPIO Pin Rising Edge Detect Enable
GPU
IRQ
LED
LR
PFC
PC
RAM
RISC
ROM
RTI
SoC
SP
SPSR
UMA
VFP
abt
mon
svc
und
Graphics Processing Unit
Interrupt ReQuest
Light Emitting Diode
Link Register
Proyecto Fin de Carrera
Personal Computer
Random-Access Memory
Reduced Instruction Set Computer
Read-Only Memory
Rutina de Tratamiento de Interrupción
System on a Chip
Stack Pointer
Saved Program Status Register
Universidad de MÁlaga
Vector Floating-Point
ABorT mode
secure MONitor mode
Supervisor mode (antiguamente SuperVisor Calls)
UNDefined mode
Índice
Prólogo
xv
1 Introducción al ensamblador
1.1 Lectura previa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.1.1 Características generales de la arquitectura ARM . . . . . . .
1.1.2 El lenguaje ensamblador . . . . . . . . . . . . . . . . . . . . .
1.1.3 El entorno . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.1.4 Configuración del entorno para realizar las prácticas en casa .
1.1.5 Aspecto de un programa en ensamblador . . . . . . . . . . . .
1.1.6 Ensamblar y linkar un programa
1
2
2
5
6
7
9
. . . . . . . . . . . . . . . . 14
1.2 Enunciados de la práctica . . . . . . . . . . . . . . . . . . . . . . . . 15
1.2.1 Cómo empezar
. . . . . . . . . . . . . . . . . . . . . . . . . . 15
1.2.2 Enteros y naturales . . . . . . . . . . . . . . . . . . . . . . . . 20
1.2.3
. . . . . . . . . . . . . . . . . . . . . . . 23
1.2.4 Rotaciones y desplazamientos . . . . . . . . . . . . . . . . . . 25
1.2.5
Instrucciones de multiplicación . . . . . . . . . . . . . . . . . 28
Instrucciones lógicas
2 Tipos de datos y sentencias de alto nivel
31
2.1 Lectura previa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
2.1.1 Modos de direccionamiento del ARM . . . . . . . . . . . . . . 31
2.1.2 Tipos de datos
. . . . . . . . . . . . . . . . . . . . . . . . . . 36
Instrucciones de salto . . . . . . . . . . . . . . . . . . . . . . . 38
2.1.3
2.1.4 Estructuras de control de alto nivel
. . . . . . . . . . . . . . . 42
2.1.5 Compilación a ensamblador
. . . . . . . . . . . . . . . . . . . 43
2.1.6 Ejercicios propuestos. . . . . . . . . . . . . . . . . . . . . . . . 46
2.2 Enunciados de la práctica . . . . . . . . . . . . . . . . . . . . . . . . 48
Suma de elementos de un vector . . . . . . . . . . . . . . . . . 48
2.2.1
3 Subrutinas y paso de parámetros
55
3.1 Lectura previa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
3.1.1 La pila y las instrucciones ldm y stm . . . . . . . . . . . . . . 56
vii
3.1.2 Convención AAPCS . . . . . . . . . . . . . . . . . . . . . . . 58
3.2 Ejemplos de aplicación . . . . . . . . . . . . . . . . . . . . . . . . . . 60
3.2.1 Funciones en ensamblador llamadas desde C . . . . . . . . . . 60
3.2.2 Funciones en ensamblador llamadas desde ensamblador . . . . 62
3.2.3 Funciones recursivas
. . . . . . . . . . . . . . . . . . . . . . . 64
3.2.4 Funciones con muchos parámetros de entrada . . . . . . . . . 70
3.2.5 Pasos detallados de llamadas a funciones . . . . . . . . . . . . 75
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
3.3.1 Mínimo de un vector . . . . . . . . . . . . . . . . . . . . . . . 76
3.3.2 Media aritmética, macros y conteo de ciclos
. . . . . . . . . . 78
3.3.3 Algoritmo de ordenación . . . . . . . . . . . . . . . . . . . . . 80
3.3 Ejercicios
4 E/S a bajo nivel
4.3 Ejemplos de programas Bare Metal
83
4.1 Lectura previa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
4.1.1 Librerías y Kernel, las dos capas que queremos saltarnos
. . . 84
4.1.2 Ejecutar código en Bare Metal . . . . . . . . . . . . . . . . . . 86
4.2 Acceso a periféricos . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88
4.2.1 GPIO (General-Purpose Input/Output)
. . . . . . . . . . . . 89
4.2.2 Temporizador del sistema . . . . . . . . . . . . . . . . . . . . 95
. . . . . . . . . . . . . . . . . . . 96
4.3.1 LED parpadeante con bucle de retardo . . . . . . . . . . . . . 96
4.3.2 LED parpadeante con temporizador . . . . . . . . . . . . . . . 99
Sonido con temporizador . . . . . . . . . . . . . . . . . . . . . 99
4.3.3
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101
4.4.1 Cadencia variable con bucle de retardo . . . . . . . . . . . . . 101
4.4.2 Cadencia variable con temporizador . . . . . . . . . . . . . . . 101
4.4.3 Escala musical . . . . . . . . . . . . . . . . . . . . . . . . . . . 101
4.4 Ejercicios
5 Interrupciones hardware
103
5.1 Lectura previa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104
5.1.1 El sistema de interrupciones del ARM . . . . . . . . . . . . . 104
5.1.2 Rutina de tratamiento de interrupción . . . . . . . . . . . . . 109
5.1.3 Pasos para configurar las interrupciones
. . . . . . . . . . . . 110
5.1.4 El controlador de interrupciones . . . . . . . . . . . . . . . . . 112
5.1.5 Ejemplo. Encender LED rojo a los 4 segundos . . . . . . . . . 114
5.1.6 Ejemplos de aplicación . . . . . . . . . . . . . . . . . . . . . . 118
5.1.7 Parpadeo de todos los LEDs . . . . . . . . . . . . . . . . . . . 119
5.1.8 Control de LEDs rojos con pulsadores . . . . . . . . . . . . . . 123
5.1.9 Parpadeo secuencial de LEDs con sonido por altavoz
. . . . . 127
5.1.10 Manejo de FIQs y sonidos distintos para cada LED . . . . . . 133
5.1.11 Control de luces/sonido con pulsadores en lugar temporizadores138
viii
5.2 Ejercicios
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142
5.2.1 Todo con IRQs
. . . . . . . . . . . . . . . . . . . . . . . . . . 142
5.2.2 Alargar secuencia a 10 y parpadeo . . . . . . . . . . . . . . . . 142
5.2.3 Tope de secuencia y limitar sonido . . . . . . . . . . . . . . . 142
5.2.4 Reproductor de melodía sencilla . . . . . . . . . . . . . . . . . 143
A Funcionamiento de la macro ADDEXC
145
. . . . . . . . . . . . . . . . . . . . . . . . 145
A.1 Finalidad y tipos de salto
A.2 Elección: salto corto
. . . . . . . . . . . . . . . . . . . . . . . . . . . 146
A.3 Escribir una macro . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146
A.4 Codificación de la instrucción de salto . . . . . . . . . . . . . . . . . . 147
A.5 Resultado . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 148
B Funcionamiento de la placa auxiliar
149
B.1 Esquema . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150
B.2 Pinout . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150
B.3 Correspondencia
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151
B.4 Funcionamiento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152
B.5 Presupuesto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153
B.6 Diseño PCB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153
C Cable serie y bootloaders
155
C.1 Introducción . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155
C.2 Cable USB-serie desde el ordenador de desarrollo . . . . . . . . . . . 155
C.3 Cable serie-serie que comunica dos Raspberries . . . . . . . . . . . . . 157
C.4 Reseteo automático . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159
C.5 Código fuente del bootloader . . . . . . . . . . . . . . . . . . . . . . . 162
D Resistencias programables de pull-up y pull-down
169
D.1 Introducción . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 169
D.2 Pulsadores en la placa auxiliar . . . . . . . . . . . . . . . . . . . . . . 170
D.3 Ejemplo de aplicación . . . . . . . . . . . . . . . . . . . . . . . . . . . 170
D.3.1 Pulsador a masa sin cambiar configuración . . . . . . . . . . . 170
D.3.2 Pulsador a masa cambiando configuración . . . . . . . . . . . 172
D.3.3 Pulsador a Vcc sin cambiar configuración . . . . . . . . . . . . 175
Bibliografía
178
ix
x
Índice de figuras
1.1 Registros de la arquitectura ARM . . . . . . . . . . . . . . . . . . . .
1.2 Ubicación de datos en memoria . . . . . . . . . . . . . . . . . . . . .
1.3 Entorno típico de programación . . . . . . . . . . . .
Comentarios de: Prácticas de ensamblador basadas en Raspberry Pi (0)
No hay comentarios