Tamaño del programa variable local y global AVR

1

Trabajo en ATmega8 y necesito optimizar mi código lo mejor que pueda, porque estoy más allá del límite y vi algo sorprendente. Tengo unos pocos enteros de 8 bits declarados como variables globales y unos pocos enteros de 8 bits descifrados como variables locales. Y en algunos casos, cuando cambio la variable global a local, obtengo bytes adicionales del programa y en los mismos casos cuando cambio la variable local a global también obtengo bytes adicionales. ¿Alguien puede explicarme por qué, en los mismos casos, las variables globales generan un tamaño más pequeño del programa y, a veces, las variables locales lo hacen?

    
pregunta

1 respuesta

2

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

  1. Aumente el marco de pila para su función.
  2. Inicialice los valores de estas variables.
  3. 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.

    
respondido por el TRON

Lea otras preguntas en las etiquetas