Dimensione sketch e freeRam

Ciao a tutti vi espongo il mio problema:

ho realizzato uno sketch che pilota una matrice 16x16 di led WS2812B (è una versione estesa dell'italian word clock) ma ho notato che se la dimensione dello sketch supera una certa percentuale il programma viene caricato sull'Arduino nano ma poi non va in esecuzione.

Mi spiego meglio:

Sketch uses 10998 bytes (35%) of program storage space. Maximum is 30720 bytes.
Global variables use 1050 bytes (51%) of dynamic memory, leaving 998 bytes for local variables. Maximum is 2048 bytes.

e la funzione freeRam ritorna 212 tutto funziona bene.

Mentre se passo la percentuale del 41% di storage space used la freeRam ritorna 888 il caricamento va a buon fine ma il programma non viene eseguito

Sketch uses 12730 bytes (41%) of program storage space. Maximum is 30720 bytes.
Global variables use 1144 bytes (55%) of dynamic memory, leaving 904 bytes for local variables. Maximum is 2048 bytes.

La funzione freeRam è

int freeRam() {
  extern int __heap_start, *__brkval;
  int v;
  return (int)&v - (__brkval == 0 ? (int)&__heap_start : (int)__brkval);
}

Ho controllato il codice ed eseguito commentando dei pezzi per ridurre lo spazio usato e indipendentemente dalla porzione che commento se supero il 41% non viene eseguito se sono sotto si.

Scheda Arduino Nano, IDE Arduino Pro IDE.

Non riesco a capire cosa mi sta sfuggendo :angry: :angry: :angry:

Qualche idea su cosa e/o come dovrei muovermi?

Grazie!

... senza vedere il programma, difficilmente qualcuno potrà risponderti.

Guglielmo

Francamente, viste le percentuali di utilizzo delle risorse riportate dal compilatore, non credo che il problema sia nell'utilizzo della memoria più o meno esteso.

Ma come giustamente dice Guglielmo, senza vedere quello che combini con il software si tratta solo di speculazioni.

P.S.
Se pensi possa esserti utile, ne ho realizzato una versione anche io con più o meno lo stesso hardware (ma la matrice è 12x12).
Trovi tutto qui cotestatnt/yet-another-wordclock

Scommettiamo che l'oggetto usato dallo OP ( o la struttura, array, o lista qualunque forma abbia) che descrive larray di neopixel è locale o allocato dinamicamente?

Questo sballerebbe di almeno 768 byte l'occupazione di memoria...

Standardoil:
Scommettiamo che...

Io scommetto su un buffer overflow o un meccanismo simile :smiley:

Non sappiamo se la nano sia originale o clone, magari risulta fallato il micro...

In alleato lo sketch.

speedyant:
Non sappiamo se la nano sia originale o clone, magari risulta fallato il micro...

Ho provato con due Nano prima di postare giusto per essere sicuro.

EDIT:

Ho fatto una modifica alla parte di print su LCD ovvero ogni istruzione:

lcd.print("/");

è stata cambiata in:

lcd.print(F("/"));

In questo modo il programma sta girando.

Immagino che si sia anche altro che non ho gestito con i dovuti criteri

ExtendItaWordClock.ino (18.6 KB)

Credo sia un problema di frammentazione della ram. Infatti stai "spostanto" le costanti in flash.

In effetti è uno sketch "mangia ram"...
Anche tutti gli array che definiscono la posizione delle parole sono un notevole "spreco": come minimo potresti dimezzare l'utilizzo di memoria usando dei byte al posto di int, ma l'ideale sarebbe mettere anche quelli in flash visto che sono costanti (PROGMEM).

Io però ho provato a compilare e far girare su un nano peggiorando ulteriormente la situazione aggiungendo un println della data sulla seriale e sta funzionando senza problemi. Rimane pochissima RAM libera (appena 119 byte), però costante.
E' vero che non c'è LCD e matrice connessa, ma in teoria essendo dei dispositivi solo di output non dovrebbe cambiare nulla credo.

Che versione di Arduino IDE stai usando?

C'è poi questa riga che non mi convince proprio per nulla

 for (int i = 0; i < strip.numPixels() + 1; i++) {
    if (arrWord[i] == -1) {

Fai un ciclo for che itera 257 volte (perché il +1 poi?), su degli array che hanno dimensione massima di 14 elementi.
Perché non calcoli semplicemente la lunghezza dell'array con sizeof()?

Infine, secondo me potevi fare a meno dell'lcd (che rimane nascosto?) ed usare la matrice di led stessa per il set dell'orario.

Causa lavoro non sono più riuscito ad aggiornare il thread ::slight_smile:

Che versione di Arduino IDE stai usando?

arduino-pro-ide 0.1.2

Il tutto ora funziona correttamente: ho lavorato con funzione F() ed è bastato.

Sicuramente è possibile fare delle migliorie come l'uso di sizeof() e di PROGMEM 8)
In caso che qualcuno fosse interessato al codice o ad altre info sono a disposizione.

Appena finisco di realizzare box in legno e stampe posto le foto 8)

Perché non usare l'ide "normale"?

Sicuramente la funzione di intellisense (che non è presente in quello "normale" oppure che io non sono in grado di attivare), la correzione della sintassi, e in fine la modalità scura.

Quando ho fatto la scelta di usare il pro ho letto che ha molte caratteristiche che con l'aumentare della complessità dei progetti tornano utili come la gestione delle librerie e dei file esterni, debug etc...

La scelta è stata fatta in ottica futura, sicuramente per questo sketch bastava la versione normale.

mttony:
Sicuramente la funzione di intellisense (che non è presente in quello "normale" oppure che io non sono in grado di attivare), la correzione della sintassi, e in fine la modalità scura.

Io uso Visual Studio Code per queste ragioni (ma anche per altre)..
Arduino Pro l'ho provato ma secondo è ancora troppo "immaturo" per l'utilizzo di tutti i giorni (del resto è ancora un'alfa se non ricordo male).

Si alfa, qualche giorno fa hanno rilasciato la versione 0.1.3 se vuoi buttare un occhio.

mttony:

Maximum is 30720 bytes.

Uhmm... Perché non sono 32256?

Forse il bootloader "vecchio".

Ho provato a usare byte al posto degli int, ma è cambiato poco nella memoria occupata. Molto stranamente, poi, usando gli apici singoli al posto delle virgolette per i caratteri singoli, l'occupazione in RAM è rimasta uguale e quella in flash è aumentata parecchio!
Da lcd.print (":"); a lcd.print (':'); aumenta di 28 byte!

Datman:
Uhmm... Perché non sono 32256?

Perché quelli sono quelli disponibili, il resto sono già occupati da altre cose.

Guglielmo

Altre cose?... Perché sul mio IDE le "altre cose" non ci sono?

Datman:
Altre cose?... Perché sul mio IDE le "altre cose" non ci sono?

E che ne so io ... fatti tuoi ... :stuck_out_tongue_closed_eyes: :stuck_out_tongue_closed_eyes: :stuck_out_tongue_closed_eyes: :stuck_out_tongue_closed_eyes: :stuck_out_tongue_closed_eyes:

Guglielmo