Errore durante la compilazione

Buona sera,
per cortesia vorrei un consiglio.
Sto scrivendo uno sketch per Arduino Mega, che è abbastanza lungo.
A forza di aggiungere funzioni, la compilzione ha cominciato a dare questo messaggio:
Lo sketch usa 43574 byte (17%) dello spazio disponibile per i programmi. Il massimo è 253952 byte.
Le variabili globali usano 6190 byte (75%) di memoria dinamica, lasciando altri 2002 byte liberi per le variabili locali. Il massimo è 8192 byte.
Poca memoria disponibile, potrebbero presentarsi problemi di stabilità

Una delle funzioni è una serie di Serial.println che stampano in sequenza alcune linee con delle istruzioni per l’operatore.
Riporto la funzione con dimensioni reali, anche se cambio il contenuto con tutti caratteri . (punto)


void TypeInstructions(void){
    Serial.println();      
    Serial.println("..................................");
    Serial.print("|............................");  Serial.println(Version);      
    Serial.println();
    Serial.println("...........");
    Serial.println("........................");
    Serial.println("................");
    Serial.println("................................*");
    Serial.println(".........................");
    Serial.println("....................");
    Serial.println("............");
    Serial.println(".....................");
    Serial.println("........");
    Serial.println("...................");
    Serial.println("............................");
    Serial.println("..................................");
    Serial.println("................");
    Serial.println("................................");
    Serial.println("......................");
    Serial.println(".....................................");
    Serial.println("..");
    Serial.println("........................................");
    Serial.println("............................");
    Serial.println("......................");
    Serial.println("..");  
    Serial.println("........................");
    Serial.println("..........................................");
    Serial.println("............................");
}

Se da questa funzione cancello quasi tutte le linee di serial.println, l'errore sparisce.
Avete qualche consiglio per poter continuare ad ottenere il messaggio lungo su monitor seriale ma senza errore di compilazione?
Grazie

Se sono stringhe costati, le puoi memorizzare in flash con la macro F() (la trovi descritta alla fine di QUESTA pagina del reference) ... in pratica i tuoi Serial.print() / Serial.println() diventano:

Serial.print( F ("stringa da stampare") );
...
Serial.println( F ("stringa da stampare") );

Vedrai che l'occupazione di flash cresce e cala l'occupazione di SRAM.

Guglielmo

1 Like

per come la vedo io...o usi la macro F() o meglio ti crei una funzione del tipo:

void myPrint(uint8_t v) {
  for (uint8_t i = 0; i < v; i++) {
    Serial.print('.');
  }
  Serial.println();
}

dove gli passi il numero di puntini da stampare...

PS: sempre che a te interessi stampare puntini...

Però non si tratta di un "errore" ma solo di un avviso che stai consumando molta ram.

Io farei così, forse:

void TypeInstructions(void){
    Serial.println();      
    Serial.print(F("..................................\r\n"
                     "|............................\r\n"
    
    
    ));
    Serial.println(Version);
    Serial.print(F("\r\n"));
    Serial.print(F("...........\r\n"
                   "........................\r\n" 
                   "................\r\n"
                   "................................*\r\n"
                   ".........................\r\n"
                   "....................\r\n"
                   "............\r\n"
    ));
    
}

:smile:
Non credo che gli interessino i puntini.

Ciao.

molto probabile... :sweat_smile:
@pautax : non conosco il progetto...però potresti valutare l'uso di una memoria esterna.

1 Like

Ehm... I puntini sostituiscono il vero testo, lo ha scritto: :wink:

Riporto la funzione con dimensioni reali, anche se cambio il contenuto con tutti caratteri . (punto)

concordo, anche io farei così, includendo anche \r\n.
Anzi, metterei quel testo in un file *.h come costante, ad esempio:

#define PAGINA1 F("..................................\r\n|............................")
#define PAGINA2 F(" \r\n\r\n...........\r\n...eccetera...\r\n")

quindi per visualizzarla:

   Serial.print(PAGINA1);
   Serial.print(Versione);
   Serial.print(PAGINA2);

:smiley:
Infatti il "forse" non è casuale.

Ciao.

Grazie, provo.
Saluti

Ho letto, grazie, ho risolto.
Saluti

1 Like

Buongiorno,
questa MACRO F è documentata? Ovvero, si trova una descrizione di cosa fa il compilatore?
Mi piacerebbe saperlo, tanto così, perchè usare le cose a scatola chiusa non lo trovo divertente. Grazie

Se cerchi con Google "Arduino F() macro" trovi di tutto e di più ... comunque, semplicemente, sfrutta PROGMEM ovvero mette le "costanti" in flash invece che in SRAM.

Guglielmo

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.