Suis-je surabonde la mémoire flash de mon AVR avec un programme qui est trop grand?

StackOverflow https://stackoverflow.com/questions/1587810

  •  22-09-2019
  •  | 
  •  

Question

J'ai un projet où un ATtiny2313V contrôle une matrice LED 7x5 pour afficher le texte défilant. Pour afficher le texte, je construit une police qui est stockée dans le flash avec le reste du programme.

L'ensemble du programme, y compris l'ensemble de la police, prend 1106 octets. Mais quand je charge dans la puce, il ne semble pas courir; Au contraire, il allume juste un couple de la LED et c'est tout.

Cependant, quand je supprimer la plupart de la police, et compilent avec seulement les lettres A à J, le programme est de 878 octets, et fonctionne très bien.

Est-ce à cause d'une sorte de débordement de la mémoire flash AVR?

La fiche technique de l'ATtiny2313V dit qu'il a 2KByte de flash! Comment peut-1106 octets trop?

UPDATE : Pour être clair, la chaîne d'outils J'utilise est AVR Studio (pour compiler le code) puis AVRDUDE de le télécharger sur le micro-contrôleur. Pour autant que je sache, AVR Studio utilise une version de-gcc pour AVR compiler le code.

Était-ce utile?

La solution 2

Je vous jure qu'il ya quelque chose de magique SO; J'ai mon cerveau pour creuse la semaine, en essayant de comprendre cela, et après avoir posé la question ici - je peux enfin voir ce qui a été me regarder en face

Voici l'utilisation de la mémoire pour la compilation avec seulement les lettres A-J dans la police:

AVR Memory Usage
----------------
Device: attiny2313

Program:     872 bytes (42.6% Full)
(.text + .data + .bootloader)

Data:         82 bytes (64.1% Full)
(.data + .bss + .noinit)

Et voilà encore une fois, avec les lettres A-Z:

AVR Memory Usage
----------------
Device: attiny2313

Program:     952 bytes (46.5% Full)
(.text + .data + .bootloader)

Data:        162 bytes (126.6% Full)
(.data + .bss + .noinit)

Voir la 126.6% dans les données? Oops! J'ai vraiment fait déborder!

Autres conseils

Je ne suis pas sûr de ce que la chaîne outil que vous utilisez, mais en avr-gcc vous aurez besoin d'utiliser l'en-tête <avr/pgmspace.h> pour stocker et d'accès aux données en flash - il ne suffit pas de déclarer votre const de données est encore chargé en mémoire lors de l'exécution, et en tant que tel prend de la place dans le flash et la RAM (comme toute autre variable initialisé).

Consultez la Manuel de l'utilisateur et En-tête Docs pour plus d'informations. Useage est assez simple, de déclarer un tableau de caractères en flash, utilisez la macro PROGMEM:

char data[] PROGMEM = {0xc4, 0x77}; // etc

Ensuite, pour accéder aux données, vous devez utiliser les macros fournies

char d = pgm_read_byte(&(data[i]));

Edit: Gardez à l'esprit que AVRDUDE ne rapporte les alloués statiquement parties de RAM (.data et .bss) pour globals et variables statiques, etc. Vous devez laisser la place pour la pile - combien dépend exactement de votre programme ( indice:. récursion est mauvais)

Vérifiez que vous n'êtes pas déborder votre pile? Cela peut produire des accidents qui sont difficiles à détecter. Vous pouvez définir votre taille de la pile quelque part dans les paramètres compilateur / éditeur de liens, ou vous pouvez convertir des variables locales à des variables globales. Un processeur embarqué n'a généralement pas de chèques pour un débordement de pile, il se bloque juste.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top