Sei sulla pagina 1di 36

Sistemas Embebido 2010 - C para Embebidos ARM

07/09/2010

Sistemas Embebidos
C para Embebidos ARM
http://laboratorios.fi.uba.ar/lse/
seminario-embebidos@googlegroups.com

66.48 & 66.66 Seminario de Electrnica: Sistemas Embebidos


Curso de Posgrado: Introduccin a los Sistemas Embebidos
Ingeniera en Electrnica FI UBA
Buenos Aires, 15 de Septiembre de 2011

Ing. Juan Manuel Cruz

Sistemas Embebido 2010 - C para Embebidos ARM

07/09/2010

Temario

Construcciones y Formas del Lenguaje


g j C
para Embebidos
Consideraciones p
para codificar en C sobre
procesadores ARM
Mapa de memoria
Consideraciones adicionales y conclusiones

15 de Septiembre de 2011

Ing. Juan Manuel Cruz

Ing. Juan Manuel Cruz

Sistemas Embebido 2010 - C para Embebidos ARM

07/09/2010

Construcciones y Formas del


Lenguaje C para Embebidos

Las Variables en Embebidos

Residen en un ambiente muy diferente al de una


PC
Pueden residir en memoria de lectura solamente
y/o en posiciones de memoria fija
Pueden cambiar de valor debido a eventos del
hardware ((asincrnicos al flujo
j del programa)
p g
)
Escribir en ellas pueden ser ilegal y causar
excepciones de sistema
P d cambiar
Pueden
bi de
d valor
l all ser ledas
l d

15 de Septiembre de 2011

Ing. Juan Manuel Cruz

Ing. Juan Manuel Cruz

Sistemas Embebido 2010 - C para Embebidos ARM

07/09/2010

Las Variables en Embebidos

El lenguaje C posee elementos para sealar stas


caractersticas al compilador, permitindole hacer
hiptesis correctas sobre el acceso a las mismas y la
correcta generacin de secuencias de cdigo
Se recurre a palabras claves especiales que califican
el tipo de la variable (se definen claramente las
clases
l
del
d l almacenamiento
l
i t en ell contexto
t t del
d l
embebido ms que en el contexto general de la
informtica)

15 de Septiembre de 2011

Ing. Juan Manuel Cruz

Ing. Juan Manuel Cruz

Sistemas Embebido 2010 - C para Embebidos ARM

07/09/2010

Las Variables en Embebidos

Algunas palabras claves:

Calificador de tipo const

Calificador de tipo volatile

Representar perifricos mediante structs

15 de Septiembre de 2011

Ing. Juan Manuel Cruz

Ing. Juan Manuel Cruz

Sistemas Embebido 2010 - C para Embebidos ARM

07/09/2010

Calificador de tipo const

Un calificador del tipo restringe la manera en que se


puede usar un identificador
La palabra clave de calificador de tipo se interpone
sintcticamente entre la clase del almacenamiento y
el identificador

static const int id;


Declara id como un identificador del tipo entero, con clase
de almacenamiento esttica (inicializado una vez retiene su
valor al reentrar al bloque y su alcance se restringe al resto
del archivo fuente) calificada del tipo constante

15 de Septiembre de 2011

Ing. Juan Manuel Cruz

Ing. Juan Manuel Cruz

Sistemas Embebido 2010 - C para Embebidos ARM

07/09/2010

Calificador de tipo const

Declaracin de variable en ROM y de puntero en


RAM que apunta a ROM

static const int id = 4;


const int *ptr
p = &id;;

Declaracin de variable en RAM y de puntero en


ROM que apunta a RAM

int id;
int * const ptr = &id;

15 de Septiembre de 2011

Ing. Juan Manuel Cruz

Ing. Juan Manuel Cruz

Sistemas Embebido 2010 - C para Embebidos ARM

07/09/2010

Calificador de tipo const

Declaracin de variable en ROM y de puntero en


ROM que apunta a ROM

const int id = 4;
const int * const p
ptr = &id;;

Declaracin de puntero en ROM que apunta a


posicin de memoria fija

int *const ptr = (int *)0x40000000;

15 de Septiembre de 2011

Ing. Juan Manuel Cruz

Ing. Juan Manuel Cruz

Sistemas Embebido 2010 - C para Embebidos ARM

07/09/2010

Calificador de tipo volatile

