-
Sistemas Embebido 2010 - C para Embebidos ARM 07/09/2010
Ing. Juan Manuel Cruz 1
Sistemas EmbebidosC para Embebidos ARMC para Embebidos ARM
http://laboratorios.fi.uba.ar/lse/
66.48 & 66.66 Seminario de Electrnica: Sistemas
Embebidos
[email protected]
Curso de Posgrado: Introduccin a los Sistemas Embebidos
Ingeniera en Electrnica FI UBAIngeniera en Electrnica FI UBA
Buenos Aires, 15 de Septiembre de 2011
-
Sistemas Embebido 2010 - C para Embebidos ARM 07/09/2010
Ing. Juan Manuel Cruz 2
Temario
Construcciones y Formas del Lenguaje C y g jpara Embebidos
Consideraciones para codificar en C sobre pprocesadores ARM
Mapa de memoria Consideraciones adicionales y conclusiones
15 de Septiembre de 2011 2Ing. Juan Manuel Cruz
-
Sistemas Embebido 2010 - C para Embebidos ARM 07/09/2010
Ing. Juan Manuel Cruz 3
Construcciones y Formas delConstrucciones 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 fijay/o en posiciones de memoria
fija Pueden cambiar de valor debido a eventos del
hardware (asincrnicos al flujo del programa)( j p g ) Escribir
en ellas pueden ser ilegal y causar
excepciones de sistemaP d bi d l l l d
15 de Septiembre de 2011
Pueden cambiar de valor al ser ledas
3Ing. Juan Manuel Cruz
-
Sistemas Embebido 2010 - C para Embebidos ARM 07/09/2010
Ing. Juan Manuel Cruz 4
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 lahiptesis 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 l d l l i t l t t d lclases
del almacenamiento en el contexto del
embebido ms que en el contexto general de la informtica)
15 de Septiembre de 2011 4Ing. Juan Manuel Cruz
-
Sistemas Embebido 2010 - C para Embebidos ARM 07/09/2010
Ing. Juan Manuel Cruz 5
Las Variables en Embebidos
Algunas palabras claves:
Calificador de tipo const
Calificador de tipo volatile
Representar perifricos mediante structs
15 de Septiembre de 2011 5Ing. Juan Manuel Cruz
-
Sistemas Embebido 2010 - C para Embebidos ARM 07/09/2010
Ing. Juan Manuel Cruz 6
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 yel
identificador
static const int id; 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
15 de Septiembre de 2011
valor al reentrar al bloque y su alcance se restringe al resto
del archivo fuente) calificada del tipo constante
6Ing. Juan Manuel Cruz
-
Sistemas Embebido 2010 - C para Embebidos ARM 07/09/2010
Ing. Juan Manuel Cruz 7
Calificador de tipo const
Declaracin de variable en ROM y de puntero en RAM que apunta a
ROMRAM que apunta a ROM
static const int id = 4; const int *ptr = &id;p ;
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
int const ptr = &id;
7Ing. Juan Manuel Cruz
-
Sistemas Embebido 2010 - C para Embebidos ARM 07/09/2010
Ing. Juan Manuel Cruz 8
Calificador de tipo const
Declaracin de variable en ROM y de puntero en ROM que apunta a
ROMROM que apunta a ROM
const int id = 4; const int * const ptr = &id;p ;
Declaracin de puntero en ROM que apunta a posicin de memoria
fija
int *const ptr = (int *)0x40000000;
15 de Septiembre de 2011 8Ing. Juan Manuel Cruz
-
Sistemas Embebido 2010 - C para Embebidos ARM 07/09/2010
Ing. Juan Manuel Cruz 9
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)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 asignacinmantendr su valor inalterable
desde la ltima asignacin (optimizacin que el compilador intentar
hacer a variables de otro tipo)
15 de Septiembre de 2011 9Ing. Juan Manuel Cruz
-
Sistemas Embebido 2010 - C para Embebidos ARM 07/09/2010
Ing. Juan Manuel Cruz 10
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 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
(registro del resultado de un conversor A/D)
10Ing. Juan Manuel Cruz
-
Sistemas Embebido 2010 - C para Embebidos ARM 07/09/2010
Ing. Juan Manuel Cruz 11
Representar perifricos mediante structs Los registros entrada
salida de propsito general de
un puerto de 32 bits de un microcontrolador NXP ARM son:ARM
son:
15 de Septiembre de 2011 11Ing. Juan Manuel Cruz
-
Sistemas Embebido 2010 - C para Embebidos ARM 07/09/2010
Ing. Juan Manuel Cruz 12
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
cambiar por eventos de hardware y slo debern escribirse los p ybits
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;
15 de Septiembre de 2011
volatile unsigned int IOCLR;} GPIO;
12Ing. Juan Manuel Cruz
-
Sistemas Embebido 2010 - C para Embebidos ARM 07/09/2010
Ing. Juan Manuel Cruz 13
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 es un puntero constante a una variable del tipo GPIO
(estructuraptr_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
d l d l d OPodemos usar el puntero para acceder al port0 de GPIO
como: ptr_Port0 -> IOSET = 0xD0D0FEED
Las otras variables pueden leerse o escribirse de manera
similar
15 de Septiembre de 2011
La estructura GPIO completa tambin puede declararse voltil:
typedef struct {...} Volatile GPIO
13Ing. Juan Manuel Cruz
-
Sistemas Embebido 2010 - C para Embebidos ARM 07/09/2010
Ing. Juan Manuel Cruz 14
Consideraciones para codificar en C sobre procesadores ARM
Existen muchas consideraciones bsicas de programacin para
procesadores ARM, la documentacin del compilador usado aporta
gran detalle sobre diversos aspectos importantes y p g p p ysutiles
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 memo ia
dada s ele se alto (salta al chipconfiguracin de memoria dada suele
ser alto (saltar al chip ms prximo y de no existir forzara el
rediseo del sistema)
Es til analizar el lenguaje assembly generado por el
compilador
15 de Septiembre de 2011
Es til analizar el lenguaje assembly generado por el compilador
para aprender sobre la eficiencia y lo que hace el compilador
14Ing. Juan Manuel Cruz
-
Sistemas Embebido 2010 - C para Embebidos ARM 07/09/2010
Ing. Juan Manuel Cruz 15
Consideraciones para la depuracin
La eficiencia de depuracin y de cdigo a veces chocan. El
compilador da opciones cdigo vs info. de depuracin (aprox. al 15%,
uno debe ver sus efectos y usar la ms apropiada), y p p )
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 elen modo de
depuracin para que el cdigo que se ejecuta en el sistema sea lo ms
parecido al cdigo que se verific
Al optimizar pueden surgir diferencias al cdigo usado en la p p
g gdepuracin 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
15 de Septiembre de 2011
propio (la ejecucin condicional de ARM est deshabilitada para
todas las opciones de depuracin)
15Ing. Juan Manuel Cruz
-
Sistemas Embebido 2010 - C para Embebidos ARM 07/09/2010
Ing. Juan Manuel Cruz 16
Consideraciones de Lazos Los programas embebidos siguen la regla
90/10: el 90% del
tiempo se ejecuta el 10% del cdigo (Hennessy & Patterson).
Pasan la mayor parte del tiempo ejecutando Lazos (usualmente y p p
j (saltos hacia atrs), por lo que es importante comprender y
optimizar comportamiento de lazos
Una simple optimizacin es escribir for de conteo regresivo que
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
lazoentre 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
15 de Septiembre de 2011
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
16Ing. Juan Manuel Cruz
-
Sistemas Embebido 2010 - C para Embebidos ARM 07/09/2010
Ing. Juan Manuel Cruz 17
Asignacin de Registros yAsignacin de Registros yAlias 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) por lo tanto una variable alocada en un(pointer
aliasing), por lo tanto una variable alocada en un registro
debe:
a) Ser una variable local o un parmetro de funcin) p 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
15 de Septiembre de 2011
si el valor de la misma no es cambiado desde fuera del mdulo,
por lo tanto debe ubicar la variable en memoria (no en
registro)
17Ing. Juan Manuel Cruz
-
Sistemas Embebido 2010 - C para Embebidos ARM 07/09/2010
Ing. Juan Manuel Cruz 18
Asignacin de Registros yAsignacin de Registros yAlias 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: Ejemplo de asignacin
de alias de puntero: int prog1 (int var1)
{ somefunction (&var1);El paso de la direccin de var1 y la
posterior referencia a var1 en memoriap y ppues 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;{ int local1 = var2;
somefunction (&local1);var2 = local1;
Toda referencia posterior a var2 se har por registro ya que su
direccin
15 de Septiembre de 2011
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
18Ing. Juan Manuel Cruz
-
Sistemas Embebido 2010 - C para Embebidos ARM 07/09/2010
Ing. Juan Manuel Cruz 19
Tipos de Datos yTipos de Datos yAlineacin Natural en ARM
Entre la arquitectura de un microcontrolador y los tipos de
variables en C all pueden existir alguna alineacin natural, por
ejemplo, la capacidad para manipular naturalmente los tipos j p , p
p p pbyte o word (en una sola instruccin y eficientemente)
El cdigo ARM puede acceder a datos ms eficientemente si
corresponde a su tamao natural los lmites de la
alineacincorresponde a su tamao natural, los lmites de la alineacin
para los tipos de variable C son:
15 de Septiembre de 2011 19Ing. Juan Manuel Cruz
-
Sistemas Embebido 2010 - C para Embebidos ARM 07/09/2010
Ing. Juan Manuel Cruz 20
Tipos de Datos yTipos de Datos yAlineacin 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 cerosb) Los valores
signados se expanden con signo 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 fi i t i t i bl l l ti l l t d d
15 de Septiembre de 2011
eficiente usar int para variables locales y convertir el valor
retornado de ser necesario (el uso de ints reduce tamao de cdigo y
aumenta el rendimiento)
20Ing. Juan Manuel Cruz
-
Sistemas Embebido 2010 - C para Embebidos ARM 07/09/2010
Ing. Juan Manuel Cruz 21
Tipos de Datos yTipos de Datos yAlineacin Natural en ARM
Aqu hay un ejemplo de eficiencia utilizando el tipo int: short
somefunction (short i) { i = i + 1; return i; }
El cdigo generado ser:g gADD a1, a1, #1MOV 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, #1MOV pc, lr /* return */
Use enteros cuando sea posible para evitar las conversiones de
shorts & chars.
15 de Septiembre de 2011
p pComo cada regla tiene excepciones puede haber un balance
entre el tamao del cdigo y del espacio variables
21Ing. Juan Manuel Cruz
-
Sistemas Embebido 2010 - C para Embebidos ARM 07/09/2010
Ing. Juan Manuel Cruz 22
ARM Thumb Procedure CallARM 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 registrosregistros). La rutina llamada debe restaurar el
estado de estos 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
15 de Septiembre de 2011
accesos de registro muy eficiente) debe evitarse mientras se sea
posible
22Ing. Juan Manuel Cruz
-
Sistemas Embebido 2010 - C para Embebidos ARM 07/09/2010
Ing. Juan Manuel Cruz 23
ARM Thumb Procedure CallARM Thumb Procedure Call Standard
(ATPCS)
15 de Septiembre de 2011 23Ing. Juan Manuel Cruz
-
Sistemas Embebido 2010 - C para Embebidos ARM 07/09/2010
Ing. Juan Manuel Cruz 24
ARM Thumb Procedure CallARM 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
porpequeo 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(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 t l t t ( i fi i t t t )puntero a la estructura (es muy
ineficiente pasar una estructura)
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
15 de Septiembre de 2011
f) Para retornar valores tambin se usan ro .. r3 (ms valores se
retornan en la pila)
24Ing. Juan Manuel Cruz
-
Sistemas Embebido 2010 - C para Embebidos ARM 07/09/2010
Ing. Juan Manuel Cruz 25
Alineamiento de estructurasAlineamiento de estructurasy 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),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;}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 d l d d li i d l il d ) d h
15 de Septiembre de 2011
de acuerdo con el mtodo de alineacin del compilador). Puede ser
provechoso prestar atencin al arreglo de estructuras para ahorrar
bytes
25Ing. Juan Manuel Cruz
-
Sistemas Embebido 2010 - C para Embebidos ARM 07/09/2010
Ing. Juan Manuel Cruz 26
_packed & Bit-Fields Estructuras definidas con el
calificador _packed alinean sus
miembros a 1byte (sin ningn relleno) Typedef packed struct {
char c; int i; short s; char d;}yp _p { ; ; ; ;}
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) Debe justificarse su usopues crea ms
instrucciones y reduce el rendimiento). Debe justificarse su
uso
Con bit-fields ocurre algo similar (se compacta a costa de ms
cdigo y ms bajo rendimiento) Puede usarse en estructurascdigo y ms
bajo 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
contiene (el tamao de un contenedor entero es 32 bits)
26Ing. Juan Manuel Cruz
-
Sistemas Embebido 2010 - C para Embebidos ARM 07/09/2010
Ing. Juan Manuel Cruz 27
_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.xxbits 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)ms efectivo el enmascaramiento lgico de variables
enteras)
La regla bsica es que valores enteros se alinean naturalmente
con la arquitectura ARM de 32-bits y el pensamiento debe q y
pentrar 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 27Ing. Juan Manuel Cruz
-
Sistemas Embebido 2010 - C para Embebidos ARM 07/09/2010
Ing. Juan Manuel Cruz 28
Mapa de memoria El mapa de memoria representa la direccin de
arranque y la
longitud de las diversas zonas de memoria que corresponde a:
) R d O l M (ROM fl h) di a) Read Only Memory (ROM, flash): para
cdigo
b) RAM: para datos (heap, stack) o cdigo
c) Perifricos: registros de perifricos mapeados en memoria (su
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: posiciones de memorias fijas para
los ) p p j pmanejadores de interrupciones y excepciones
Estas reas pueden ser re-mapeadas luego del booteo (para
re-programar la memoria Flash)
15 de Septiembre de 2011 28Ing. Juan Manuel Cruz
-
Sistemas Embebido 2010 - C para Embebidos ARM 07/09/2010
Ing. Juan Manuel Cruz 29
Mapa de memoria El mapa de memoria representa la direccin de
arranque y la
longitud de las diversas zonas de memoria que corresponde a:
) R d O l M (ROM fl h) di a) Read Only Memory (ROM, flash): para
cdigo
b) RAM: para datos (heap, stack) o cdigo
c) Perifricos: registros de perifricos mapeados en memoria (su
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: posiciones de memorias fijas para
los ) p p j pmanejadores de interrupciones y excepciones
Estas reas pueden ser re-mapeadas luego del booteo (para
re-programar la memoria Flash)
15 de Septiembre de 2011 29Ing. Juan Manuel Cruz
-
Sistemas Embebido 2010 - C para Embebidos ARM 07/09/2010
Ing. Juan Manuel Cruz 30
Mapa de memoria Algunas observaciones sobre el mapa de memoria
del micro
Philips LPC2294:
) Bl d B t d 8K bi d 2GB j l t d t a) Bloque de Booteo de 8K
ubicado en 2GB, maneja los eventos de resetdel 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 luego del
booteo para b) Los vectores de la Interrupcin son 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 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 de memoria se mantiene entre derivados
permitiendo el
15 de Septiembre de 2011
p pre-uso de software. La ubicacin de las rutinas de servicio de
interrupcin y las convenciones de la interrupcin se mantienen tanto
como sea posible
30Ing. Juan Manuel Cruz
-
Sistemas Embebido 2010 - C para Embebidos ARM 07/09/2010
Ing. Juan Manuel Cruz 31
Mapa de memoria
15 de Septiembre de 2011 31Ing. Juan Manuel Cruz
-
Sistemas Embebido 2010 - C para Embebidos ARM 07/09/2010
Ing. Juan Manuel Cruz 32
Distribucin de carga Distribuir la imagen del ejecutable en
zonas adecuadas de
memoria para aprovechar un mapa de memoria complejo, controlar
el orden de la carga de variables/mdulos y relacionar g / ylas
propiedades de variables a zonas de memoria especficas
Las zonas de memoria poseen propiedades especficas incluyen: )
Sl L t (RO) Cdi d t l l d difi d a) Slo-Lectura (RO): Cdigo y datos
que slo sern ledos, no modificados
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), t D b t
di i d St k h
15 de Septiembre de 2011
etc. Deben setearse direcciones de Stack y heap y re-mapear
Vectores antes de la ejecucin
32Ing. Juan Manuel Cruz
-
Sistemas Embebido 2010 - C para Embebidos ARM 07/09/2010
Ing. Juan Manuel Cruz 33
Distribucin de carga Para hacer todos el anterior se cera un
archivo de distribucin
de carga y es pasado al Linker:
El hi ti b d l t ib t di i d El archivo contiene nombres de las
zonas, atributos, direcciones de 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 33Ing. Juan Manuel Cruz
-
Sistemas Embebido 2010 - C para Embebidos ARM 07/09/2010
Ing. Juan Manuel Cruz 34
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 +ZI) ; All Read Write
Code and Data{ * (+RW, +ZI) ; All 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)
15 de Septiembre de 2011
Los datos de lectura-escritura (RAM) se posiciona en 0X40000000
y se especifica que todos ellos (lectura-escritura y
cero-inicializado) se cargue all
34Ing. Juan Manuel Cruz
-
Sistemas Embebido 2010 - C para Embebidos ARM 07/09/2010
Ing. Juan Manuel Cruz 35
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-interrumpibles: Load and Store
Multiple' puede Las instrucciones ARM son in interrumpibles: Load
and Store 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 l d ( d l l l l d b ) l l dcompilador (estudie el
manual y los ejemplos de prueba). Con el compilador 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
i i i d ib l di hbil l ibl
15 de Septiembre de 2011
consiguiente, si usted escribe el cdigo tan hbilmente como le
sea posible, por definicin usted no es lo bastante astuto como para
ponerlo a punto".
35Ing. Juan Manuel Cruz
-
Sistemas Embebido 2010 - C para Embebidos ARM 07/09/2010
Ing. Juan Manuel Cruz 36
Referencias Representing a Microcontroller in C - Ata. R.
Kahn
http://ing.de.soft1.googlepages.com/
C MCS 51 J M C C para MCS-51 J. M. Cruz
15 de Septiembre de 2011 36Ing. Juan Manuel Cruz