Bienvenido: Ingresar
location: Diferencias para "WebHome/TrabajosPracticos/EjemploC"
Diferencias entre las revisiones 2 y 3
Versión 2 con fecha 2019-09-06 14:25:42
Tamaño: 3441
Comentario:
Versión 3 con fecha 2019-09-06 14:40:51
Tamaño: 4447
Comentario:
Los textos eliminados se marcan así. Los textos añadidos se marcan así.
Línea 66: Línea 66:
A COMPLETAR Al terminar de compilar un proyecto, y ante la imposibilidad de poder correrlo en una PC por ser de otra arquitectura, debemos recurrir a un simulador, en este caso usamos el provisto por las GNU binutils, el cual simula solamente el núcleo del ARM, permitiendo ver como se modifican los registros y la memoria del micro por cada instrucción de la aplicación probada.

==== gdb --tui ====

Para realizar un debug con esta herramienta no es necesario instalar nada.

Se debe ejecutar
{{{
arm-elf-eabi-gdb --tui
}}}
luego dentro de este programa se escribe.
{{{
target sim
file ex1.elf
load
}}}
Aparecerá en una ventana el fuente a depurar, escribiendo.
{{{ break nn}}}
Se realiza un break point (nn es el número de linea que te aparece al costado izquierdo del archivo fuente).

Un tutorial de la herramienta se puede ver en

 http://sourceware.org/gdb/onlinedocs/gdb/TUI.html

para recordar los comandos mas usados

[[WebHome/TrabajosPracticos/PracticoASM4/Debug|Comandos Debug]]

Ejemplo de proyecto en lenguale C y ensamblador

Se muestra un ejemplo de proyecto que incluye archivos fuentes en lenguaje C y en ensamblador.
El proyecto consiste en:

  • Una función suma escrita en ensamblador que recibe como parámetros 2 enteros, los suma y retorna su resultado.

  • Una función principal main() escrita en C, que utiliza la función suma para sumar dos enteros inicializados con una constante.

Para poder realizar el llamado de una función escrita en ensamblador desde C, se debe realizar lo siguiente:

  • En el archivo en C se debe declarar la función suma como externa, esto define el prototipo de la función (recibe dos enteros y devuelve un entero) y al declararlo como externo, el compilador no devuelve error al no encontrar la implementación de la función.

  • El archivo ensamblador no tiene cambios importantes, si es necesario respetar las reglas de pase de parámetros (R0..R3) para parámetros, y devolver en R0, además de salvar los registros preservados.

Código en lenguaje C

   1 #include <stdio.h>
   2 
   3 extern int suma(int a, int b);
   4 
   5 int main(void)
   6 {
   7   int a = 71;
   8   int b = 29;
   9   int c;
  10 
  11   c = suma(a,b);
  12 
  13   return c;
  14 } 

Código en lenguaje ensamblador

   1 .text
   2 .arm
   3 .global suma
   4 
   5 suma:
   6   add   r2, r0, r1
   7   mov   r0, r2                    
   8   mov   pc, lr  

Construcción del proyector

   1 arm-none-eabi-gcc -Wall -mcpu=arm7tdmi -g -c main.c -o main.o
   2 arm-none-eabi-as -mcpu=arm7tdmi -g suma.s -o suma.o
   3 arm-none-eabi-gcc -Ttext=0 -nostartfiles -g main.o suma.o -o suma.elf
   4 
  • La primer línea compila el código fuente del archivo main.c y genera el archivo objeto main.o

  • La segunda línea ensambla el archivo fuente suma.s y genera el archivo suma.o

  • La última línea enlaza los dos archivos objetos (main.o y suma.o) y genera el archivo suma.elf

Las diferentes opciones utilizadas son:

  • -c para detener la construcción luego de la etapa de compilación y tiene como salida el archivo objeto (.o).

  • -o para indicar el nombre del archivo de salida.

  • -Wall para habilitar todos las advertencias (warnings) del compilador.

  • -mcpu=arm7tdmi para indicar la arquitectura del procesador.

  • -g para incluir información de depuración en los archivos de salida.

Simulación en PC con gdb

Al terminar de compilar un proyecto, y ante la imposibilidad de poder correrlo en una PC por ser de otra arquitectura, debemos recurrir a un simulador, en este caso usamos el provisto por las GNU binutils, el cual simula solamente el núcleo del ARM, permitiendo ver como se modifican los registros y la memoria del micro por cada instrucción de la aplicación probada.

gdb --tui

Para realizar un debug con esta herramienta no es necesario instalar nada.

Se debe ejecutar

arm-elf-eabi-gdb --tui

luego dentro de este programa se escribe.

target sim
file ex1.elf
load 

Aparecerá en una ventana el fuente a depurar, escribiendo.  break nn Se realiza un break point (nn es el número de linea que te aparece al costado izquierdo del archivo fuente).

Un tutorial de la herramienta se puede ver en

para recordar los comandos mas usados

Comandos Debug

Construcción utilizando `make`

Archivo Makefile para la compilación cruzada

   1 CC = arm-none-eabi-gcc
   2 AS = arm-none-eabi-as
   3 LD = arm-none-eabi-ld
   4 
   5 OBJECTS = main.o suma.o
   6 
   7 CFLAGS = -Wall -mcpu=arm7tdmi -g  -c
   8 ASFLAGS = -mcpu=arm7tdmi -g 
   9 LDFLAGS = -Ttext=0 -nostartfiles -g 
  10 
  11 suma.elf: $(OBJECTS)
  12         $(CC) $(LDFLAGS) $(OBJECTS) -o suma.elf
  13 
  14 suma.o: suma.s 
  15         $(AS) $(ASFLAGS) suma.s -o suma.o
  16 
  17 main.o: main.c
  18         $(CC) $(CFLAGS) main.c
  19 
  20 clean:
  21         rm *.o *.elf 

Archivo Makefile para la compilación sobre la RPi

   1 CC = gcc
   2 AS = as
   3 LD = ld
   4 
   5 OBJECTS = main.o suma.o
   6 
   7 CFLAGS = -Wall -g  -c
   8 ASFLAGS = -g 
   9 LDFLAGS = -g 
  10 
  11 suma.elf: $(OBJECTS)
  12         $(CC) $(LDFLAGS) $(OBJECTS) -o suma.elf
  13 
  14 suma.o: suma.s 
  15         $(AS) $(ASFLAGS) suma.s -o suma.o
  16 
  17 main.o: main.c
  18         $(CC) $(CFLAGS) main.c
  19 
  20 clean:
  21         rm *.o *.elf 

UntitledWiki: WebHome/TrabajosPracticos/EjemploC (última edición 2019-09-11 00:17:47 efectuada por GuillermoSteiner)