[Résolu] Ajouter de la sdram arduino mega

Bonjour,

J'ai réalisé un petit web automate (aquarium), j'ai un tableau dynamique de plus 800 caractères et ma sdram arrive à saturation, j'ai plusieurs gros tableau dynamique que j'aimerais mettre en sdram extern.

Quel type de sdram me conseillez vous? point de vu vitesse de transmition etc...

J'ai trouvé ça QuadRAM — Rugged CircuitsRugged Arduino

Qu'en pensez-vous?

Un petit Up :smiley:

Aucune idée concernant les modules en question vu que je n'en n'ai jamais eu besoin.
Toute fois, 800 charactéres ne me parait pas énorme...

Comment sont ils stockés? Y a t'il moyen d'avoir un échantillon de code?

Ok pour le code, si l'on peut optimisé je suis partant. Je dirais même plus je demande que ça :grinning:

z_sendReceiveData.ino (40.4 KB)

up :grinning:

Désolé j'avais pas vu ta réponse. J'ai pas eu le temps d'étudier ton scketch (les fonctions sont trop longues, c'est dure a suivre).

Du coup je vais te donner des pistes pour résoudre ça:

Premièrement évite d'allouer dynamiquement de la mémoire. C'est arduino, la capacité est faible donc moins on fait de choses dynamiques, mieux c'est (j'ai pas vu de malloc n de new, mais je le rapelle au cas ou)

Je vois que tu stocke beaucoup dans l'EEPROM. Est-ce nécessaire? N'oublie pas qu'une EEPROM s'use vite et ne doit donc être utilisée que pour stocker les données qui doivent survivre au reboot (configuration uniquement quoi).

Le programme est trop complexe pour en tirer quoi que ça soit. Essaye de le découper et d'activer des parties une par une pour savoir d'ou viens l'utilisation de la mémoire.

En tout cas pour moi, mis a part le buffer de 550, il n'y a rien qui peut poser problème. Sauf que je viens de tester sur le mien et ça passe. Essaye de baisser la taille a 512 pour voir si le compilateur t'offre une optimisation (les tailles devraient toujours être des puissances de deux).

Voila, désolé c'est pas évident mais j’espère t'avoir un peu aidé.

Merci pour ta réponse.

Dans mon eeprom, je stock seulement des paramètres modifiable par interface web.

Tout ces paramètres on lieu d'être et devrait doublé à l'avenir pour arriver à la fin du projet.

J'ai réellement travaillé sur l'optimisation du projet, j'aimerais vraiement réussir à utilisé cette extension de RAM

Apparement il n'y a pas de librairie à ajouter pour l'utiliser et la sram est mapper automatiquement BIZARRE ça?

The QuadRAM Shield includes the following features:

512 kilobytes of external zero-wait-state SRAM
SRAM directly mapped into microcontroller address space-no serial I2C interface required, no libraries needed
Compatible with Arduino MEGA or MEGA2560 (or other compatible boards), Rugged Circuits Rugged MEGA
Powered directly from Arduino- no additional power supply required

Mais lorsque je regarde les exemple d'utilisation ça ma pas l'air si simple que ça à utilisé, en tout cas je comprend pas grand chose.

Pour simplifier je vous poste le résumé de mon code:

*/ Voici mon fameux tableau que je voudrais mettre en SRAM externe /*

  define DATA_SIZE               550               // Taille du buffer de contruction des donnees
  char data[DATA_SIZE];                           // Buffer non trier (cellule vide + cellule remplit)

  // On initialise notre tableau data
  memset(data, 0, DATA_SIZE);


*/ Ici je remplit mon tableau /*
 // Sonde de temperature
      strcat(data, "&temp1=");
      floatTo2TabChar(heating1, data);
      [... ici environ 100 fois les 2 lignes ci-dessus...]
      strcat(data, "&hygro1=");
      intToTabChar(hygrometry, data);



*/ Ici ma fonction supprime les données vide de mon tableau data et le découpe en 64 caractères pour l'envoyer via le wifi à mon serveur web
Note: cela me permet de divisé par 3 le temps d'envois des données (techniquement je sais plus la raison)/*
wifiSendData(data);

    client.flush();
    client.stop();

