-
Notifications
You must be signed in to change notification settings - Fork 22
L1: Practica 1
- Tiempo: 2h
-
Objetivos de la sesión:
- Toma de contacto con el simulador RARS, para el procesador RISC-V
- Ejecutar y depurar los programas "hola mundo"
- Instrucción de suma: addi
Haz click en la imagen para ver el vídeo en Youtube
Haz click en la imagen para ver el vídeo en Youtube
- Introducción
- Actividades guiadas
- Recopilación de instrucciones hasta el momento
- Actividades NO guiadas
- Autores
- Licencia
- Enlaces
En esta asignatura vamos a programar los procesadores RISC-V en lenguaje ensamblador, para entender su funcionamiento y su arquitectura. En las prácticas del laboratorio utilizaremos un simulador que ejecutaremos en el PC. Sin embargo, no hay que perder de vista que estamos programando un procesador, a bajo nivel
Esta es la pinta que tiene un RISC-V, sintetizado en una FPGA Libre. Está ejecutando un programa que realiza una cuenta de 8 bits, que se muestra por los LEDs. La placa usada es la Alhambra II
Los detalles de la implementación del RISC-V en la FPGA no son de esta asignatura, pero si tienes curiosidad e interés, puedes encontrar más información en este repositorio: RISC-V-FPGA (Proyecto en construcción). También en esta sesión de la asignatura de Mecatrónica del Grado de Robótica Software: Procesadores en FPGA: RISC-V
Estas actividades se realizan en vivo. Sigue las indicaciones del profesor. Muchas de las cosas que se mostrarán en vivo también están documentadas aquí, para que las puedas repasar posteriormente o realizar por tu cuenta
- Todo lo que realiza el profesor lo puedes ver en el proyector en cualquier momento
- Sin embargo es más cómodo verlo directamente en tu monitor
- Profesor: Ejecuta el siguiente comando en el terminal:
share-screen
Para visualizar el escritorio del profesor ejecutar la aplicación visor de escritorio
- Pincha en el menú superior: Actividades
- En la caja de búsqueda escribe "Visor": En la izquierda verás el icono: Pínchalo
- Aparece el visor de escritorio en blanco:
Para conectarte haz lo siguiente:
- Pincha en Conectar (en la parte superior)
- Selecciona el protocolo VNC (si no lo estaba ya)
- Pincha en Buscar: Aparecerán todos los equipos a los que te podrás conectar. Busca uno en el que ponga Escritorio remoto de Obijuan
- Pincha en Aceptar
- y por último en Conectar, en la parte inferior derecha
En este GIF animado se resume todo el proceso
¡Ya ves la pantalla del profesor en tu escritorio! Mi recomendación es que dejes la ventana del profesor a tu derecha, a tamaño real y que uses la parte izquierda para trabajar. El escritorio del profesor es de baja resolución, por estar conectado al proyector. De esta forma verás claramente todos los detalles, y no te perderás nada :-)
El tener la ventana de profesor en tu escritorio también te permite tomar pantallazos en cualquier momento (tecla fn + Impr-Pant), o incluso grabar vídeos. ¡Tú decides! :-)
¡Listos para empezar nuestro viaje!
En esta asignatura trabajaremos con el procesador RISC-V, aprendiendo a programarlo en ensamblador para comprender su arquitectura interna
Los programas los ejecutaremos en el simulador RARS, que es libre y multiplataforma
En los laboratorios ya está todo listo para ejecutar el simulador. Pincha en la parte superior en Actividades, teclea rars y pincha en el icono
Nos aparecerá una pantalla como la siguiente
¡Listos para empezar a trabajar!
También lo podemos arrancar desde el terminal de Linux. Sólo hay que escribir el comando rars:
Las últimas versiones del RARs las puedes descargar desde esta página de github. Los vídeos y pantallazos de este curso se hicieron con la versión 1.1. Sin embargo ya van por la versión 1.5, que es la que instalaremos y utilizaremos nosotros
El RARs está programado en Java, y se ejecuta en la máquina virtual de java, por lo que el archivo ejecutable es el mismo para todas las plataformas: linux, Mac o Windows.
Los pasos para la instalación son:
- Descargar el rars: rars1_5.jar
- Instalar JAVA. Aunque es muy probable que en tu ordenador ya lo tengas instalado
- Arrancar RARs
- Instala Java 11. Desde un terminal ejecuta:
sudo apt install default-jdk
- Dar permisos de ejecución al fichero rars.jar que hemos descargado antes y haz doble click. Aparecerá la ventana principal del simulador
- Otra posibilidad es ejecutarlo desde la terminal, mediante este comando:
java -jar rars.jar
Puedes instalar JAVA desde este enlace. Descarga el instalador pinchando en el botón rojo. Se bajará el fichero JavaSetup8u221.exe.
- Haz doble click para ejecutarlo: es el instalador de JAVA.
- Pincha en Instalar. Comienza la instalación
- Al cabo de unos segundos se completará. Pinchamos en Cerrar
- Localiza el archivo descargado con el RARs
- Haz doble click para ejecutarlo
¡Ya lo tienes operativo y listo para funcionar!
Arrancamos el simulador. Todavía NO lo sabemos manejar, ni sabemos nada del procesador RISC-V, pero vamos a ejecutar nuestro primer programa para comprobar que todo está funcionando, y familiarizarnos un poco con el entorno
- Paso 1: Descargar el fichero en ensamblador con el programa hola mundo: hola_mundo.asm (Pulsar el botón derecho y la opción "Save Link as...")
El programa es este:
#-- Programa hola mundo en RISC-V
#-- Esto son comentarios
.data
str: .asciz "Hola mundo en RISC-V!\n"
.text
main:
la a0, str
li a7, 4
ecall
li a7, 10
ecall
- Paso 2: Abrir el fichero desde el entorno
Usando la opción File/Open abrimos el fichero hola_mundo.asm
- Paso 3: Ensamblamos el programa
Esta acción analiza el programa en ensamblador y genera el código máquina. Esto ya lo veremos, pero el código máquina es el verdadero programa que entiende el procesador, y que se almacena en memoria
Para ensamblar pinchamos en la herramienta Assemble. Si todo ha ido bien, y el programa no tiene errores de sintaxis, se nos cambia automáticamente a la pestaña Execute donde podemos ver el contenido de la memoria (aunque por ahora no entendamos nada)
Podemos volver a la pestaña donde estaba nuestro programa original pinchando en Edit. En la consola en la parte inferior nos aparece un mensaje indicando que el ensamblado se ha realizado correctamente:
Assemble: operation completed successfully.
- Paso 4: Ejecutar el programa
Para ejecutar el programa pinchamos en el botón de Run en la parte superior. En la parte inferior nos aparecen dos mensajes, uno que lo ha generado nuestro programa, y otro del simulador indicando que el programa se ha terminado de ejecutar
Sí, efectivamente, este programa Hola mundo saca por pantalla la cadena:
Hola mundo en RISC-V!
¡Hemos ejecutado nuestro primer programa en el procesador RISC-V!
- Paso 5: Volver a ejecutar el programa
Normalmente, para probar nuestros programas tendremos que ejecutarlos varias veces. Para volver a ejecutarlo borramos la consola inferior (opcional) pulsando el botón Clear. A continuación pinchamos en el botón RESET memory and registers, en la parte superior, y volvemos a ejecutar el programa como en el paso anterior
Todavía no conoces las instrucciones del RISC-V, ni entiendes apenas nada del código del "Hola mundo"... pero... ¿Serías capaz de modificar el programa para que saque por pantalla otra cadena diferente?
Una ventaja de usar el simulador es que podemos ejecutar las instrucciones paso a paso y entender todo lo que está ocurriendo. Para ejecutar paso a paso hacemos lo siguiente:
- Desde el editor (pestaña Edit) pinchamos en el botón de ensamblar (igual que antes)
Se resalta en amarillo la primera instrucción. Será la primera que se ejecute
- Pinchamos en el botón "Run one step at a time", justo a la derecha del botón de ejecutar que ya conocemos. Se ejecuta la instrucción actual y se resalta en amarillo la siguiente. También vemos en la derecha un resaltado en verde: nos indica el registro que se ha modificado
- Seguimos pulsando el botón anterior hasta que el programa termina
Todavía sabemos muy poco del RISC-V. No sabemos programar ni entendemos las instrucciones... Ejecuta de nuevo el programa hola mundo, paso a paso, y trata de responder las siguientes preguntas:
- ¿Qué instrucción es la que hace que aparezca el mensaje de texto en la consola?
- ¿Qué instrucción es la que hace que el programa termine?
- ¿Sabes cuál es el código máquina de esta instrucción?
- ¿Cuantos bits tiene esta instrucción?
- ¿Cuántas instrucciones se ejecuten hasta que el programa termina?
- ¿Cuál crees que es la dirección donde está situada la primera instrucción?
El RISC-V que usamos en las prácticas es de 32-bits. En su interior tiene 32 registros de propósito general, de 32-bits. Se numeran desde el 0 al 31 y de forma genérica se denotan por la letra x. Así, el registro x5 es el registro número 5
Los registros se encuentran en la parte derecha del simulador. Podemos ver su número y su valor
El registro x0 es especial. Siempre vale 0 y NO le podemos asignar otro valor. Lo utilizamos para inicializar otros registros a 0, o cuando no queremos alterar otros registros al hacer operaciones de suma
Además, hay un registro especial llamado PC, que se encuentra abajo del todo. Este registro se denomina contador de programa (program counter) y contiene la dirección de la siguiente instrucción a ejecutar
Arrancamos la ejecución del "hola mundo", paso a paso. Antes de ejecutar ninguna instrucción, el PC tiene la dirección de la primera instrucción
Ejecutamos la instrucción (damos un paso). Ahora el PC tiene la dirección de la siguiente instrucción a ejecutar:
Repetimos el proceso hasta llegar a la última instrucción:
Por defecto, los registros los vemos en hexadecimal. Pero lo puedes cambiar a decimal desde el menú, en la opción Settings/Values displayed in hexadecimal
Vamos a estudiar nuestra primera instrucción del RISC-V: addi. Sirve para asignar a un registro la suma de otro registro con una constante. La sintaxis de la instrucción es:
El valor a sumar puede ser positivo o negativo
Estos son algunos ejemplos de utilización:
- Asignar al registro x3 el valor del registro x2 + 50
addi x3, x2, 50
- Asignar al registro x4 el valor de x3 - 5
addi x4, x3, -5
- Incrementar el registro x5. Se usa el propio registro x5 como origen y destino
addi x5, x5, 1
- Decrementar el registro x5 en dos unidades
addi x5, x5, -2
- Assignar el valor 30 al registro x6. Usamos el registro 0 para hacer x6 = x0 + 30 = 30 (porque x0 siempre vale 0)
addi x6, x0, 30
Vamos a escribir nuestro primero programa desde 0. Será muy sencillo. Simplemente asignaremos el valor 30 al registro x3 y terminaremos. El programa se muestra a continuación, pero en vez de hacer copy & paste, vamos a escribirlo directamente en el simulador
Se han incluido explicaciones adicionales para entenderlo mejor
#-- Nuestro primer programa escrito desde cero
#-- Esto que sale en verde son COMENTARIOS
#-- y siempre es lo primero que tenemos que hacer
#-- ¡Somos ingenieros! ¡Hay que documentar!
#-- Programa para asignar el valor 30 al registro x3,
#-- y terminar
#-- Esto NO es una instruccion. Lo veremos mas
#-- adelante. Es una Directiva. Se usa para
#-- indicar al ensamblador que lo que va a
#-- continuacion es codigo
.text
#-- Mi primera instruccion
addi x3, x0, 30 #-- x3 = 0 + 30 = 30
#-- Terminar. Estas instrucciones no saben
#-- que significan. Lo veremos mas adelante
#-- Las usamos para terminar el programa y
#-- devolver el control al sistema operativo
li a7, 10
ecall
Para comenzar a escribir un programa pinchamos en el icono superior izquierdo: "Create a new file for editing"
Se crea una pestaña nueva con el nombre riscv1.asm, que es el nombre que le da el simulador por defecto a los nuevos programas
¡Ya podemos empezar a escribir nuestro primer programa!
Una vez terminado pinchamos en el icono de grabar. Si no lo tenemos grabado no podremos ejecutarlo
Ahora lo ejecutamos paso a paso y comprobamos que efectivamente al ejecutar la instrucción addi el registro x3 cambia su valor a 30 (0x1e en hexadecimal)
El siguiente programa implementa un contador de 32 bits en el registro x5. Bájalo de este enlace: contador.asm o escríbelo directamente en el simulador
#-- Programa contador
#-- El registro x5 se incrementa indefinidamente
.text
#-- Inicializar el registro x5 a 0
addi x5, x0, 0
bucle:
#-- Incrementar el registro x5 en una unidad
addi x5, x5, 1 #-- x5 = x5 + 1
#-- Repetir indefinidamente
b bucle
Este programa no termina nunca. La última instrucción hace que se vuelva a repetir el bucle indefinidamente. Esta instrucción la veremos más adelante
- Ejecuta el programa paso a paso
- Observa cómo el registro 5 se incrementa cada vez
Configuramos el simulador para ver los registros en decimal
Si ejecutamos el programa, sin paso a paso, no veremos nada en el registro, porque el programa se ejecuta muy rápido y el simulador no lo refresca. Pero podemos bajar la velocidad de ejecución y entonces sí veremos cómo cuenta
Para terminar pinchamos en el icono de STOP. Esto para la simulación
- Instrucciones básicas: Son las que se transforman a código máquina y que ejecuta el procesador
Estas actividades están pensadas para que las hagas por tu cuenta, sin guía del profesor. Queremos que pienses. Habrá muchas cosas que no sepas, o que no entiendas: investiga, lee, prueba, practica
Recuerda: El objetivo es que aprendas. No tienes que entregar nada
Escribe un programa para RISC-V que asigne los siguientes valores a los registros indicados: x3=3, x4=4, x5=5, x6=6, x7=7 y x8=8. Ejecútalo paso a paso y comprueba que funciona correctamente
Modifica el programa del contador de las actividades guiadas para que se incremente el registro x5 de dos en dos. Ejecútalo paso a paso para comprobar que funciona bien. ¿Cuál es la dirección de la primera instrucción?
Escribe un programa para el RISC-V para que el registro x3 tome los valores 0,1,2,3,4,5..., el x4 0,3,6,9,12,15... y el x5 0,5,10,15,20,25.... indefinidamente. Ejecútalo paso a paso para comprobarlo
Escribe un programa que ejecute las siguientes acciones:
- Inicializar el registro 6 a 0
- Restarle 1
- Terminar ¿Cuál es el valor hexadecimal del registro 6 al terminar el programa?
Ejecuta este código paso a paso. ¿Qué es lo que hace?
.text
addi x3, x0, 10
a:
addi x3,x3,-1
bgt x3,x0, a
li a7, 10
ecall
Ejecuta este código paso a paso. ¿Qué es lo que hace?
.text
addi x5, x0, 5
addi x6, x0, 6
addi x7, x0, 0
a:
beq x5,x0,fin
add x7, x7, x6
addi x5, x5, -1
b a
fin:
li a7, 10
ecall
El siguiente código NO se ensambla correctamente porque tiene errores. Introdúcelo en el simulador y soluciona los programas para que ensamble correctamente y se pueda ejecutar paso a paso. ¿Qué hace?
.text
addi x17, x0, 10
addi x12, x0, 8
addii x7, x0, 0
a:
beq x17,x0,fin ;-- Comprueba terminacion
add x7, xx7, x12
addi x17, x17, -1
;-- repetir
b hola
fin:
li a7, 10
ecall
- Título informal de la clase: "Comienza la aventura..."
- Nos interesa que tenga una visión física, y de bajo nivel, del computador: La cpu es un chip (que se puede tocar). La memoria también. La E/S en los sistemas empotrados es rudimentaria (ejemplo del contador binario en los LEDs)
- Para aprender usaremos un simulador, que nos permite "parar el tiempo" y ejecutar instrucciones paso a paso
- En los sistemas (empotrados) reales el procesador ejecuta millones de instrucciones por segundo. Depurar es un infierno...
- Katia Leal Algara
- Juan González-Gómez (Obijuan)
L1: Práctica 1-1. RARs
L2: Práctica 1-2. Ensamblador
L3: Práctica 1-3. Variables
L4: Pract 2-1. E/S mapeada
L5: Práctica 2-2: Inst. ecall
L6: Prác 2-3: Cadenas
L7: Práct 3-1: Bucles y saltos
L8: Práct 3-2: Cadenas II
L9: Pract 4-1: Subrut. Nivel-1
L10: Pract 4-2: La pila
L11: Pract 4-3: Recursividad
L12: Pract 5-1. Heap. Listas
Simulacro examen 1
GISAM. Ordinario. 2019-Dic-11
GISAM. Extra. 2020-Jul-03
GISAM. Ordinario. 2021-Ene-21
GISAM. Ordinario. 2022-Ene-10
GISAM. Extra. 2022-Jun-29
GISAM. Parcial 1. 2022-Oct-26
GISAM. Parcial 2. 2022-Nov-30
GISAM. Parcial 3. 2022-Dic-21
GISAM. Parcial 1. 2023-Oct-09
GISAM. Parcial 2. 2023-Nov-11
GISAM. Parcial 3. 2023-Dic-20
GISAM. Extra. 2024-Jun-17
GISAM. Parcial 1. 2024-Oct-14
GISAM. Parcial 2. 2024-Nov-13
GISAM. Parcial 3. 2024-Dic-16
TELECO. Ordinario. 2019-Dic-13
TELECO. Extra. 2020-Jul-07
TELECO. Ordinario. 2021-Ene-21
TELECO. Extra. 2021-Jul-02
TELECO. Ordinario. 2022-Ene-10
TELECO. Extra. 2022-Jun-29
TELECO. Ordinario. 2023-Ene-10
TELECO. Extra. 2023-Jun-29
TELECO. Parcial 1. 2023-Oct-20
TELECO. Parcial 2. 2023-Nov-17
TELECO. Parcial 3. 2023-Dic-22
TELECO. Extra. 2024-Jun-17
TELECO. Parcial 1. 2024-Oct-10
TELECO. Parcial 2. 2024-Nov-21
TELECO. Parcial 3. 2024-Dic-19
Robótica. Ordinario. 2020-Jun-1
Robótica. Extra. 2020-Jul-13
Robótica. Ordinario. 2021-Mayo-20
Robótica. Extra. 2021-Junio-16
Robótica. Parcial 1. 2022-Feb-25
Robótica. Parcial 2. 2022-Abril-1
Robótica. Parcial 3. 2022-Mayo-6
Robótica. Parcial 1. 2023-Feb-27
Robótica. Parcial 2. 2023-Mar-27
Robótica. Parcial 3. 2023-May-08
Robótica. Parcial 1. 2024-Feb-26
Robótica. Parcial 2. 2024-Mar-20
Robótica. Parcial 3. 2024-May-06
Robótica. Extra. 2024-Junio-24
Datos. Parcial 1. 2023-Oct-09
Datos. Parcial 2. 2023-Nov-15
Datos. Parcial 3. 2023-Dic-20
Datos. Parcial 1. 2024-Oct-09
Datos. Parcial 2. 2024-Nov-13
Práctica 1: Sesiones 1,2 y 3
Práctica 2: Sesiones 4, 5 y 6
Práctica 3: Sesiones 7 y 8
Práctica 4: Sesiones 9, 10 y 11
Práctica 5: Sesión 12