comportamento strano in compilazione

Salve a tutti, guardando il forum mi sono interessato ad arduino e un paio di mesi fa
ho acquistato un board 'arduino uno' :), ho smanettato un po' mi e' piaciuto ,
collega un sensore , ne colleghi un altro , un display un ir etc etc.. ]:smiley:
ma è sorto un problema che non riesco a risolvere...
quando compilo entro un certo limite va tutto bene ma oltre ..
arduino impazzisce e non segue il codice ,eppure quando compilo 8)
Binary sketch size: 20036 bytes (of a 32256 byte maximum)
non uso tutta la mem a disposizione ,, sono a 2/3 ma...
non ne esco .. suggerimenti ?? :roll_eyes: :roll_eyes:
grz a tutti XD

L'IDE ti da qualche errore?
Che problemi noti nell'esecuzione?

PS:
io ho avuto un problema simile, ma per sketch dell'ordine dei 30-32 kB, quasi al limite della memoria totale.

il compiler non da nessun errore
ma uso molte matrici ..
ma in teoria lo spazio occupato visualizzato in
compilazione , dovrebbe tenerne conto (spero)
i problemi che noto sono che i '''codice '' va per conto suo
il prg deve fare una cosa ma non e' cosi.. p.e. non invia piu' i dati da seriale ,
oppure no esegue for / next $)

COnsidera che l'architettura Harvard su cui è basato il micro divide la memoria del programma da quello delle variabili, e che la SRAM, la memoria destinata ad accoglierle, è limitata a 2 soli KB. Inoltre in essa stanno anche l'heap e lo stack per cui se non curi il tuo codice e generi molti dati a runtime, soprattutto array dinamici, la cui dimensione non può essere nota a priori, potresti arrivare a riempire tutta la memoria.

Ti posso consigliare solo di inserire un bel po' di Serial.println e tracciare così dove si pianta il tuo progetto.

Anchi penso che sia un problema di Ram. Usi tante variabili e percui consumi tutta la Ram disponibile. Il controller non fa controlli se supera la capienza del Ram, ma sovvrascrive dei dati e i sintomi sono che inpazzisce.

Soluzioni:

  • usi un controller piú grande che é per esempio sul Arduino Mega che ha piú memoria.
  • usi la funzione progmem per le variabili che non cambiano mettendoli nella memoria Flash PROGMEM - Arduino Reference

Ciao Uwe

Grz Uwe e anche a te Leo
provero' ad usare la funzione suggerita per pmettere dei dati quasi statici o che
cambiano molto di rado , esiste un modo x capire quando arrivo al limite della sdram ?

Ci sarebbe avr-size, che dovrebbe dare il computo delle memorie usate.
Però non so come si comporta ad esempio con array e/o matrici. Io non l'ho mai usato

fresco fresco: http://arduino.cc/forum/index.php/topic,59239.0.html
così usi avr-size

io ho un problema simile al tuo...ho scoperto che non sforo la ram ma noto che in certi punti del programma alcune variabili si "influenzano"

allora controlla se non hai definito male uno dei array.
array[5] vuol dire un array di 5 Elementi da array[0] a array[4].
Ciao Uwe

Anch'io ho scritto uno sketch di una ventina di Kb o forse piu', e il risultato è che a un certo punto le println iniziano a stampare valori a vanvera, il programma si riavvia da solo, va in loop, succede un casino. E non uso nessuna matrice, è solo un logger di dati con in piu' una gestione da remoto tramite internet!

Sarebbe utile capire qual è DAVVERO la massima dimensione possibile per uno sketch!

Anche se pero' puo' essere che ho combinato io qualche casino con le stringhe... Quanto mi irrita la gestione delle stringhe in C!!! :roll_eyes: Siamo ancora ai livelli degli anni '80!! :astonished:

Tutte queste segnalazioni mi fanno riflettere.
E' un problema del compilatore (avr-gcc) che ha dei limiti, è un problema del microprocessore, è un problema combinato??
Quasi quasi scrivo a Massimo...

jumpjack:
Anch'io ho scritto uno sketch di una ventina di Kb o forse piu', e il risultato è che a un certo punto le println iniziano a stampare valori a vanvera, il programma si riavvia da solo, va in loop, succede un casino. E non uso nessuna matrice, è solo un logger di dati con in piu' una gestione da remoto tramite internet!

Sarebbe utile capire qual è DAVVERO la massima dimensione possibile per uno sketch!

Anche se pero' puo' essere che ho combinato io qualche casino con le stringhe... Quanto mi irrita la gestione delle stringhe in C!!! :roll_eyes: Siamo ancora ai livelli degli anni '80!! :astonished:

Il problema non é la grandezza del codice che quando é troppo non Ti viene caricato o non funziona da principio.
I problemi piú rognosi sono i problemi col riempimento della Ram che sono strani e non prevedibili o analizzabili.
Un test significativo é se il programma circola bene sul Mega ma non sul uno é un segno di problemi di Ram.
La ram viene usata anche per lo stack che memorizza pe esempio gli indirizzi di ritorno di salti a sottoprogrammi. Se soprascrivi quello un reset é molto probabile.
Ciao Uwe

Ciao leo

Secondo me é un problema di programmazione/limiti del Controller perché usi troppa menmoria.

Ciao Uwe

uwe secondo te mettendo invece di un quarzo da 16mhz uno da 20 che è il limite dell'atmega a quanto ricordo si riuscirebbe a risolvere questo problema sugli sketch troppo grandi? (ovviamente coi flag giusti sul compilatore per i 20Mhz :wink: )

@Uwe:
se così fosse, sarebbe bene integrare nell'IDE un controllo con avr-size per verificare che, nonostante il codice riesca a stare dentro alla Flash, la creazione delle variabili non generi poi problemi di gestione dell'SRAM

@superlol:
e come farebbe un quarzo a 20 MHz a far evitare questo genere di errori rispetto a quello da 16 MHz?? :smiley: :smiley:

@superlol
Cosa ha che fare la grandezza della memoria con la frequenza di clock?
Sí, Ti va in blocco piú veloce perché arriva piú veloce al punto di piantarsi.
Ciao Uwe

chiedevo appunto in quanto di elettronica ne so poco, sono più ferrato nella programmazione :wink: pensavo che aumentando la velocità del processore magari riuscisse a gestire meglio la memoria. pardon mia ignoranza appunto :wink:

e in che modo sarebbe possibile comunque diciamo aumentare la ram? in teoria ho visto che si riescono a salvare anche valori delle variabili nella flash, prova con quello.
ecco l'ho trovato:

non conosco bene gli effetti anche qui sulla velocità del programma.

uwefed:
Anchi penso che sia un problema di Ram. Usi tante variabili e percui consumi tutta la Ram disponibile. Il controller non fa controlli se supera la capienza del Ram, ma sovvrascrive dei dati e i sintomi sono che inpazzisce.

Soluzioni:

  • usi un controller piú grande che é per esempio sul Arduino Mega che ha piú memoria.
  • usi la funzione progmem per le variabili che non cambiano mettendoli nella memoria Flash http://www.arduino.cc/en/Reference/PROGMEM

Non si puó su questi controller estendere la memoria interna con memoria esterna. puoi usare memoria esterna per memorizzare dati.

in teoria ho visto che si riescono a salvare anche valori delle variabili nella flash, prova con quello.

Riesci a memorizzare delle variabili statiche tipo stringhe da stampare sul display, tabelle di conversione, tabelle font ecc nella Flash.

Ciao Uwe

Dico la mia, penso che avr-size fà un lavoro statico, se dichiari un array di int da mille elementi verrà allocata memoria 16 x 1000, 16000bit cioè 2000byte, allora avr-size mostra dei dati coerenti. Ma se si fà uso di allocazione dinamica della memoria "malloc" allora non credo che avr-size riesca a ricavare il valore a run-time.

Comunque in caso di allocazione dinamica "malloc" se non và a buon fine mi pare che ritorna un puntatore nullo, e qui cominciano i casini.

Ci sarebbe da spezzettare il codice e testare le funzioni che fanno uso di allocazione dinamica, inoltre sarebbe pure comodo avere un debug, poi se ti senti puoi dare un'occhiata al file prodotti durante la compilazione, mi pare venga generato un file asm ".s".

Per quella anomalia basta un puntatore che punta dove non dovrebbe.
Bella gatta da pelare, Auguroni.

Ciao.

Senza stare a scomodare malloc, basta usare un semplice codice come questo:

String stringa;
do {
  stringa += "a";
} while (1);

Io dico che il micro scoppia :wink:

Tornando a PROGMEM, usi la Flash al posto della SRAM. Così però aggiri momentaneamente il problema perché se questo nasce in esecuzione, ti si ripresenterà comunque. Inoltre togli memoria al tuo sketch, e se sei a contare i byte per farci stare tutto, non so quanto tu possa risolvere. Metti da una parte ma togli dall'altra... :smiley: