Go Down

Topic: [RESOLU] Optimisation code _ Mon arduino Uno plante.....plus! (Read 1 time) previous topic - next topic

john_lenfr

#5
Feb 27, 2013, 10:20 am Last Edit: Feb 27, 2013, 10:30 am by john_lenfr Reason: 1
Bonjour  skywodd
Quote
Ton problème actuellement c'est que tu utilises mal ta mémoire RAM.
Tu gaspilles inutilement le peu de ressource dont tu disposes ...

Oui je sais pas programmer, j'essaye de m'inspirer de ce qui traine sur la toile mais je n'ai pas vraiment de bases solides  :smiley-mr-green:

J'avais testé d'afficher la RAM dispo avec freeRAm et je suis aux alentours de 127-147. Ce n'est pas suffisant?

Quote
- N'utilise pas de const String mais des char[] en mémoire flash (macro F("..."))

Tu as un exemple de déclaration?
Je dois faire : char[]= F("TEST"); ?
Quote
--> Toutes tes chaines de char constantes doivent être en flash !

Comment je les mets en flash? toujours avec le F("...") ?
Quote
- N'utilise jamais String, c'est une saloperie sans nom

A la place de string je mets quoi?
Quote
- remplace tes if(c=='x') else if (c=='y') ... par un switch/case

ça ok je vais essayer
Quote
- ne stock pas en mémoire RAM le html, envoi le html directement morceaux par morceaux

Comment je procède pour faire ça?
Quote
- Wire.print(int) existe, pas besoin d'utiliser itoa() et d'avoir un buffer en mémoire

Peut-être que le Wire.print ça fonctionne mais moi j'ai fait un Wire.write, pour lequel cela ne fonctionne pas.
J'ai essayé hier soir un Wire.write(i) le problème c'est que je reçois un caractère bizarre de l'autre coté (sur la Nano en réception)
Quote
- choisi au mieux tes types, pas besoin d'un int pour une variable >=255, un byte suffit

Tu veux dire si l'int est <=255? je déclare byte i=0; ?

Ce qui est bizzare c'est que quand je zappe une partie du code, le reste fonctionne, donc je pensais que c'était plutot du à un manque de mémoire morte (là ou on stoke le programme compilé) plutot que vive non?

J'ai remarqué également que je ne peux pas faire de débug, car je n'arrive pas à utiliser Serial.begin et Serial.print ...
Est-ce que c'est à cause de l'ethernet qui utilise déjà le TX-RX?

skywodd


J'avais testé d'afficher la RAM dispo avec freeRAm et je suis aux alentours de 127-147. Ce n'est pas suffisant?

Vu le code je dirai que non, c'est un cas typique de manque de RAM.
(et comme par hasard le code utilise des String, coïncidence ? Je pense pas ...)


Tu as un exemple de déclaration?
Je dois faire : char[]= F("TEST"); ?

Code: [Select]
const char[] toto PROGMEM = "toto" ;
http://www.arduino.cc/en/Reference/PROGMEM

Mais en y regardant bien tu utilises ces constantes qu'une seule fois ... c'est donc inutile de les rendre globales ...
Fait directement un F("le texte du bouton") dans le client.print() qui va bien.


Comment je les mets en flash? toujours avec le F("...") ?

Avant :
Code: [Select]
Serial.println("toto");
Aprés :
Code: [Select]
Serial.println(F("toto"));


A la place de string je mets quoi?

Des tableaux de char classique, comme devrais le faire tout bon développeur sur microcontrôleurs.
Au moins ça t'oblige à faire un code structuré, pas des trucs du genre HTMLmachin += "
....", avec des String de partout ...


Comment je procède pour faire ça?

Tu fait tes client.print() au moment où tu veut envoyer les info au lieu de les stocker en RAM puis de tout envoyer d'un coup.

Avant :
Code: [Select]
ChaineHTML = "<TD><FORM METHOD='GET' ACTION='/a'><INPUT TYPE='submit' VALUE='";
ChaineHTML += libelleBoutonAOn;
ChaineHTML += "' ></FORM></TD>";


Aprés :
Code: [Select]
client.print(F("<TD><FORM METHOD='GET' ACTION='/a'><INPUT TYPE='submit' VALUE='"));
client.print(F("le texte du bouton"));
client.print(F("' ></FORM></TD>"));



Peut-être que le Wire.print ça fonctionne mais moi j'ai fait un Wire.write, pour lequel cela ne fonctionne pas.
J'ai essayé hier soir un Wire.write(i) le problème c'est que je reçois un caractère bizarre de l'autre coté (sur la Nano en réception)

Faire un Wire.write(tableau, taille) d'un tableau de char revient à faire un Wire.print(), en moins bien.
Faire un Wire.write(pointeur) revient à envoyer l'adresse du pointeur ... c'est pas du tout ce que tu veut ;)

Tu ne sembles pas encore faire la différence entre envois binaire et envois textuel.
Regarde "ASCII CODE" sur google tu comprendras pourquoi tu reçois des trucs bizarre ;)


Tu veux dire si l'int est <=255? je déclare byte i=0; ?

Ben oui ...
Si tu as besoin de garder 100ml d'eau tu prend pas une bassine ?
Pareil en programmation si tu veut stocker une valeur <=255 tu prends un byte, ça suffit.


Ce qui est bizzare c'est que quand je zappe une partie du code, le reste fonctionne, donc je pensais que c'était plutot du à un manque de mémoire morte (là ou on stoke le programme compilé) plutot que vive non?

Si tu manquais de ROM le compilateur t'enverrais chier en te disant que la section ".text" de ton programme ne passe pas en mémoire.
Même en forçant le compilateur (enfin le linker pour être précis) l'upload ne fonctionnerai pas, lors de la vérification il y aurait forcément une erreur.
C'est donc forcément un problème de RAM ;)
Des news, des tuto et plein de bonne chose sur http://skyduino.wordpress.com !

john_lenfr

#7
Feb 27, 2013, 10:48 am Last Edit: Feb 27, 2013, 11:24 am by john_lenfr Reason: 1
Ok, je sens que je suis pas couché ce soir en rentrant du boulo  :smiley-mr-green:

En tout cas ça me rassure que c'est du à la RAM, ça veut dire que je vais pouvoir réussir l'ensemble du code en optimisant!

john_lenfr

#8
Feb 27, 2013, 10:07 pm Last Edit: Feb 27, 2013, 10:09 pm by john_lenfr Reason: 1
Bonsoir skywodd,

j'ai fait tout ce que tu m'as dit et le programme ne plante plus.

C'est impressionant! je suis à 1070 de freeRAM maintenant!!
Comparé aux 127-147 ya pas photo!

Merci pour les conseils, du coup je vais pouvoir rajouter des choses  :smiley-mr-green:

Une ptite vidéo pour voir à quoi ça ressemble ici: http://www.youtube.com/watch?v=K0RaXOwCkpo

Il n'y avait pas encore l'implémentation du NTP et DST mais le principal y est.

skywodd


j'ai fait tout ce que tu m'as dit et le programme ne plante plus.

C'était donc bien un problème de mémoire RAM insuffisante.


C'est impressionant! je suis à 1070 de freeRAM maintenant!!
Comparé aux 127-147 ya pas photo!

C'est la magie de l'optimisation :smiley-mr-green:
Tu as du aussi gagner un peu de place en mémoire flash (mais pas autant qu'en RAM).

Ps: publie ton code "âpres optimisation" que cela puisse servir d'exemple aux prochains lecteurs de ce topic ;)
Des news, des tuto et plein de bonne chose sur http://skyduino.wordpress.com !

Go Up