El calificador de tipo voltil indica que la variable puede


cambiar independiente del flujo del programa (tpicamente por
eventos en el hardware del perifrico del microcontrolador)

volatile int id;

Al calificar una variable como voltil el compilador no


optimizar las referencias a la misma asegurndonos que
mantendr su valor inalterable desde la ltima asignacin
(optimizacin que el compilador intentar hacer a variables de
otro tipo)

15 de Septiembre de 2011

Ing. Juan Manuel Cruz

Ing. Juan Manuel Cruz

Sistemas Embebido 2010 - C para Embebidos ARM

07/09/2010

Calificador de tipo volatile

Es necesario declarar como voltil los registros de perifricos


de I/O cuando su contenido depende de eventos de hardware
Declaracin de puntero a registro de perifrico (posiciones de
memoria fijas)

volatile unsigned int *const ptr = (unsigned int *) 0xE0000000;

Note que la variable puede calificarse simultneamente como


volatile y const, indicando un registro cuyo cambios de valor
se deben a eventos del hardware y qu no debe asignarse
(registro del resultado de un conversor A/D)

15 de Septiembre de 2011

Ing. Juan Manuel Cruz

Ing. Juan Manuel Cruz

10

10

Sistemas Embebido 2010 - C para Embebidos ARM

07/09/2010

Representar perifricos
mediante structs

Los registros entrada salida de propsito general de


un puerto de 32 bits de un microcontrolador NXP
ARM son:

15 de Septiembre de 2011

Ing. Juan Manuel Cruz

Ing. Juan Manuel Cruz

11

11

Sistemas Embebido 2010 - C para Embebidos ARM

07/09/2010

Representar perifricos
mediante structs

Se requieren funciones separadas de Set y Clear Bit pues los


pines de I/O y los valores de los registros de perifricos pueden
por eventos de hardware y slo debern escribirse los
cambiar p
bits que es necesario modificar. Esto puede hacerse teniendo la
capacidad de manipular bit. El puerto de I/O permite escribir un
valor del 32-bits de ser requerido
La declaracin de estructura correspondiente es:
typedef struct
{ volatile unsigned int IOPIN;
volatile unsigned int IOSET;
volatile unsigned int IODIR;
volatile unsigned int IOCLR;
} GPIO;

15 de Septiembre de 2011

Ing. Juan Manuel Cruz

Ing. Juan Manuel Cruz

12

12

Sistemas Embebido 2010 - C para Embebidos ARM

07/09/2010

Representar perifricos
mediante structs

GPIO es un tipo de estructura que se usa para declarar puertos.


Por ejemplo, el micro tiene 4 puertos declarados como:

GPIO Port0,, Port1,, Port2,, Port3

Los punteros a Port0 pueden declararse como:

GPIO *const ptr_Port0 = (GPIO *) 0xE0028000; /* address of Port 0 */

ptr_Port0
ptr
Port0 es un puntero constante a una variable del tipo GPIO (estructura
que contiene 4 variables que representan puertos de I/O), apunta a la direccin
baja de la estructura (del puerto de I/O mapeado en memoria), la conversin a
puntero tipo GPIO es necesario para mantener la consistencia
Podemos
d
usar ell puntero para acceder
d all port0 de
d GPIO
O como:

ptr_Port0 -> IOSET = 0xD0D0FEED


Las otras variables pueden leerse o escribirse de manera similar

La estructura GPIO completa tambin puede declararse voltil:

typedef struct {...} Volatile GPIO

15 de Septiembre de 2011

Ing. Juan Manuel Cruz

Ing. Juan Manuel Cruz

13

13

Sistemas Embebido 2010 - C para Embebidos ARM

07/09/2010

Consideraciones para codificar


en C sobre procesadores ARM

Existen muchas consideraciones bsicas de programacin para


