Comment economiser la mémoire du µC [Fermé]

Signaler
-
 sylvio -
Bonjour,
Je suis actuellement sur un projet électronique incluant un µC et un afficheur LCD. La programmation du µC est en Language C. N'étant pas informaticien de formation, j'ai du mal à résoudre mon problème.
Pour afficher un caractère sur l'ecran LCD, il faut lui envoyer tout une suite d'octet, qui a première vu doivent être stockés en mémoire.
Justement, ces octets sont des constantes, et je me demande si l'on ne peut pas utiliser le préprocesseur pour économiser la mémoire du µC.
Je sais que par l'intermédiaire de cette déclaration :

#define VALEUR 0x25 (par exemple)

, la constante est défini. Mais je ne sais pas comment en stocker plusieur à la fois, comme dans un tableau, de manière à pouvoir y acceder par pointeur (meme si on ne parle pas d'adresse mémoire dans ce cas là)
Ca fait 2 jours que je me prend la tete sur ce problème alors si quelqu'un aurait une astuce, ça m'aiderait vraiment.

Merci d'avance,
Sylvain.

3 réponses

Messages postés
519
Date d'inscription
lundi 18 octobre 2004
Statut
Membre
Dernière intervention
28 février 2007
121
Ben
#define VALEUR1 0x25
#define VALEUR2 0x20

Il t'alloue de l'espace mémoire. Apres, oui, tu peux lui dire que VALEUR est, par exemple, un binaire, auquel cas il n'a pas besoin de stocker 00000001, mais juste 1.
De meme, un entier prend moins de place qu'une chaine, etc...
Penche toi sur les "int" "string" "bool", etc... tu trouveras ton bonheur chez google.

Je ne t'en dis pas plus, c'est loin, mes cours de prog d'µc...
salut StreM,

Le but est d'economiser la RAM et la taille du code du µC.
Si je fais:
char caract[10] = {0x10, ... , 0xE0};
Ceci prend de la RAM, et du code prog.

Si je fais:
#define VALEUR1 0x10
---
#define VALEUR10 0xE0
Ceci n'affecte pas la mémoire. C'est bien, mais ça ne me sert à rien.
parce qu'au lieu de faire:
Envoi_LCD(0x10);
...
Envoi_LCD(0xE0);

je ferai:
Envoi_LCD(VALEUR1);
...
Envoi_LCD(VALEUR10);

Et tout ça me prend beaucoup en taille de code. C'est redeondant
Je pense qu'il y a une autre solution, mais je n'arrive pas à trouver...

Merci quand meme
a+
Messages postés
488
Date d'inscription
vendredi 16 avril 2004
Statut
Membre
Dernière intervention
15 mars 2009
156
salut

Le préprocesseur n'économise pas de mémoire. Ce n'est pas un interpréteur. le C est un langage compilé !
Les #define ne sont ni des variables ni des constantes
la directive #define demande au compilateur de remplacer certaines chaines de caractères par certaines autres avant de commencer son travail (de compilation), comme on le ferait avec un traitement de texte pour rechercher / remplacer "toto" par "titi"
Un programme compilé ne contiendra que les valeurs numériques
corespondant à celles ecrites dans le source après traitement du préprocesseur. Il n'y a pas de gain de mémoire. Au contraire, le source occupera plus de place. Mais cela concerne l'éditeur du source, pas l'exécutable.
L'exécutable, lui, reste inchangé avec ou sans #define


par contre tu peux remplacer le type int par :

#define BYTE unsigned char

(de 0 à 255, ne prend que 8 bits)

cordialement
salut blurk,

Je suis d'accord avec ce que tu dis. Mais dans la mesure où une constante (0x20 par exemple ) n'utilise pas de place mémoire (ni RAM, ni EEPROM code) - je m'explique :
lorsque je fais
Envoi_LCD(0x20);
il n'y a que le saut au sous programme qui prend de la place (soit dans mon exemple 1 ou 2 instruction avec la gestion de l'argument).
Mais la constante 0x20 n'est stocké nulle part (a part dans la ram dynamique, elle sera effacée à la fin du sous programme).

C'est pour cela que je pense (et j'espère) qu'il est possible d'utiliser une suite de constante sans utiliser la mémoire.

Merci pour votre aide
Sylvain
Messages postés
488
Date d'inscription
vendredi 16 avril 2004
Statut
Membre
Dernière intervention
15 mars 2009
156
ayayaye si je ne me trompe pas,
je crois que le C va te mettre de l'integer par défaut
a+
bon ben je crois que je vais me resoudre à utiliser ma RAM ( je ne crois pas avoir dis qu'elle ne fait que 512 octets, en comptant la pile bien évidamment !).
De plus, j'ai vu sur le net quelques exemples de sources qui gère un ecran LCD et ils utilisent tous la RAM. C'est peut etre parce que l'on ne peut pas faire autrement.
Mais ça m'enerve quand meme parce que je suis sur que mon résonnement tient la route. C'est peut etre simplement que le #C ne le permet pas, mais ça ne veut pas dire que ce n'est pas possible lol.
Mais c'est vrai qu'un tableau d'étiquette pointé par un pointeur serai une bon Add-On au language (Et moi ça résoudrait mon problème).

Sur ce a+ et merci encore pour votre aide.
Sylvain