Pages: [1]   Go Down
Author Topic: RAM Esaurita  (Read 838 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 31
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Salve a tutti sto usando una asyclab Wishield e vorrei prendere i dati di configurazione da una micro-sd, il problema è che a quanto pare esaurisco la ram e l'arduino si resetta, la funzione freeMemory() mi restituisce -107, ci sono soluzioni per gestire la ram diversamente? ad esempio prima usarla per leggere dalla sd, poi liberarla ed usarla per la connessione!
Logged

Genova
Offline Offline
Faraday Member
**
Karma: 17
Posts: 2742
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

hai 256k ... come fai a non fartela bastare?
A proposito la mia auto è in riserva... quanti Km potrò ancora fare? devo andare fino a là smiley
« Last Edit: October 17, 2012, 07:48:17 am by pablos » Logged

Meglio imparare dalle cose inutili piuttosto che non imparare niente.   [Arduino Mega R3 + Ethernet shield W5100 + SD card 8Gb FAT32]

Offline Offline
Newbie
*
Karma: 0
Posts: 31
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Scusami ma quì (Arduino Uno) mi dice che ne ha 2K, anche la funzione "freeMemory()" sembra confermarlo
Logged

Genova
Offline Offline
Faraday Member
**
Karma: 17
Posts: 2742
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Scusami ma quì (Arduino Uno) mi dice che ne ha 2K, anche la funzione "freeMemory()" sembra confermarlo

Bravo era proprio la risposta che aspettavo, ora hai detto che arduino possiedi, però servirebbe qualche dato in più per sapere che informazioni devi gestire e come snellire l'uso della memoria ... non è detto che per quello che vuoi fare arduino uno sia sufficiente.
Puoi postare qualche pezzo per vedere come prelevi i dati dalla SD, vedere quali configurazioni vuoi prelevare?

ciao
« Last Edit: October 17, 2012, 08:53:03 am by pablos » Logged

Meglio imparare dalle cose inutili piuttosto che non imparare niente.   [Arduino Mega R3 + Ethernet shield W5100 + SD card 8Gb FAT32]

Offline Offline
Newbie
*
Karma: 0
Posts: 31
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Dunque praticamente faccio delle letture di potenza ogni minuto, a partire da questo progetto: Open Energy Monitor
poi mi connetto ad internet tramite Wishield ed invio le letture su un mio sito. Fin quì tutto in ordine, adesso però vorrei inserire i dati di configurazione della connessione in una sd card a caricarli da li!

Code:
#include <SD.h> //SD card functions
#include <WiServer.h>
#include "EmonLib.h"             // Include Emon Library
#include <MemoryFree.h>

#define DEBUG 1

// Definizione Parametri Rete Wireless
#define WIRELESS_MODE_INFRA 1  // Infrastrutturata (basata su Access Point)
#define WIRELESS_MODE_ADHOC 2  // Ad-hoc (senza Access Point)

....VARIABILI PER LA CONNESSIONE....

// Richiesta GET
GETrequest sentDataTo (site_ip, 80, "www.riggivale.eu", "/em/api/post?apikey=ba87740e20a5fed755441c429636bbde&json={power:567.89,import:515.53}");
 
// Variabile segna tempo per attendere per nuovi invii di dati
long updateSearch = 0;

const int chipSelect = 4;

EnergyMonitor emon1,emon2;
 
// Inizializzazione Scheda
void setup() {
  // Inizializzo porta seriale
  Serial.begin (9600);

  WiServer.enableVerboseMode (true);
 
  Serial.print("freeMemory()=");
  Serial.println(freeMemory());
  WiServer.init (NULL);
  Serial.print("freeMemory()=");
  Serial.println(freeMemory());

  emon1.current(4, 30);       // Current: input pin, calibration. 
  emon2.current(5, 30);       // Current: input pin, calibration.
}

// Programma Principale
void loop() {
  // Se passato periodo di attesa esecuzione ricerca
  if ( (millis() - updateSearch) >= 60000 ) {
    Serial.print("freeMemory()=");
    Serial.println(freeMemory());
 
    double Correnterms = emon1.calcIrms(1480);  // Calculate Irms
    double Correnterms2 = emon2.calcIrms(1480);  // Calculate Irms
   
    if (!WiServer.connection_up()){ //Se disconnesso tenta nuova connession prima di inviare i dati
       WiServer.init (NULL);
    }
   
    // Calcolo dell'url per l'invio della potenza importata ed esportata
    char percorso[150];
    double p =Correnterms*230.0;
    double p2 =Correnterms2*230.0;
    char tmp[10],tmp2[10];
    dtostrf(p,1,2,tmp);
    dtostrf(p2,1,2,tmp2);
    sprintf(percorso,"/em/api/post?apikey=ba87740e20a5fed755441c429636bbde&json={power:%s,import:%s}",tmp,tmp2);
    Serial.println(percorso);
 
    sentDataTo.URL = percorso;
    // Inizializzazione richiesta GET (parametro indica funzione a cui verra' passata la risposta)
    sentDataTo.setReturnFunc (NULL);
    if (WiServer.connection_up()){ // solo se connesso
      // Invio dei dati
      sentDataTo.submit();
    } 
    Serial.print("freeMemory()=");
    Serial.println(freeMemory());
    // Aggiorno tempo di riavvio (attensa di 1 minuto)
    updateSearch = millis();
  }
  // Avvio WiServer
  WiServer.server_task();
  // Attesa
  delay(10);
}

La semplice inclusione della SD.h si mangia tutta la memoria rimasta e al momento di inviare i dati ne mangia ancora di più e l'arduino si resetta
Logged

0
Online Online
Shannon Member
****
Karma: 117
Posts: 10102
:(){:|:&};: TOX id: fcb8e918bef08581e23f6ddf9d4dba77697c25b217bf372736ed959a95fde36df5b8c5b90fbb
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

a quanto pare sono le libreri che ti ciucciano tutta la ram. In particolare mi sa che la colpa è di WiServer.

prova a vedere con degli sketch a parte quanta RAM ti ciuccia ogni libreria, e vediamo se riusciamo a fare qualche taglio per farci stare tutto.
Logged

my Arduino code: https://github.com/lestofante/arduinoSketch
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Offline Offline
Newbie
*
Karma: 0
Posts: 31
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Allora:
Libreria                 Memoria Libera  -  Occupata
EmonLib.h      ->   freeMemory()=1376  = 672
SD.h              ->   freeMemory()=1065  = 983
WiServer.h      ->  freeMemory()=685    = 1363
MemoryFree.h ->   freeMemory()=1824  = 224

Mi chiedevo se esista una versione light della sd.h, tanto mi interesserebbero solo le funzioni di lettura
Logged

Genova
Offline Offline
Faraday Member
**
Karma: 17
Posts: 2742
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
Mi chiedevo se esista una versione light della sd.h, tanto mi interesserebbero solo le funzioni di lettura

viene compilata solo la parte della libreria che usa lo sketch, la restante parte no
Se tu metti  #include <SD.h> ma nessuna istruzione la richiama, la memoria occupata dalla lib è 0

il problema non sono solo le librerie, i char che andrai a leggere dovrai ben metterli su un buffer in memoria, variabili varie ecc
Sei troppo limitato con 2K  smiley-roll
Logged

Meglio imparare dalle cose inutili piuttosto che non imparare niente.   [Arduino Mega R3 + Ethernet shield W5100 + SD card 8Gb FAT32]

0
Online Online
Shannon Member
****
Karma: 117
Posts: 10102
:(){:|:&};: TOX id: fcb8e918bef08581e23f6ddf9d4dba77697c25b217bf372736ed959a95fde36df5b8c5b90fbb
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

no, come ho spiegato esistono già dei buffer interni alla libreria E interni ai moduli, quindi puoi anche leggere carattere per carattere.
Se la libreria che usi è quella asynclab sappi che mi è appena arrivata la shield, e sicuramente inizio a tagliuzzarla un po', nei prossimi giorni
Logged

my Arduino code: https://github.com/lestofante/arduinoSketch
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Offline Offline
Newbie
*
Karma: 0
Posts: 31
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

si è della asynclabs
Logged

Genova
Offline Offline
Faraday Member
**
Karma: 17
Posts: 2742
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
no, come ho spiegato esistono già dei buffer interni alla libreria
come hai spiegato dove?

@Lesto
viene compilata solo la parte della libreria richiamata da istruzioni dello sketch o non è così nella norma?
adesso puoi spiegare...
Logged

Meglio imparare dalle cose inutili piuttosto che non imparare niente.   [Arduino Mega R3 + Ethernet shield W5100 + SD card 8Gb FAT32]

0
Online Online
Shannon Member
****
Karma: 117
Posts: 10102
:(){:|:&};: TOX id: fcb8e918bef08581e23f6ddf9d4dba77697c25b217bf372736ed959a95fde36df5b8c5b90fbb
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

nell'altra discussione di Skateman...

sì, di norma viene compilata solo la parte usata, ma queste non sono librerie ma classi e quindi la storia è un po' più complessa. Sicuramente le variabili globali vengono incluse, se usate ( iìe i buffer lo sono)
Logged

my Arduino code: https://github.com/lestofante/arduinoSketch
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Pages: [1]   Go Up
Jump to: