Bonjour.
La question s'adresse aux programmeurs qui ont usage assez pointu du préprocesseur C / C++.
Elle est en lien avec la plateforme avr (arduino).
contexte
Sur certaines architectures, dont les AVR, les constantes se trouvent copiées en RAM par le loader alors que des informations de debuggage ont tout lieu d'être stockées en ROM. Il en résulte un gaspillage de ram important sur des architectures très limitées de ce point de vue.
il existe déjà un attribut __ATTR_PROGMEM__ permettant de spécifier qu'un element doit être placée (uniquement) en ROM.
Il faut par contre utiliser une fonction spéciale pour la lire.
Pour simplifier l'usage de cet attribut, il existe un jeu de macro dont par exemple
La macro PSTR(x) Permet de mettre la chaine x en ROM
voir à ce sujet http://www.nongnu.org/avr-libc/user-..._pgmspace.html
Problème
Vous connaissez sans doute la __func__ qui donne le nom de la fonction en cours.
Le problème, c'est qu'on ne peut pas faire quelque chose du genre
DebugP( PSTR( __func__ ) );
parce que __func__ n'est pas un "string litteral" mais une variable statique.
error: initializer fails to determine size of '__c'
1 2 3
|
//The C99 __func__ magic variable is defined as:
static const char __func__[] = "function-name"; |
Du coup, on se retrouve à mettre des informations de debuggage en RAM, ce dont on manque cruellement.
Bref, l'idée serait de disposer d'une macro __funcP__ définie comme
static const char __funcP__[] __ATTR_PROGMEM__ = "function-name";
voir même directement comme une chaine "immédiate" comme c'est par exemple le cas pour __FILE__
Seulement voila.
Les developpeurs de gcc-avr n'ont pas l'air bien motivés pour ajouter cette fonctionnalité
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=63760
Du coup, je me demandais si il n'était pas possible de faire une macro qui définirai ça tout seul à partir du prototype.
J'ai bien fait quelques essais mais je sèche pour trouver quelque chose qui produise du code à peu près lisible.
Au point où j'en suis, il est moins pénible et surtout plus lisible de définir une variable locale en rom en copie-collant le nom de la fonction.
Quelqu'un aurait-il une idée sur la meilleure façon de s'y prendre ?
Ah! si dernier point.
Si il y a un #prgama que j'ai pas vu et qui fait le job. Je prends !
Partager