procesadores ARM, la documentacin del compilador usado
p
gran
g
detalle sobre diversos aspectos
p
importantes
p
y
aporta
sutiles a considerar y debe leerse detenidamente (aspectos del
trabajo con la arquitectura y con el compilador ARM)
La consideraciones de codificacin
son muy importantes cuando
se procura optimizar el rendimiento y ocupar cantidades
limitadas de memoria embebida. El costo de desbordar una
config acin de memoria
configuracin
memo ia dada ssuele
ele ser
se alto (saltar
(salta al chip
ms prximo y de no existir forzara el rediseo del sistema)
Es til analizar el lenguaje assembly generado por el compilador
para aprender sobre la eficiencia y lo que hace el compilador

15 de Septiembre de 2011

Ing. Juan Manuel Cruz

Ing. Juan Manuel Cruz

14

14

Sistemas Embebido 2010 - C para Embebidos ARM

07/09/2010

Consideraciones para la depuracin

La eficiencia de depuracin y de cdigo a veces chocan. El


compilador da opciones cdigo vs info. de depuracin (aprox.
p p
)
al 15%,, uno debe ver sus efectos y usar la ms apropiada)
De haber efectos secundarios el cdigo que se ejecuta en modo
depuracin no podr ejecutarse en otros modos; es mejor estar
en modo de depuracin para que el cdigo que se ejecuta en el
sistema sea lo ms parecido al cdigo que se verific
Al optimizar
p
pueden
p
surgir
g diferencias al cdigo
g usado en la
depuracin con efectos secundarios imprevistos. Si el modo de
depuracin ofrece recursos (Semi-Hosting) no disponibles en su
sistema; se deber quitar/reemplazar esas llamadas por cdigo
propio (la ejecucin condicional de ARM est deshabilitada para
todas las opciones de depuracin)

15 de Septiembre de 2011

Ing. Juan Manuel Cruz

Ing. Juan Manuel Cruz

15

15

Sistemas Embebido 2010 - C para Embebidos ARM

07/09/2010

Consideraciones de Lazos

Los programas embebidos siguen la regla 90/10: el 90% del


tiempo se ejecuta el 10% del cdigo (Hennessy & Patterson).
y p
parte del tiempo
p ejecutando
j
Lazos (usualmente
(
Pasan la mayor
saltos hacia atrs), por lo que es importante comprender y
optimizar comportamiento de lazos
Una simple optimizacin es escribir for de conteo regresivo que
terminen en cero, en lugar de contar hasta un valor mx.

for (i = 1; i < n; i++), el compilador genera una instr. de comparacin


entre i y n y luego una de salto por menor que cerrando el lazo
for (i=n; i != 0; i--), el compilador puede setear el flag de cero al hacer
el decremento (SUBS) y luego BNE finaliza el lazo; se ahorra tiempo,
tamao de cdigo y se libera un registro pues la variable n es un valor de
inicializacin para el puntero del lazo en lugar de tener que mantenerse en
un registro a fin de compararla con la variable i en cada iteracin del lazo

15 de Septiembre de 2011

Ing. Juan Manuel Cruz

Ing. Juan Manuel Cruz

16

16

Sistemas Embebido 2010 - C para Embebidos ARM

07/09/2010

Asignacin de Registros y
Alias de Punteros

En ARM las variables pueden alocarse en registros en lugar de


memoria (con gran ahorro en rendimiento y tamao de cdigo)
Por la consistencia de valor de la variable, el compilador debe
asegurarse que el valor de la variable en memoria no cambia
por una referencia de puntero en otros puntos del programa
(pointer aliasing),
aliasing) por lo tanto una variable alocada en un
registro debe:

a)) Ser una variable local o un p


parmetro de funcin
b) No tienen su direccin tomada (& var_name) o asignada a otra variable

Al crear un puntero a una variable el compilador no est seguro


si el valor de la misma no es cambiado desde fuera del mdulo,
mdulo
por lo tanto debe ubicar la variable en memoria (no en registro)

15 de Septiembre de 2011

Ing. Juan Manuel Cruz

Ing. Juan Manuel Cruz

17

17

Sistemas Embebido 2010 - C para Embebidos ARM

07/09/2010

Asignacin de Registros y
Alias de Punteros

Las variables globales no pueden alocarse en registros pues sus


valores no son privados a un mdulo determinado
Ejemplo de asignacin de alias de puntero:

int prog1 (int var1)


