J'essaie d'écrire un programme pour ATTiny13. Mon problème est qu'il a d'énormes contraintes de taille. Eh bien, lors de la création de mon premier programme Hello World, il a fallu 100 octets d'espace de programme juste pour allumer et éteindre une lumière! Y a-t-il des options que je peux donner à avr-gcc pour réduire cette taille? De plus, que contient le crt0? Je ne suis pas trop passionné par l'assemblage AVR donc je ne le comprends pas beaucoup ..
Je ne veux pas avoir à passer à l'assemblage pour ce projet ..
avr
attiny
programming
compiler
Earlz
la source
la source
Réponses:
crt0 est la routine de démarrage de l'UC. Les routines effectuent la configuration des registres ainsi que l'initialisation des données.
Les 100 octets incluent-ils la table des vecteurs d'interruption? Je ne suis pas sûr de l'Attiny13 mais l'Attiny25 / 45/85 a 15 vecteurs d'interruption. Cela prendrait 30 octets.
gcc a une option pour lier dans votre crt0. Vous pouvez prendre le fichier AVR crt0.S et le modifier. Ce n'est pas très long donc ça ne devrait pas être difficile à faire.
la source
/avr-libc-1.6.7/avr/lib/avr2/attiny13/crttn13.S
Vous pouvez utiliser avr-objdump -d .elf pour voir ce qui est généré:
Analysons-le un peu:
Tableau vectoriel d'interruption de 20 octets (au moins certaines des entrées pourraient être omises si vous insistiez et promettiez de ne jamais activer les interruptions correspondantes).
Efface SREG (je ne suis pas sûr que ce soit vraiment nécessaire), écrit 0x9f (RAMEND) dans SPL (le pointeur de pile) et passe à main. Le dernier rjmp est un peu redondant. (vous pourriez promettre de ne jamais revenir du principal)
Procédure d'interruption par défaut pour les interruptions qui n'en ont pas écrasées en C. (mêmes règles que pour __vectors)
Votre proc principal. Serré.
Ces deux ne sont pas très utiles. _exit est probablement requis par la norme C et __stop_program est nécessaire pour qu'il fonctionne comme il se doit.
la source
Quelle est votre éventuelle candidature? Un ATtiny13 a 1 Ko de flash et vous pouvez faire beaucoup avec cela en C. Le crt0 est le runtime avr-libc C. Il contient des éléments comme la gestion de la pile afin que vous puissiez utiliser des fonctions avec des arguments et des valeurs de retour.
100 octets pour la configuration C intégrée n'est pas trop mal, et sa taille est constante. Doubler les lignes de la logique du programme ne fera pas nécessairement 200 octets. À quel niveau d'optimisation compilez-vous? Vous devriez être à "-O". Et comment compilez-vous cela? Les Makefiles dans les projets de démonstration disponibles sur le site avr-libc sont assez bons et complets.
Le programme simple d'activation / désactivation des LED ci-dessous prend 62 octets sur un ATtiny13 avec "-Os" sur le avr-gcc 4.3.3. de CrossPack-AVR:
La suppression des appels _delay_ms () lui fait 46 octets.
Un plus grand exemple sur l'ATtiny13 sont mes prototypes Smart LED . Ce code contient un logiciel PWM à 3 canaux, une conversion des couleurs HSV en RVB, une machine d'état et lit deux boutons. Il n'est pas particulièrement bien écrit et arrive à 864 octets. Sous avr-gcc 3.x, il était encore plus petit. (pour une raison quelconque, avr-gcc 4 a fait croître presque tous les programmes de quelques octets)
la source
avr-gcc -std=c99 -Wall -Os -mmcu=attiny13 -o hello.out helloworld.c
est la ligne pertinente dans mon makefile (auto-créé). et j'utilise un code presque identique sauf pour retourner la LED que j'utilisePORTB &= ~(1 << LED);
et autresSi vous manquez d'espace, essayez IAR's Embedded Workbench - leur version gratuite 'kickstart' a une limite de taille de code de 4K, donc beaucoup pour ATTiny, et probablement une meilleure optimisation que gcc
la source
De tels périphériques sont souvent programmés dans l'assembleur, ce qui entraîne des exécutables plus petits. Cela vaut la peine de faire l'effort et d'apprendre à l'utiliser.
la source