IAR ARM Coloque los símbolos const en flash

3

Tengo la siguiente sección de flash definida en mi archivo enlazador:

keep { section .SomeConst };
place at address mem: 0x0003F800 { readonly section .SomeConst };

En mi código tengo definidos los siguientes símbolos:

#pragma location = ".SomeConst"
__root const uint8_t _value1[16] = {...};
#pragma location = ".SomeConst"
__root const uint8_t _value2[16] = {...};
#pragma location = ".SomeConst"
__root const uint8_t _value3[16] = {...};

¿Es seguro asumir que _value1 siempre estará en 0x3F800? ¿es seguro asumir que _value2 siempre estará en 0x3F810? etc? Supongo que no, pero quería consultar con los expertos.

Esto está usando EWARM

Gracias Bret

    
pregunta BAO

2 respuestas

4

Su código solo le dice al compilador que coloque las variables _value1 , _value2 y _value3 en el segmento que comienza en 0x0003F800. No es seguro asumir que siempre obtendrán la dirección en orden, especialmente si la alineación entra en juego.

Si necesita forzar al compilador a almacenar una variable en una dirección dada, debe decirlo explícitamente:

#pragma location=0x3F800
__root const uint8_t _value1[16] = {...};
#pragma location=0x3F810
__root const uint8_t _value2[16] = {...};
#pragma location=0x3F820
__root const uint8_t _value3[16] = {...};

También puedes colocar tus variables EWRAM en una estructura que luego colocarías con #pragma pack . Esto garantizaría el orden de las variables dentro de la estructura y la alineación, por lo que podría confiar en que las compensaciones de los campos individuales sean constantes.

    
respondido por el Dmitry Grigoryev
1

La disposición actual del enlazador solo garantiza que todas estas variables irán a la sección específica. Pero qué variable se colocaría al inicio puede depender del orden de enlace de los objetos si se utiliza la misma sección en otras unidades compiladas. Si desea estar 100% seguro de que una variable se asignará en alguna dirección, defina la sección de memoria exclusiva solo para esa variable y mapéela por separado en el enlazador con alineación esperada.

    
respondido por el Varun Mishra

Lea otras preguntas en las etiquetas