{ somefunction (&var1);
El p
paso de la direccin de var1 y la posterior
p
referencia a var1 en memoria
pues el compilador no puede garantizar que un valor de registro no se
cambiar. Sin embargo, mediante el uso de una variable intermedia local:
int prog2 (int var2)
{ int local1 = var2;
somefunction (&local1);
var2 = local1;
Toda referencia posterior a var2 se har por registro ya que su direccin
no fue tomada, el compilador puede alocarla en un registro y accederla con
instrucciones MOVs en lugar de usar instrucciones de Stack, Load o Store

15 de Septiembre de 2011

Ing. Juan Manuel Cruz

Ing. Juan Manuel Cruz

18

18

Sistemas Embebido 2010 - C para Embebidos ARM

07/09/2010

Tipos de Datos y
Alineacin Natural en ARM

Entre la arquitectura de un microcontrolador y los tipos de


variables en C all pueden existir alguna alineacin natural, por
j p , la capacidad
p
para
p
manipular
p
naturalmente los tipos
p
ejemplo,
byte o word (en una sola instruccin y eficientemente)
El cdigo ARM puede acceder a datos ms eficientemente si
corresponde a su tamao natural
natural, los lmites de la alineacin
para los tipos de variable C son:

15 de Septiembre de 2011

Ing. Juan Manuel Cruz

Ing. Juan Manuel Cruz

19

19

Sistemas Embebido 2010 - C para Embebidos ARM

07/09/2010

Tipos de Datos y
Alineacin Natural en ARM

Como ARM es una arquitectura de 32 bits, se espera que sea


ms eficiente en el manejo de su tipo de tamao "natural
La arquitectura es ms
eficiente usando enteros pues ARMv4 y
derivadas pueden cargar valores con y sin signo de 8 y 16 bits
(aunque todos los registros ARM y la ALU son de 32-bits)
El tratamiento de no enteros como char y short es:

a) Los valores sin signo se expanden con ceros


b) Los valores signados se expanden con signo

Por lo que toda variable char & short se deber convertir despus de cada
operacin para comprobar si ha sobrepasado su lmite, siendo mucho ms
eficiente
fi i t usar int
i t para variables
i bl locales
l
l y convertir
ti ell valor
l retornado
t
d de
d ser
necesario (el uso de ints reduce tamao de cdigo y aumenta el rendimiento)
15 de Septiembre de 2011

Ing. Juan Manuel Cruz

Ing. Juan Manuel Cruz

20

20

Sistemas Embebido 2010 - C para Embebidos ARM

07/09/2010

Tipos de Datos y
Alineacin Natural en ARM

Aqu hay un ejemplo de eficiencia utilizando el tipo int:

short somefunction (short i) { i = i + 1; return i; }


El cdigo
g generado
g
ser:
ADD
a1, a1, #1
MOV
a1, a1, LSL #16 /* put sign bit in MSB */
MOV
a1, a1, ASR #16 /* sign extend */
MOV
pc, lr
/* return */
int somefunction (int i) {i = i +1; return i;}
El cdigo generado es:
ADD
a1, a1, #1
MOV
pc, lr
/* return */

posible para
p
evitar las conversiones de shorts & chars.
Use enteros cuando sea p
Como cada regla tiene excepciones puede haber un balance entre el tamao del
cdigo y del espacio variables
15 de Septiembre de 2011

Ing. Juan Manuel Cruz

Ing. Juan Manuel Cruz

21

21

Sistemas Embebido 2010 - C para Embebidos ARM

07/09/2010

ARM Thumb Procedure Call


Standard (ATPCS)

El compilador de C para ARM usa un convenio estndar para el


paso de parmetros y el uso de registro llamado ATPCS
Comprender y aprovechar las ventajas de esta convencin

pueden conducir a programas ms eficientes. En particular, se


incluyen los registros utilizados por el compilador:

a) Registros r0 a r3 (a1 a a4) para pasar valores de parmetro a rutinas y


retornar valores. La rutina llamada no debe restaurarlos a su regreso
b) Registros r4 a r11 (v1 a v8) usados para variables locales (alocar
registros) La rutina llamada debe restaurar el estado de estos registros
registros).
antes de regresar (salvar en la pila & restaurar)
c) Hasta el registro 14 variables locales (r0 a r11, r12 y r14) de funciones
d) ms variables locales producirn el vuelco a memoria (caro reemplazo de
accesos de registro muy eficiente) debe evitarse mientras se sea posible

15 de Septiembre de 2011

Ing. Juan Manuel Cruz

Ing. Juan Manuel Cruz

22

22

Sistemas Embebido 2010 - C para Embebidos ARM

07/09/2010

ARM Thumb Procedure Call


Standard (ATPCS)

15 de Septiembre de 2011

Ing. Juan Manuel Cruz

Ing. Juan Manuel Cruz

