2017-02-17 1 views
2

Je me trouve dans de nombreuses situations que j'aurais dû stocker un tableau ou un tas de structures dans la ROM au lieu de RAM. Ensuite, je passe en revue tout le code et apporte des modifications comme ajouter PROGMEM, pgm_read_word(), pgm_read_byte(). C'est une tâche difficile à faire surtout après avoir écrit comme 4000 lignes de code.Y a-t-il un moyen facile en C (programmation AVR) de choisir si une variable doit être stockée dans la RAM ou la ROM et de la gérer à travers tout le code?

Y at-il un truc qui pourrait être fait pour faciliter cela?

+0

Un truc? Utiliser un compilateur qui supporte correctement l'architecture serait un début. Vous ne devriez pas avoir à vous soucier de l'activité de 'pgm_read_read', le moyen raisonnable est un qualificateur pour marquer les espaces de mémoire du programme. – doynax

+0

Le placement de la mémoire est généralement géré par l'éditeur de liens – user3528438

+2

@ user3528438: L'éditeur de liens alloue des variables _dans un espace d'adressage, il ne sélectionne généralement pas le segment dans lequel les placer. L'AVR en particulier est une architecture de Harvard qui nécessite différents types d'instructions à générer pour la ROM par rapport à la RAM, la première étant quelque peu restreinte en comparaison. – doynax

Répondre

1

Vous devriez envisager d'utiliser la fonctionnalité named address spaces de GCC. Cette fonctionnalité a été activée pour les AVR dans GCC 4.7, donc vous devrez vous assurer que vous utilisez GCC 4.7 ou plus tard. Cela vous permettra de spécifier au compilateur l'espace mémoire de vos variables et l'espace mémoire sur lequel pointent les pointeurs. Ensuite, vous pouvez accéder aux variables avec la syntaxe C régulière au lieu d'utiliser des fonctions telles que pgm_read_byte.

Note: Au GCC 4.9.2, les espaces d'adressage sont nommés uniquement pris en charge dans le compilateur GNU C, pas le compilateur C++, que l'Arduino IDE utilise.

+0

cela n'a merci, je ne les éléments suivants: Pour définir un nouveau tableau flash: '__ const __attribute ((__ flash)) int my_array [4] = {1,2,3,4}' J'accédaient comme un tableau normal, ici j'ai imprimé le dernier élément dans my_array 'Serial.println (String (my_array [3]))' –

+0

Je suis un peu confus. Pourquoi quelqu'un devrait-il lutter avec «PROGMEM» et «pgm_read_byte()» s'il y a une façon plus simple et plus flexible de faire le travail? –

+0

GCC 4.7.0 a été publié en 2012 et il a fallu plus de temps pour qu'il devienne universellement disponible. Il y avait beaucoup de travail de développement AVR fait avant. –