Las variables globales se colocan en la sección .data
de su programa (si se inicializa explícitamente) o en la sección .bss
(si no se inicializa). Los valores iniciales para las variables globales se copian desde flash al iniciarse mediante la función __do_copy_data()
(agregada por los scripts del vinculador si es necesario) y la inicialización de las variables en .bss
a cero (esto es obligatorio por el estándar C) Se realiza mediante __do_clear_bss()
. Su programa incluye símbolos que le indican el tamaño de estos dos segmentos. Se debe incluir código para manejar estos eventos. Tenga en cuenta que a veces estas variables se pueden vincular a un registro.
Las variables locales, por otro lado, residen en los registros o en la pila. Al ser una Máquina Harvard modificada, AVR tiene un gran número de registros, por lo tanto, si las variables locales se pueden colocar allí, lo harán para evitar el acceso a la memoria. Esto significa que para las variables locales, si residen en la pila, debe haber código para
- Aumente el marco de pila para su función.
- Inicialice los valores de estas variables.
- Realice un ciclo de carga / modificación / almacenamiento cada vez que cambien (esto también debe hacerse para los globales).
Como resultado, según la cantidad de código que deba agregarse al binario, cambiará. Para más detalles, puede ver lo que realmente está sucediendo al desensamblar su binario ( avr-objdump
es un buen lugar de inicio) y al enumerar los símbolos en el archivo ( avr-nm
).
Saludos.