23

23

Sistemas Embebido 2010 - C para Embebidos ARM

07/09/2010

ARM Thumb Procedure Call


Standard (ATPCS)

Las implicancias de usar ATPCS

Algunas reglas simples al escribir funciones para obtener cdigo ms


pequeo y ms rpido (procure reemplazar accesos a memoria externa por
registro internos). Las pautas simples para las funciones incluyen:
a) Pueden pasarse hasta 4 words como argumentos a funcin en registros
(r0 ..r3). Ms de 4 argumentos se pasarn por la pila va acceso a memoria
b) Las funciones con 4 o menos argumentos ahorran espacio del cdigo y
tiempo de ejecucin, limtese a funciones simples
c) Si hay ms de 4 argumentos, agrpelos en una estructura y pase un
puntero
t
a la
l estructura
t
t
( muy ineficiente
(es
i fi i t pasar una estructura)
t t )
d) Limite las variables locales a menos de 10 (para 4 argumentos)
e) Evite las funciones variadic con nmero variable de parmetros
f) Para retornar valores tambin se usan ro .. r3 (ms valores se retornan
en la pila)

15 de Septiembre de 2011

Ing. Juan Manuel Cruz

Ing. Juan Manuel Cruz

24

24

Sistemas Embebido 2010 - C para Embebidos ARM

07/09/2010

Alineamiento de estructuras
y Uso de Memoria

El orden en que se declaran las variables en una estructura afecta el nmero de


bytes de almacenamiento requerido y el medio de acceso (el tipo de
instrucciones generada)
El compilador alinea la direccin de inicio del primer miembro de una estructura
a la longitud de acceso ms grande (4 u 8 bytes) y luego alinea al resto a la
mxima alineacin requerida por su longitud (un campo de tipo char se alinea al
prximo byte disponible mientras un tipo del int se alinea al prximo word),
insertando bytes de relleno en los huecos de alineacin
Para dos declaraciones de una estructura de 2 chars, un short y un int:
struct {char c; short s; char d; int i;}
bytes: c x s s d x x x i i i i (12 bytes en total, 4 x: 4 bytes de relleno)
struct {char c; char d; short s; int i}
bytes: c d s s i i i i (8 bytes en total, 0 bytes de relleno pues los campos estn
d acuerdo
de
d con ell mtodo
d de
d alineacin
li
i del
d l compilador).
il d ) Puede
d ser provechoso
h
prestar atencin al arreglo de estructuras para ahorrar bytes

15 de Septiembre de 2011

Ing. Juan Manuel Cruz

Ing. Juan Manuel Cruz

25

25

Sistemas Embebido 2010 - C para Embebidos ARM

07/09/2010

_packed & Bit-Fields

Estructuras definidas con el calificador _packed alinean sus


miembros a 1byte (sin ningn relleno)

Typedef
yp
_p
packed struct { char c;; int i;; short s;; char d;}
;}

bytes: c i i i i s s d, comenzando a un lmite de 4 u 8 bytes. Ahorran espacio


pero a los accesos a las variables no alineadas el compilador debe agregar
desplazamientos y uniones para formar al int i en un registro (muy ineficiente
pues crea ms instrucciones y reduce el rendimiento).
rendimiento) Debe justificarse su uso

Con bit-fields ocurre algo similar (se compacta a costa de ms


cdigo y ms bajo rendimiento)
rendimiento). Puede usarse en estructuras
para crear campos de longitud definida por el usuario. Pueden
ser contiguos mientras no excedan el tamao bsico que los
contiene (el tamao de un contenedor entero es 32 bits)

15 de Septiembre de 2011

Ing. Juan Manuel Cruz

Ing. Juan Manuel Cruz

26

26

Sistemas Embebido 2010 - C para Embebidos ARM

07/09/2010

_packed & Bit-Fields

Por ejemplo:

struct bitter { int a:10; int b:20; int c:30;}


bits of Word 1: aaaaa.aaaaa.bbbbb.bbbbb.bbbbb.bbbbb.xx
bits of Word 2: ccccc.ccccc.ccccc.ccccc.ccccc.ccccc.xx
Los bits x son de relleno. Como los bit-fields residen en memoria su acceso
es mediante punteros, de acceso ineficiente y naturaleza no alineada (es
ms efectivo el enmascaramiento lgico de variables enteras)

