La respuesta corta es declarar su variable con la palabra clave const
. Si su MCU realmente recuerda el valor de su variable const
(es decir, su cálculo sinusoidal realmente funciona), debe almacenarse en la memoria flash, de lo contrario se perdería en el primer reinicio después de la programación.
La respuesta larga tiene que ver con el script del enlazador. Estos scripts son dependientes de MCU y le indican al vinculador dónde colocar qué. Por lo general, este script lo proporciona el IDE, pero puede escribir el suyo propio. En mi configuración STM32F4, mi script de vinculador comienza con una declaración de este tipo:
MEMORY
{
FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 1024K
RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 128K
CCMRAM (xrw) : ORIGIN = 0x10000000, LENGTH = 64K
MEMORY_B1 (rx) : ORIGIN = 0x60000000, LENGTH = 0K
}
Dice que el flash comienza en la dirección 0x08000000
y la RAM en la dirección 0x20000000
. Estas direcciones se pueden encontrar en la hoja de datos donde se describe el mapa de memoria. El resto del guión puede involucrarse, pero en algún momento habrá algo en este sentido:
.text :
{
. = ALIGN(4);
*(.text) /* .text sections (code) */
*(.rodata) /* .rodata sections (constants, strings, etc.) */
. = ALIGN(4);
_etext = .; /* define a global symbols at end of code */
} >FLASH
Esto dice que todas las secciones .text
(así es como el compilador llama a la sección de código) y las secciones .rodata
(así es como el compilador llama a las variables const
) deben colocarse en la sección flash.
Como se sugirió anteriormente, el archivo .map
es la forma principal en que puede verificar qué es lo que el vinculador coloca donde. Le dices al enlazador que lo genere usando esta opción:
arm-eabi-gcc -Wl,-Map=my_program.map ...
Puede buscar su símbolo dentro de este archivo de mapa, ver en qué dirección se ha guardado y verificarlo con el mapa de memoria especificado en la hoja de datos de MCU.