sistemas embebidos-2011 2doc-c para embebidos arm-cruz

36
Sistemas Embebidos C para Embebidos ARM C para Embebidos ARM http://laboratorios.fi.uba.ar/lse/ 66.48 & 66.66 Seminario de Electrónica: Sistemas Embebidos seminario-embebidos@googlegroups.com Curso de Posgrado: Introducción a los Sistemas Embebidos Ingeniería en Electrónica FI UBA Ingeniería en Electrónica FI UBA Buenos Aires, 15 de Septiembre de 2011

Upload: joacofelici

Post on 04-Sep-2015

10 views

Category:

Documents


5 download

DESCRIPTION

aa

TRANSCRIPT

  • 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