Continuité des variables en RAM ?

Bonjour à tous,

je viens de temps en temps demander de l'aide, quand j'ai essayé sans résultat :confused:

Voilà :

y a t-il un moyen d'imposer la continuité de quelques variables en RAM ? afin de pointer sur la première, et de faire une copie d'un bloc-mémoire vers un autre (copier un ensemble de variables d'un coup, sans les traiter une à une ?) C'est pour les sauvegarder en vitesse, lors de la détection de la coupure de courant...

Merci de votre aide !

Pour sauvegarder en cas de coupure, le mieux est de copier les variables dans l'eeprom.

Bonjour,

en c tu mets tes données dans un tableau et tu incrémentes dans le pointeur

on ne sait pas vers quoi tu veux sauvegarder, mais c'est peut-être un périphérique plus lent, ce qui fait que le temps supplémentaire dû à un accès aléatoire à la RAM (pléonasme) n'est pas critique

Bonjour,

Tu peux mettre tes variables dans une structure, tu peux ainsi les sauvegarder en bloc.

Bonjour,

mais une fois dans une structure, est-ce qu'elles auront un temps d'accès plus long (que si elles étaient traitées comme des variables naturelles ?) cette question n'a rien à voir avec ma question initiale, mais j'aimerais savoir...

Non le temps d'accès individuel sera le même mais tu peux les sauvegarder en bloc, ce qui sera plus rapide

struct SVar
{
  int variable1;
  byte variable2;
  char variable3[10];
};
SVar variables;

void sauve()
{
  EEPROM.put(0,variables);
}

D'accord, c'est clair, c'est ce qu'il me faut ; cependant, tu es sûr que le temps d'accès des variables n'est pas plus long ?

(je ne pinaille pas, j'essaye de bien comprendre) : au lieu d'accéder une variable 'naturelle' comme ceci:

VarNat = 55

je vais devoir écrire :

SVar.variable1=55

pour le processeur, ce n'est pas plus long ?

PatMax:
...afin de pointer sur la première, et de faire une copie d'un bloc-mémoire vers un autre (copier un ensemble de variables d'un coup, sans les traiter une à une ?) C'est pour les sauvegarder en vitesse, lors de la détection de la coupure de courant...

hihi
Hop une petite copie vite fait

Il existe certes des solutions de coding (la plus basique étant de déclarer un pointeur sur un char, lui affecter l'adresse de la première variable est de recopier la ram ailleurs sur une certaine taille, octet par octet en incrémentant le pointeur)

Mais ce n'est pas parce qu'il ne restera qu'une ligne de code pour tout copier, que le programme ira plus vite.
Il faudra toujours à peu près le même temps pour tout recopier.

PatMax:
SVar.variable1=55

pour le processeur, ce n'est pas plus long ?

Non car l'adresse de SVar.variable1 (en fait c'est variables.variable1) sera résolue à la compilation et non à l'exécution.

Alors c'est super, ça me va bien ; en réfléchissant, je me disais que ce pourrait être le compilateur qui faisait le travail de détermination de l'adresse, le processeur ne voyant qu'un accès à une adresse, sans savoir s'il s'agissait d'une variable 'nateurelle' ou incluse dans une structure.

merci beaucoup, merci bricoleau, merci trimarco

J'ai une autre question, j'ouvre un autre sujet; ce soir je vais avancer d'un pas de géant dans mon appli :slight_smile: merci les gars

Si on regarde le code généré, on vérifie que
variables.variable1=0; et variable1b=0; générent le même code:

 variables.variable1=0;
27e: 10 92 03 02 sts 0x0203, r1 ; 0x800203 <variables+0x1>
282: 10 92 02 02 sts 0x0202, r1 ; 0x800202 <variables>
 variable1b=0;
286: 10 92 01 02 sts 0x0201, r1 ; 0x800201 <_edata+0x1>
28a: 10 92 00 02 sts 0x0200, r1 ; 0x800200 <_edata>

Joli ! c'est parfait comme explication, c'est le même code, y'a pas photo ! je viens d'apprendre quelque chose. Comment fait-tu pour voir le code généré par le compilateur ?

Voir ici

Ce ne serait pas forcément vrai avec la seconde entrée de la structure si ce n’est pas une variable globale - à vérifier ce que font les compilos de nos jours