La regla bsica es que valores enteros se alinean naturalmente


q
ARM de 32-bits y el p
pensamiento debe
con la arquitectura
entrar en usar variables no-alineadas ms cortas para asegurar
que cualquier ganancia no se torne en un mayor procesamiento
y en accesos ineficientes

15 de Septiembre de 2011

Ing. Juan Manuel Cruz

Ing. Juan Manuel Cruz

27

27

Sistemas Embebido 2010 - C para Embebidos ARM

07/09/2010

Mapa de memoria

El mapa de memoria representa la direccin de arranque y la


longitud de las diversas zonas de memoria que corresponde a:

a)) Read
R d Only
O l Memory
M
(ROM fl
(ROM,
flash):
h) para cdigo
di

b) RAM: para datos (heap, stack) o cdigo

c) Perifricos: registros de perifricos mapeados en memoria (su


contenido se modifica por eventos de hardware y pueden haber requisitos
especiales de acceso)
d)) Vectores de Interrupcin:
p
posiciones de memorias fijas
p
j para
p
los
manejadores de interrupciones y excepciones
Estas reas pueden ser re-mapeadas luego del booteo (para re-programar
la memoria Flash)

15 de Septiembre de 2011

Ing. Juan Manuel Cruz

Ing. Juan Manuel Cruz

28

28

Sistemas Embebido 2010 - C para Embebidos ARM

07/09/2010

Mapa de memoria

El mapa de memoria representa la direccin de arranque y la


longitud de las diversas zonas de memoria que corresponde a:

a)) Read
R d Only
O l Memory
M
(ROM fl
(ROM,
flash):
h) para cdigo
di

b) RAM: para datos (heap, stack) o cdigo

c) Perifricos: registros de perifricos mapeados en memoria (su


contenido se modifica por eventos de hardware y pueden haber requisitos
especiales de acceso)
d)) Vectores de Interrupcin:
p
posiciones de memorias fijas
p
j para
p
los
manejadores de interrupciones y excepciones
Estas reas pueden ser re-mapeadas luego del booteo (para re-programar
la memoria Flash)

15 de Septiembre de 2011

Ing. Juan Manuel Cruz

Ing. Juan Manuel Cruz

29

29

Sistemas Embebido 2010 - C para Embebidos ARM

07/09/2010

Mapa de memoria

Algunas observaciones sobre el mapa de memoria del micro


Philips LPC2294:

a)) Bloque
Bl
de
d Booteo
B t de
d 8K ubicado
bi d en 2GB,
2GB maneja
j los
l eventos
t de
d resett
del sistema e incluye un programa monitor de depuracin en tiempo real (al
tope de memoria interna para que no cambie de derivado en derivado)
b) Los vectores de la Interrupcin son re-mapeados
re mapeados luego del booteo para
ser invocado una vez verificado que el cdigo del usuario existe y es vlido
(checksum); sino el boot loader intenta cargar un programa en flash
c) La distribucin de memoria se presenta al linker va un archivo especial
llamado scatter load (permite poner en memoria zonas complejas y ser
invocado por el compilador mediante directivas de assembler)
El diseo de mapa
p de memoria se mantiene entre derivados permitiendo
p
el
re-uso de software. La ubicacin de las rutinas de servicio de interrupcin y
las convenciones de la interrupcin se mantienen tanto como sea posible

15 de Septiembre de 2011

Ing. Juan Manuel Cruz

Ing. Juan Manuel Cruz

30

30

Sistemas Embebido 2010 - C para Embebidos ARM

07/09/2010

Mapa de memoria

15 de Septiembre de 2011

Ing. Juan Manuel Cruz

Ing. Juan Manuel Cruz

31

31

Sistemas Embebido 2010 - C para Embebidos ARM

07/09/2010

Distribucin de carga

Distribuir la imagen del ejecutable en zonas adecuadas de


memoria para aprovechar un mapa de memoria complejo,
g de variables/mdulos
/
y relacionar
controlar el orden de la carga
las propiedades de variables a zonas de memoria especficas
Las zonas de memoria poseen propiedades especficas incluyen:

a)) Slo-Lectura
Sl L t
(RO)
(RO): Cdigo
Cdi y datos
d t que slo
l sern
ledos,
l d
no modificados
difi d
b) Lectura-Escritura (RW); Cdigo y datos que pueden leerse y reescribirse
c) Cero-Inicializado (ZI): Datos inicializados en Cero

