Script troppo grande

Ho realizzato uno script che supera i 32K.
Come faccio a ridurlo? Ci sono tecniche particolari?
E' possibile dividerlo in qualche maniera?

Grazie

Non è facile superare i 32k con uno sketch, deve essere di molte centinaia di righe per riuscirci, a meno che non utilizzi progmem per inserire dati nella flash, in questo caso diventa "facile" sforare la memoria a disposizione.
Hai solo due possibilità o tagli parte dello sketch e/o riduci i dati posti nella flash oppure passi ad Arduino MEGA2560.

In effetti lo script è lungo circa 400 righe.
Qualche domanda su Arduino Mega 2560.
Gli script sono compatibili?
La Ethernet Shield è compatibile?

Grazie

erpomata:
In effetti lo script è lungo circa 400 righe.

400 righe non bastano per occupare 32k, al massimo arrivi attorno ai 10k se usi funzioni che richiedono molta flash, tanto per darti un esempio pratico il software MultiWii v2 sono oltre 2000 righe effettive e occupa meno di 18k.
Non è che hai inserito molti messaggi testuali tramite la serial.print ? Questa è una cosa che può consumare molta memoria.

Qualche domanda su Arduino Mega 2560.
Gli script sono compatibili?
La Ethernet Shield è compatibile?

Ovviamente si, gli sketch basta ricompilarli per questa scheda, la eth la monti sopra allo stesso modo della UNO/2009.

Bè uso SD, Ethernet e RTC però non uso molto la serial print.
Magari appena posso posto lo script

codice, non script..
la differenza è che il codice va precompilato, gli script sono interpretati.
giusto per completezza

Si ho sbagliato io, scusa

Chiedi a DanielaES. Ha limato i singoli byte per comprimere il suo codice in 32k. :smiley:

Chi è il solito che ha fatto notare che un boolean occupa comunque un byte?

erpomata:
Come faccio a ridurlo? Ci sono tecniche particolari?

Se proprio sei con l'acqua alla gola puoi davvero provare ad ottimizzare lo spazio che occupano le variabili. Come ha già fatto notare PaoloP.

P.S. Qui Arduino Forum ne hanno discusso un po'

una cosa e' la flash una cosa e' la ram
nel link si parla di come risparmiare ram

lesto:
codice, non script..
la differenza è che il codice va precompilato, gli script sono interpretati.
giusto per completezza

Ci sono alcune differenze da considerare. Per esempio i pin del I2C tra Atmega328 e 2560 sono diversi.
Ciao Uwe

IngHooch:
Chi è il solito che ha fatto notare che un boolean occupa comunque un byte?

Cos'era, una domanda o un'affermazione? :wink:
Perché nel mondo dei microcontrollori, o per meglio dire del loro compilatore, i boolean occupano 1 byte.

Eccomi con un pò di ritardo.
Lo allego perchè è troppo lungo da mettere nel topic.

codice.txt (11.6 KB)

Ho aggiunto una riga al tuo codice:

#include <EthernetUdp.h> // New for IDE 1.0

e l'ho compilato con l'IDE 1.0.
Esce fuori uno sketch di 33140 bytes.
In effetti bisogna limare qualcosa.

Nel file del core di Arduino IPAddress.cpp è già presente la funzione per stampare gli IPAddress:

size_t IPAddress::printTo(Print& p) const
{
    size_t n = 0;
    for (int i =0; i < 3; i++)
    {
        n += p.print(_address[i], DEC);
        n += p.print('.');
    }
    n += p.print(_address[3], DEC);
    return n;
}

prova a rimuoverla e sostituirla.

Dovresti cercare di eliminare la classe string. E' un mattone.

EDIT: Non mi è chiara un'altra cosa.

void loop()
{
  double temp;
  String data;
  String readString = "";
  unsigned long i;
  char clientline[BUFSIZ];
  int index = 0;

  i++;
  if ( i == 900000){
    logTemp();
    i=0;
  }

Nel loop inizializzi i, poi lo incrementi e speri che quando sara pari a 9000000 logghi.
Secondo me non funziona. Devi usare una variabile globale.
Lo stesso dicasi per Temp e Data che non sono utilizzati nel loop.

Paolo.

p.s. Forse sono anche i double ad incrementare la dimensione dello sketch

codice.ino (11.7 KB)

PaoloP:
Lo stesso dicasi per Temp e Data che non sono utilizzati nel loop.

E così dicasi per index.

p.s. Forse sono anche i double ad incrementare la dimensione dello sketch

Double è un alias per float, non c'è differenza per l'Arduino. Sono sempre numeri in virgola mobile a 4 byte. Casomai c'è da chiedersi l'utilità di questo tipo di dati.

Taglia e incolla.... sono arrivato a 32642 bytes. :grin:
Serve ancora un po' di ingegno.

Togli il check per controllare se l'IDE è 1.0 nella funzione getNtpTime, tanto hai già dato per scontato che stia usando la 1.0 visto che gli hai messo l'include in cima e salvi in formato .ino
Riduci i messaggi testuali, sono stringhe che vengono memorizzate comunque in Flash quando viene creato il firmware. ad esempio in setup() c'è "inizializzazione SD fallita": basta mettere "Init SD error"

32486 bytes.
Ho fatto talmente tanti cambiamenti che non sono più sicuro che possa funzionare. :sweat_smile:

TempLogger.ino (12.1 KB)