Bienvenido: Ingresar

This local extension action "SlideShow" requires moin 1.8.

Quitar mensaje
location: WebHome / TrabajosPracticos / EjemploC

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:

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

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 proyecto

Es común en sistemas embebidos, realizar la compilación y enlace del proyecto en una arquitectura diferente a la cual el proyecto de ejecutará, por ejemplo es habitual realizar el proyecto en una PC (arquitectura x86) para luego correrlo en un microcontrolador ARM, esto se denomina cross compiler o complicación cruzada.

En nuestro caso utilizaremos una Raspberry para los prácticos, la cual posee un SO Linux y todas las herramientas para realizar una aplicación directamente en la arquitectura ARM, de todas maneras y para aquellos prácticos en donde no se posee Raspberry o no se justifica su uso por ser muy simples, explicamos ambos métodos para realizar un proyecto.

Proyecto usando compilación cruzada

   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 

Las diferentes opciones utilizadas son:

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 

Proyecto sobre Raspberry

   1 gcc -Wall -g -c main.c -o main.o
   2 as -g suma.s -o suma.o
   3 gcc -g main.o suma.o -o suma.elf
   4 

Depurado con gdb

En este caso el software correra en forma nativa sobre la arquitectura (ARM de la raspberry) utilizamos entonces el gdb sin ningún simulador.

gdb --tui

se debe ejecutar

gdb --tui

luego dentro de este programa se escribe.

file ex1.elf
load 

Construcción utilizando '''make'''

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