Está en la página 1de 32

Sistemas Embebidos

EYAG1046
Federico Domínguez, PhD.
Unidad 3 – Sesión 1: C y herramientas GNU
Agenda
Programación en Sistemas Embebidos
Introducción a C
Pasar valores por referencia con punteros
Representación de datos
Herramientas GNU
GNU GCC
Linking

SISTEMAS EMBEBIDOS – EYAG1046 2


Programación en sistemas
embebidos
• Python, Java, Javascript
Alto nivel
Software rápido y eficiente
de • public class Empleado {

Fácil de aprender y desarrollar


abstracción

• C, C++
Alto nivel • int a = 5; a++;

Abstracción
• Ensamblador
Bajo nivel • MOV %EAX1, %EAX2

• Lenguaje de máquina
Máquina • 10100011100111

SISTEMAS EMBEBIDOS – EYAG1046 3


Historia de C
C fue desarrollado por Dennis Ritchie en Bell Labs entre 1969 y 1973 con el propósito de
reescribir UNIX.
C es un lenguaje compilado de alto nivel (o bajo nivel?).
C es un lenguaje imperativo (operaciones secuenciales que cambian el estado del sistema) y
fuertemente tipado (el tipo de datos de una variable es definido en el lenguaje).
C ha sido estandarizado con el tiempo:
◦ ANSI C: Estándar por la American National Standards Institute (ANSI)
◦ C89, primer estándar definido por la ANSI en 1989
◦ C99, estándar ISO definido en 1999 y adoptado por la ANSI
◦ C11, estándar definido en 2011. ISO y ANSI
◦ C17, el último estándar definido en 2017. ISO y ANSI

SISTEMAS EMBEBIDOS – EYAG1046 4


5
#include <stdio.h>

#define SIZE 20

void hacerAlgo(char *);


Directiva para el
int main()
preprocesador del {
compilador: Reemplaza en el char str[SIZE];
código la palabra SIZE con el printf("Ingrese su nombre: "); Antes de poder usar una
número 20. scanf("%s", str);
función, es necesario declarar
hacerAlgo(str); su prototipo.
}

void hacerAlgo(char *str) La función hacerAlgo es


{ llamada aquí.
for(int i=0; i<SIZE; i++)
{
char c = str[i];
La función hacerAlgo es
if(c == 0) implementada aquí.
break;

printf("%c ",c);
}
}

SISTEMAS EMBEBIDOS – EYAG1046 6


Otras características de C
Parámetros son pasados por valor…

SISTEMAS EMBEBIDOS – EYAG1046 7


Otras características de C
Indexación de arreglos siempre empieza desde cero…

Arreglo de caracteres siempre terminan con el carácter null (\0)

SISTEMAS EMBEBIDOS – EYAG1046 8


Un tipo de datos compuesto es creado a
partir de la combinación de tipos de datos
nativos…
En C, un tipo de datos compuesto puede ser creado Tipos de datos nativos:
usando struct. ◦ char
◦ int
struct : lista de variables agregadas en un bloque de
memoria contiguo bajo un mismo nombre. ◦ float
◦ double

Ejemplo: Modificadores de datos nativos:


◦ long
struct Punto{ ◦ short
int x; ◦ signed
int y; ◦ unsigned

int z; Ejemplos:
◦ unsigned char
}; ◦ long int

SISTEMAS EMBEBIDOS – EYAG1046 9


Pasar por referencia vs. pasar
por valor
Por valor son copias de los valores originales y por referencia cuando no se quiere modificar el valor original

SISTEMAS EMBEBIDOS – EYAG1046 10


En C, para pasar variables por
referencia usamos punteros.
Un puntero es un tipo de datos que referencia una locación en memoria.
En C, se usa el asterisco ‘*’ para indicar que un tipo de datos es puntero o también para
obtener el valor de un puntero.
Además, se usa el ‘&’ para obtener la referencia (es decir el puntero) de una variable.
int *a; a y b son punteros
int *b; *a (valor)
int c = 5;

a = &c; a representa la dirección 5


b = a;
c = 10; *a representa el valor 0x100A

/* En este punto a, b apuntan al mismo sitio de memoria */


a (dirección memoria)
printf("a = %d \t b = %d \t c = %d\n", *a, *b, c); Si es direccion de memoria es %p, para decimal %d

SISTEMAS EMBEBIDOS – EYAG1046 11


Representación de datos en
arquitectura x86-64
Declaración en C Tipo de datos en Intel64 Tamaño bytes (bits)
char Byte 1 (8 bits)
short Word 2 (16 bits)
int Double Word 4 (32 bits)
long Quad Word 8 (64 bits)
char * Quad Word 8 (64 bits)
float Single precision 4 (32 bits)
double Double precision 8 (64 bits)

SISTEMAS EMBEBIDOS – EYAG1046 12


Representación de datos en un sistema
embebido de 16-bits (Ej: TI MSP430)

SISTEMAS EMBEBIDOS – EYAG1046 13


Herramientas GNU
El Proyecto GNU (GNU Not Unix) nació en
1983, liderado por Richard Stallman con el
objetivo de crear un Sistema operativo libre
similar a UNIX.
En 1992, las herramientas creadas en el
proyecto GNU fueron usadas junto con el
kernel de LINUX creado por Linus Torvalds
para crear GNU/LINUX.

SISTEMAS EMBEBIDOS – EYAG1046 14


Herramientas GNU

SISTEMAS EMBEBIDOS – EYAG1046 15


GNU Compiler Collection (GCC)
Distribuciones de Linux y FreeBSD, código abierto
gcc: GNU C Compiler (nombre antiguo de GCC)
g++: GNU C++ Compiler

El comando gcc es en realidad un compiler driver, un programa que se encarga de ejecutar toda
la cadena de programas que forman GNU Compiler Collection.

gcc –o hello hello.c

SISTEMAS EMBEBIDOS – EYAG1046 16


Linking es el proceso de recolectar y
combinar varios archivos de código en un
archivo único ejecutable.
Linking permite la compilación de programas usando varios archivos. Indispensable en
proyectos medianos y grandes.
Comprender el proceso de linking es importante cuando se esta construyendo programas de
complejidad alta.
El alcance de las variables está relacionado al proceso de linking.
◦ La diferencia entre variables globales y locales.
◦ La palabra clave static en C esta relacionada al proceso de linking. No es lo mismo que static en
Java.

SISTEMAS EMBEBIDOS – EYAG1046 17


Linking se encarga de identificar los
símbolos que deben de ser resueltos.

Símbolo resuelto por el linker

Símbolo resuelto por el linker

SISTEMAS EMBEBIDOS – EYAG1046 18


El proceso de linking une la compilación
de main.c y swap.c en un solo programa
ejecutable.
gcc –o prog main.c swap.c

Preprocessor C Compiler Assembler


cpp cc1 as
main.c
main.i main.s

1010
1101
0010

Translators main.o
Linker 1010
1101
1010 ld 0010
1101 prog
0010
swap.o

Preprocessor C Compiler Assembler


cpp cc1 as
swap.c
swap.i swap.s

SISTEMAS EMBEBIDOS – EYAG1046 19


GNU GDB
“GNU Debugger”
Un depurador o “debugger” para varios lenguajes, entre ellos C y C++.
Permite la inspección del programa para saber que es lo que esta haciendo y como cambian las
variables en tiempo de ejecución.
Errores como “Segmetation Fault” son más fáciles de depurar usando gdb.

SISTEMAS EMBEBIDOS – EYAG1046 20


Para poder usar gdb, es necesario
compilar con la opción -g
Ejemplo:
Usualmente se compilaría main.c de la siguiente forma:
◦ gcc –o ejecutable main.c

Para poderlo depurar con gdb:


◦ gcc –g –o ejecutable main.c

La opción –g agrega símbolos adicionales al archivo ejecutable los cuáles permiten a gdb
conectar el ejecutable con el código fuente.

Finalmente, para depurar:


◦ gdb ejecutable

SISTEMAS EMBEBIDOS – EYAG1046 21


gdb contiene una consola interactiva
similar a la consola de Linux.
El shell o consola de gdb tiene conveniencias como navegación de historial con flechas y
completar con tab.
Dentro de la consola de gdb, se puede invocar ayuda para cualquier comando:
(gdb) help [comando]

Para ejecutar el programa a depurar:


(gdb) run

SISTEMAS EMBEBIDOS – EYAG1046 22


Ejecución en la consola de gdb
Si el programa no tiene ningún problema, ejecuta normalmente dentro de gdb.
Si el programa contiene errores en tiempo de ejecución, gdb muestra información un poco más
detallada sobre el error.

SISTEMAS EMBEBIDOS – EYAG1046 23


Usualmente, es útil detener el
programa durante la ejecución e
inspeccionar el estado del mismo.
Una forma de detener un programa en ejecución es definiendo breakpoints con el comando
break:
◦ (gdb) break file1.c:6 (Breakpoint en la línea 6 del archivo file1.c)

El programa se detendrá en la línea 6 y permitirá el uso de otros comandos.


Se pueden definir tantos breakpoints como se deseen.
También se pueden definir breakpoints en funciones. Por ejemplo, si se tiene:
◦ int my_func(int a, char *b);

Entonces el comando:
◦ (gdb) break my_func

Detiene la ejecución al entrar a my_func.

SISTEMAS EMBEBIDOS – EYAG1046 24


Una vez detenida la ejecución, se
puede inspeccionar el estado del
programa.
Para continuar la ejecución y parar en el siguiente breakpoint:
◦ (gdb) continue

Para continuar la ejecución paso por paso:


◦ (gdb) step (Entre a las subrutinas o funciones)
◦ (gdb) next (No entre a las funciones, las trata como una instrucción más)

Es común usar estos comando muchas veces seguidas, gdb permite ejecutar el comando
anterior presionando solamente ENTER.
Para inspeccionar el estado del programa es necesario ver los valores de las variables:
◦ (gdb) print my_var (muestra el valor actual de la variable my_var)
◦ (gdb) print/x my_var (muestra el valor actual de la variable my_var en hexadecimal)

SISTEMAS EMBEBIDOS – EYAG1046 25


GNU Make es la herramienta de gestión de
compilación de facto en Linux.
GNU Make nació por la necesidad, de programadores en el proyecto GNU, de actualizar
rápidamente todos los binarios ejecutables una vez que se modificaba el código fuente.
Make esta diseñado para actualizar un archivo automáticamente siempre y cuando otros en los
que depende sean modificados.
Make utiliza archivos de configuración llamados Makefiles para guiar la compilación de un
proyecto.
Make es parte de una cadena de herramientas conocida como el GNU Build System (Autotools).
◦ Autoconf es también parte de Autotools y es capaz de generar archivos Makefile.
◦ El objetivo de Autotools es gestionar la portabilidad de código fuente entre plataformas.

SISTEMAS EMBEBIDOS – EYAG1046 26


La compilación de estos tres archivos
puede ser automatizada con make.
hellomake.c hellofunc.c hellomake.h
#include "hellomake.h" #include <stdio.h> /*
#include "hellomake.h" Ejemplo archivo cabecera
int main() { */
void myPrintHelloMake(void) {
myPrintHelloMake(); void myPrintHelloMake(void);
printf("Hola makefiles!\n");
return(0);
} return;
}

gcc -o hellomake hellomake.c hellofunc.c

SISTEMAS EMBEBIDOS – EYAG1046 27


Al ejecutar make, el programa busca un
archivo con el nombre Makefile en el
directorio local.
Archivo Makefile:
◦ Contiene una lista de reglas

Ejemplo:

hellomake: hellomake.c hellofunc.c


gcc -o hellomake hellomake.c hellofunc.c

SISTEMAS EMBEBIDOS – EYAG1046 28


Al ejecutar make, el programa busca un
archivo con el nombre Makefile en el
directorio local.
Archivo Makefile:
◦ Contiene una lista de reglas

Ejemplo: Target Dependencias (o componentes)

hellomake: hellomake.c hellofunc.c Regla


gcc -o hellomake hellomake.c hellofunc.c

Comando

SISTEMAS EMBEBIDOS – EYAG1046 29


Una regla especifica un archivo (target) que
debe ser creado usando un comando o comandos
(command) y una dependencia o dependencias
(component).

Ejemplo: OUTPUT INPUT

hellomake: hellomake.c hellofunc.c Regla


gcc -o hellomake hellomake.c hellofunc.c

PROCESS INPUT -> OUTPUT

SISTEMAS EMBEBIDOS – EYAG1046 30


Demostración

SISTEMAS EMBEBIDOS – EYAG1046 31


Referencias uso de make
Documentación oficial: https://www.gnu.org/software/make/
Tutorial básico: http://www.cs.colby.edu/maxwell/courses/tutorials/maketutor/

SISTEMAS EMBEBIDOS – EYAG1046 32

También podría gustarte