Estoy tratando de escribir un programa para el ATTiny13. Mi problema es que tiene grandes limitaciones de tamaño. Bueno, cuando hice mi primer programa Hello World, ¡tomó 100 bytes de espacio en el programa solo para encender y apagar la luz! ¿Hay alguna opción que pueda darle a avr-gcc para reducir este tamaño? Además, ¿qué hay en el crt0? No estoy muy interesado en el ensamblaje AVR, así que no lo entiendo mucho ...
No quiero tener que ir al ensamblaje para este proyecto.
avr
attiny
programming
compiler
Earlz
fuente
fuente
Respuestas:
crt0 es la rutina de inicio para el uC. Las rutinas realizan la configuración de los registros y también la inicialización de los datos.
¿Los 100 bytes incluyen la tabla de vectores de interrupción? No estoy seguro sobre el ATtiny13 pero el ATtiny25 / 45/85 tiene 15 vectores de interrupción. Esto tomaría 30 bytes.
gcc tiene una opción para vincular en su crt0. Puede tomar el archivo AVR crt0.S y modificarlo. No es muy largo, por lo que no debería ser difícil de hacer.
fuente
/avr-libc-1.6.7/avr/lib/avr2/attiny13/crttn13.S
Puede usar avr-objdump -d .elf para ver lo que se genera:
Analicémoslo un poco:
Tabla de vectores de interrupción de 20 bytes (al menos algunas de las entradas podrían omitirse si insiste y promete que nunca habilitará las interrupciones correspondientes).
Borra SREG (no estoy seguro de que esto sea realmente necesario), escribe 0x9f (RAMEND) en SPL (el puntero de la pila) y salta a main. El último rjmp es algo redundante. (podría prometer que nunca volverá de main)
Procedimiento de interrupción predeterminado para esas interrupciones que no tienen una sobrescrita en C. (mismas reglas que para __vectores)
Tu proceso principal. Apretado.
Estos dos no son muy útiles. _exit es probablemente requerido por el estándar C y __stop_program es necesario para que funcione como debería.
fuente
¿Cuál es su eventual aplicación? Un ATtiny13 tiene 1kB de flash y puede hacer mucho con eso en C. El crt0 es el tiempo de ejecución C avr-libc. Contiene cosas como el manejo de la pila para que pueda usar funciones con argumentos y valores de retorno.
100 bytes para la configuración de C incrustado no es tan malo, y es de tamaño constante. Duplicar las líneas de la lógica del programa no necesariamente lo convertirá en 200 bytes. ¿En qué nivel de optimización está compilando? Deberías estar en "-Os". ¿Y cómo estás compilando esto? Los Makefiles en los proyectos de demostración disponibles en el sitio avr-libc son bastante buenos y completos.
El simple programa de encendido / apagado de LED a continuación toma 62 bytes en un ATtiny13 con "-Os" en el avr-gcc 4.3.3. de CrossPack-AVR:
Eliminar las llamadas _delay_ms () hace 46 bytes.
Un ejemplo más amplio en el ATtiny13 son mis prototipos Smart LED . Este código contiene un software PWM de 3 canales, una conversión de color HSV a RGB, una máquina de estado y lee dos botones. No está escrito particularmente bien y viene en 864 bytes. Bajo avr-gcc 3.x era aún más pequeño. (por alguna razón, avr-gcc 4 ha hecho que casi todos los programas crezcan unos pocos bytes)
fuente
avr-gcc -std=c99 -Wall -Os -mmcu=attiny13 -o hello.out helloworld.c
es la línea relevante en mi archivo MAKE (auto creado). y uso un código casi idéntico, excepto para voltear el LED que usoPORTB &= ~(1 << LED);
y talSi tiene poco espacio, pruebe el banco de trabajo integrado de IAR: su versión 'kickstart' gratuita tiene un límite de tamaño de código de palabra 4K, por lo que es suficiente para ATTiny y probablemente una mejor optimización que gcc
fuente
Dispositivos como ese a menudo se programan en ensamblador, lo que resulta en ejecutables más pequeños. Vale la pena hacer el esfuerzo y aprender a usarlo.
fuente