Pueden convivir varias zonas con atributos diferentes. Puede


copiarse cdigo y datos de ROM a RAM en tiempo de ejecucin.
Los datos pueden ser inicializados en cero (variables statics),
etc.
t D
Deben
b setearse
t
di
direcciones
i
de
d Stack
St k y heap
h
y re-mapear
Vectores antes de la ejecucin

15 de Septiembre de 2011

Ing. Juan Manuel Cruz

Ing. Juan Manuel Cruz

32

32

Sistemas Embebido 2010 - C para Embebidos ARM

07/09/2010

Distribucin de carga

Para hacer todos el anterior se cera un archivo de distribucin


de carga y es pasado al Linker:

El archivo
hi contiene
ti
nombres
b
de
d las
l zonas, atributos,
t ib t
direcciones
di
i
de
d
comienzo y opcionalmente longitudes
Dentro de cada zona, pueden disponerse que reas o secciones de
programas vengan primero (o ltimo)
Pueden alocarse secciones en direcciones fijas para poder encontrar ciertos
tipos de informacin a una direccin dada del microcontrollador
(informacin de fabricacin)

Dado el mapa de memoria para el Philips el producto de


LPC2294, un mismo (mismo) simple esparza el archivo de carga
aparecera como sigue:

15 de Septiembre de 2011

Ing. Juan Manuel Cruz

Ing. Juan Manuel Cruz

33

33

Sistemas Embebido 2010 - C para Embebidos ARM

07/09/2010

Distribucin de carga

FLASH_IMAGE 0X00000000
{ FLASH_Code_Data 0X00000000 0x10000
{ vectors.o (Vect, +FIRST)
; Interrupt & Exception Vectors
* (+RO)
; All Read-Only Code and Data
}
RAM_Code_Data 0X40000000 0x4000
{ * (+RW
(+RW, +ZI)
; All Read-Write
Read Write Code and Data
}
}
Este archivo posiciona la imagen del cdigo en cero absoluto, especifica que la
interrupcin y vectores de la excepcin se carguen primero y a continuacin el
cdigo y datos Read Only (ROM, Flash)
Los datos de lectura-escritura (RAM) se posiciona en 0X40000000 y se
especifica que todos ellos (lectura-escritura y cero-inicializado) se cargue all

15 de Septiembre de 2011

Ing. Juan Manuel Cruz

Ing. Juan Manuel Cruz

34

34

Sistemas Embebido 2010 - C para Embebidos ARM

07/09/2010

Consideraciones adicionales y
conclusiones

Evite la divisin siempre que posible (use desplazamientos si su core ARM no


posee divisin que el hardware)
Las instrucciones ARM son in
in-interrumpibles:
interrumpibles: Load
Load and Store Multiple
Multiple' puede
aumentar mucho la latencia de la interrupcin en sistemas de memoria lenta;
use un flag del compilador para limitar el nmero de registros guardado o
cargados en una instruccin
Las libreras de Tiempo Real pueden ser muy grandes; reemplace las funciones
normalmente usadas con sus propias funciones evitar arrastrar tanto cdigo
Hay ms consideraciones a tener en cuenta listadas en la documentacin del
compilador
l d (estudie
(
d ell manuall y los
l ejemplos
l de
d prueba).
b ) Con ell compilador
l d y
estudiando el assembly pueden surgir ms consideraciones. Finalmente, una
gran cita atribuida a B. Kernighan (va la pgina informativa de J. Ganssle):
Depurar es el doble de duro que escribir el cdigo en primer lugar. Por
consiguiente,
i i
sii usted
d escribe
ib ell cdigo
di tan hbilmente
hbil
como le
l sea posible,
ibl por
definicin usted no es lo bastante astuto como para ponerlo a punto".

15 de Septiembre de 2011

Ing. Juan Manuel Cruz

Ing. Juan Manuel Cruz

35

35

Sistemas Embebido 2010 - C para Embebidos ARM

07/09/2010

Referencias

Representing a Microcontroller in C - Ata. R. Kahn

http://ing.de.soft1.googlepages.com/

C para MCS-51
MCS 51 J.
J M.
M Cruz
C

15 de Septiembre de 2011

Ing. Juan Manuel Cruz

Ing. Juan Manuel Cruz

36

36

Potrebbero piacerti anche