Le détail sur mes 2 fonctions utilisé ci dessus :

void intToTabChar(int nbr, char data[])
{ 
  int DATATMP_SIZE = 6; //6
  char dataTmp[DATATMP_SIZE];
  memset(dataTmp,0,DATATMP_SIZE);
  itoa(nbr,dataTmp,10); // radix: 2=binary "10=decimal" 16=hexadecimal
  strcat(data,dataTmp);
}

void floatTo2TabChar(float number, char data[])
{
  int DATATMP_SIZE = 8; //8 //Valeur la plus longue (-127.00) 
  char dataTmp[DATATMP_SIZE];
  // On rempli notre tableau de caractere NULL
  memset(dataTmp,0,DATATMP_SIZE); 
  // On met la partie antiere du nombre dans le tableau
  itoa (int(number), dataTmp, 10);// radix: 2=binary "10=decimal" 16=hexadecimal
  strcat(data,dataTmp);
  // On recupere la partie decimal
  number -= int(number); // On soustrait le nombre par son entier
  number *= 100; // On multiplie *100 les décimales
  // On ajoute le point de separation des antiers de la decimal
  strcat(data,"."); 
  // On met la partie decimal du nombre dans le tableauf
  memset(dataTmp,0,DATATMP_SIZE); 
  itoa (int(number), dataTmp, 10); // radix: 2=binary "10=decimal" 16=hexadecimal
  strcat(data,dataTmp);
}

Ici les exemples d'utilisation du module, si cela parle à quelqu'un pourriez vous m'aiguillez?

Merci d'avance!

[/code]

La solution simple que je vois c'est d'utiliser client.flush() plutôt que ta routine pour éviter le dépassement de buffer, et donc de tout stocker dans un tableau de 550 octets.

A j'ai trop synthétisé du coup, je fais déjà:

client.flush();
client.stop();

Ma routine me permet juste de découper en 64 caractères l’envoie des données via wifi, il se trouve que c'est plus rapide, mais n'est en aucun cas le point bloquant.

En faite je n'arrive pas à augmenter mon tableau à plus de 550 car sinon plantage.

j'utilise cette fonction pour controler la RAM

// Informe sur la quantitee de ram utilisee
void usedRam()
{ 
#ifdef DEBUG_INFO  
  if (freeMemory() != prevFreeMemory) 
  {
    prevFreeMemory = freeMemory();

    // Controle de la memoire Flash
    Serial.print(F("-> Ram disponible: "));
    Serial.print(freeMemory());
    Serial.println(F(" octets / 8000 octets"));
    Serial.println();
  }
#endif
}

Voilà ce que me dit le compilo:

Le croquis utilise 53 618 octets (21%) de l'espace de stockage de programmes. Le maximum est de 253 952 octets.
Les variables globales utilisent 2 146 octets (26%) de mémoire dynamique, ce qui laisse 6 046 octets pour les variables locales. Le maximum est de 8 192 octets.

Et voilà ce que me dit ma fonction usedRam():

Avant la creation du tableau de 512 caracteres
-> Ram disponible: 5441 octets / 8192 disponnibles

Test ram apres client flush et stop
-> Ram disponible: 6008 octets / 8192 disponnibles

Alors je suis full ou pas? Moi je pense que je suis full?!

Donc c'est pour cela que j'ai déjà en possession la carte d'extension de 512K RAM, ce que je voudrais, c'est un coup de pousse pour la mise en service.

Voici le code d'exemple qu'il me propose pour utiliser cette carte: http://www.rugged-circuits.com/s/RAMTest.pde

Eh bien ça fait 6 mois que je bloque sur le problème et juste en mettant à jour drivers et logiciel, je suis arrivée à mes fins.

Cela fonctionne et j'ai même réussit à augmenté mon tableau à 4096 et il me reste 1895 octets de libre en sram!

Merci à tout les participants!