Está en la página 1de 6

UPMDIE

INDUSTRIALES

TA1 Desarrollo en C y/o


ensamblador en AVR
Sobre tipos de datos en sistemas empotrados
Mezclando C y ensamblador
jorge.portilla@upm.es
yago.torroja@upm.es

Optimizando el desarrollo en C
Ejemplos
Yago Torroja & Jorge Portilla

Universidad Politcnica de Madrid


Tipos de datos en sistemas empotrados
Una de las mayores fuentes de errores provienen de un tratamiento
inadecuado de los tipos de datos
Al contrario que java, en C no se hacen suposiciones ni comprobaciones
especiales sobre el uso de los datos y la coherencia de los mismos
Los tipos int son dependientes de cada mquina
Ej: int en AVR son 16 bits, int en PC son 32 bits
Para no liarse es comn usar algunos tipos estndar de C (incluir <stdint.h>):
Enteros sin signo: uint8_t, uint16_t, uint32_t, uint64_t
Enteros con signo: int8_t, int16_t, int32_t, int64_t
El ms rpido: uint_fast8_t, uint_fast16_t, uint_fast32_t, uint_fast64_t

En comparaciones hay que tener cuidado con los lmites o signos de los
tipos de datos
Ej: for(unsigned char i = 0; i < 256; i++) { }
Ej: for(char i = 0; i < 200; i++) { }

UPMDIE
INDUSTRIALES Sistemas Microprocesadores 2
Mezclando C y ensamblador
La forma de hacerlo depende mucho de la herramienta
GCC: permite inlining de ensamblador (no lo vemos)
AVR Studio: Permite mezclar ficheros *.c (C) y .s (ensamblador)

Aspectos a tener en cuenta:


Visibilidad: Cmo hacer que las funciones en C vean a las rutinas en ensamblador y
viceversa y compartir variables globales
Cmo se pasan parmetros desde C a ensamblador
Cmo se pasan parmetros desde ensamblador a C

Veremos estas cuestiones para AVR Studio con GCC


(Documento: Atmel AT1886: Mixing Assembly and C with AVRGCC)
Cuestiones generales:

Es recomendable que los ficheros en ensamblador lleven la extensin *.S


Alguno de los ficheros debe declarar una funcin main (normalmente un *.c)
La solucin es para C; para C++ hay que declarar las funciones como si fuesen C

UPMDIE
INDUSTRIALES Sistemas Microprocesadores 3
Mezclando C y ensamblador: Visibilidad
Para hacer las funciones de C visibles en los ficheros en ensamblador
Declarar la etiquetas en ensamblador como globales:
Declarar las variables y funciones en C como externas
Declarar la etiquetas en ensamblador como globales:
Ej:

// Fichero .s // Fichero .c
.extern c_multiply_function ...

.extern c_int_var int c_multiply_function(uint8_t a, uint8_t b) {


return a * b;
}
.global asm_inc_c_int_var
// No parameters: global variable int c_int_var;
asm_inc_c_int_var:
call c_multiply_function void asm_inc_c_int_var();
lds r19, c_int_var
lds r18, c_int_var + 1 int asm_inc_passed_by_value_var(int);
inc r19
adc r18, 0
ret ...

.global asm_inc_passed_by_value_var
// Parameters passed by value (int)
asm_inc_passed_by_value_var:
inc r25
adc r24, 0
ret

UPMDIE
INDUSTRIALES Sistemas Microprocesadores 4
Mezclando C y ensamblador: Pase de parmetros
GCC utiliza un criterio estricto sobre el uso de los registros y paso de
parmetros
Uso de registros y diferencias entre el programa llamante y el llamado

Uso de registros para pasar parmetros

Siempre por pares de registros (los char se pasan en un par!)


Los parmetros que no caben se pasan por la pila

UPMDIE
INDUSTRIALES Sistemas Microprocesadores 5
Optimizando desarrollo en C
Uso intensivo (pero racional) del preprocesador de C
Facilita el retargetting del cdigo
Facilita cambios futuros
Mejora la legibilidad

Estructurar adecuadamente el cdigo

Uso de bibliotecas estndar (libgcc para AVR):


http://www.nongnu.org/avr-libc/

UPMDIE
INDUSTRIALES Sistemas Microprocesadores 6

También podría gustarte