sistemas embebidos-2011 2doc-c para embebidos arm-cruz
DESCRIPTION
aaTRANSCRIPT
-
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
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