Go Down

Topic: [RISOLTO] dichiarare variabili al momento che servono oppure no (Read 1 time) previous topic - next topic

bitmanrc

A prescindere..... io le variabili globali si dichiaro all'inizio del programma è mi servono per tutto il programma.
le variabili locali li definisco sono in quel void dedicato, quindi dovrei risparmiare memoria, giusto?

vi allego un file di quello che ho fatto di arduino (1 ardu per antifurto) (1 ardu per caldaia, quindi temperature casa) (X ardu per ogni 14 controlli, ho circa 5 ardu in casa) (Y per controllo consumi a dare priorità ai vari elettromestici)

nel file allegato quello scritto in rosso è ancora da completare... ahimè
è oltre un anno che faccio aggiornamenti e ampliamenti

dr_vagus

informazioni molto interessanti e utili. Se posso fare una considerazione di carattere piu generale, mi verrebbe da dire che se devo stare a contare il programma sul filo dei byte -e lo sto facendo proprio in questi giorni, ho saturato la memoria di un AT 32u4 (arduno pro micro), mi sono letto i documenti che avete citato e ho applicato tutte le strategie possibile , ma niente, non ci sta dentro-, meglio cambiare processore.

Ho perso un sacco di tempo, sacrificato funzioni, ecc.  per cui mi sa che passo a un STM32F01.

Voglio dire che arduino , come ogni altro, oltretutto con poco spazio residuo rischia di funzionare anche male.
Bisognerebbe sempre secondo me scrivere scketch avendo sempre almeno il doppio dello spazio che serve.
IMHO
----
don't be ...Vagus.

bitmanrc

Hai letto il file allegato DESCRIZIONE.DOC, hai visto quante cosa faccio per singolo arduino mega.. Mi sa che stai facendo come me all'inizio della stesura... Usavo troppe variabili e troppi sottoprogrammi inutili.
TU CON ARDUINO COSA STAI FACENDO?

gpb01

Ho perso un sacco di tempo, sacrificato funzioni, ecc.  per cui mi sa che passo a un STM32F01.
... senza buttare via tutto e riscrivere il codice per passare a differente MCU, la strada più semplice è semplicemente cambiare la MCU restando su AVR ... ATmega 1284P o ATmega2560 ;)

Guglielmo

P.S.: se hai problemi di spazio, per entrambe le MCU si trovano schedine già pronte molto piccole ...
Search is Your friend ... or I am Your enemy !

maubarzi

stavo giusto in questi giorni iniziando a guardarmi attorno riguardo un'estensione di SRAM, ho trovato un chip da 1M a un paio di euro, si connette in modo seriale per cui non servono tutti i pin del classico indirizzamento parallelo.
Tutto il grosso dei dati e delle variabili possono finire li lasciando solo il programma e le allocazioni strettamente necessarie alla singola operazione sulla memoria principale.
Poi non so (non ho ancora approfondito) se ci sono meccanismi per poter spostare su SRAM anche parte del codice.
Nessuna buona azione resterà impunita!

Preistoria -> medioevo -> rinascimento -> risorgimento -> rincoglionimento!

gpb01

stavo giusto in questi giorni iniziando a guardarmi attorno riguardo un'estensione di SRAM, ho trovato un chip da 1M a un paio di euro ...
... nessuna estensione di SRAM è gestita dal ATmega328P, quindi ... dovrai vederla SOLO come un supporto esterno (come una SD o altro tipo di memoria) quindi, a livello codice e disponibilità di SRAM, non cambia nulla.

Rammento invece che il ATmega2560 ha 8KB di SRAM, mentre il ATmega1284P ha ben 16KB di SRAM :)

Guglielmo
Search is Your friend ... or I am Your enemy !

maubarzi

Ok, quindi la puoi usare solo al posto di SD o EEPROM quando ti serve scrivere tante volte e non serve la persistenza.
Grazie mille per la risposta, mi hai evitato una lunga ricerca.

EDIT: Magari, invece, ci si riesce con qualche bella sana tecnica di hacking  :smiley-twist:
Nessuna buona azione resterà impunita!

Preistoria -> medioevo -> rinascimento -> risorgimento -> rincoglionimento!

gpb01

EDIT: Magari, invece, ci si riesce con qualche bella sana tecnica di hacking  :smiley-twist:
No, piuttosto considera invece che, all'occorrenza, l'ATmega2560 (... e forse anche il 1284P) può usare memoria SRAM esterna (ha sufficienti pin per l'address bus ed il data bus).

Guglielmo
Search is Your friend ... or I am Your enemy !

maubarzi

Se il problema è la velocità, ovvio che il parallelo è meglio, però il problema dell'estensione della memoria è dettato dal fatto che non c'è un livello di "astrazione" della memoria già presente.
Ora sarebbe un lavoro improbo e poco sensato perchè sarebbe un puro accrocchio, però tecnicamente si potrebbe fare.
Stiamo facendo un discorso abbastanza filosofico perchè alla fine il risultato sarebbe troppo complesso e contorto per essere sensato.

Ora sono di corsa ma appena torno sparo due considerazioni giusto per fare filosofia spiccia.
Nessuna buona azione resterà impunita!

Preistoria -> medioevo -> rinascimento -> risorgimento -> rincoglionimento!

Claudio_FF

però il problema dell'estensione della memoria è dettato dal fatto che non c'è un livello di "astrazione" della memoria già presente.
Il discorso non è SRAM, più o meno parallela, o altro tipo di memoria, ma di memoria centrale contro memoria di massa. Quello che si può aggiungere all'esterno è memoria di massa, quindi non visibile come area di lavoro centrale dove stanno le variabili.

Certamente è possibile spostare avanti e indietro blocchi di dati tra le due memorie, in modo da avere nella memoria centrale solo la porzione da usare in quel momento (sempre se i tempi per fare tutto ciò non diventano troppo grandi).
Una domanda ben posta è già mezza risposta.

maubarzi

Se si vuole aggiungere SRAM per appoggiarci dati ci sono due opzioni, l'indirizzamento parallelo o seriale.
Nel primo caso servono più pin come dice Guglielmo, nel secondo caso si dovrebbe poter fare tranqullamente con qualunque versione di arduino perchè bastano pochi pin.

Questa memoria avrebbe il vantaggio di non avere limiti di riscrittura e quindi potrebbe essere usata anche per dati che cambiano spesso.
Dovrebbe anche essere più veloce di EEPROM (non ne sono sicuro, non ho controllato ma tendenzialmente penso di si) e di SD (queste sono mooolto lente)

Usarla per estendere anche la memoria del codice sarebbe un casino, perchè mi sa che non c'è un vero supporto per la rimappatura degli indirizzi lato mcu. Che sarebbe il problema più grosso da risolvere per poter far funzionare questa cosa.
Si potrebbe usare un hack o in termine tecnico un trucco bistrucco, ma servirebbe la collaborazione del compilatore. Si potrebbe dedicare un'area di memoria per contenere del codice pluggable e sostituirlo all'occorrenza.
Questo codice dovrebbe essere compilato a parte in modo da funzionare in quell'area di memoria.
I programmi dovrebbero essere scritti a moduli autonomi, ad es. funzioni autonome che se richiamate vengono caricate on the fly sull'area preposta, eseguite, e poi scaricate.
Queste potrebbero essere richiamate in modo furbo da dentro il codice.
Scrivere su quest'area di memoria codice precompilato preso da SRAM esterna dovrebbe essere agevole usando i puntatori per mappare l'area. Sarebbe come scrivere un array di byte.

Cominciano ad essere un bel po' le cose da fare per attivare questa funzionalità, però in caso di vita o di morte sarebbe tecnicamente possibile.

Fine del pistolotto teorico/filosofico.
Ora mi taccio.
Nessuna buona azione resterà impunita!

Preistoria -> medioevo -> rinascimento -> risorgimento -> rincoglionimento!

gpb01

No, vedo che non sono stato chiaro ... sul ATmega2560 è prevsito in HW che si possa usare memoria esterna per estendere la SRAM, quindi, su tale MCU, la memoria esterna (parallela) è vista come vera estensione della SRAM e non come un supporto esterno !

Guglielmo

P.S.: Vedi datasheet ATmega2560 capitolo 9 "External Memory Interface"
Search is Your friend ... or I am Your enemy !

maubarzi

Nessuna buona azione resterà impunita!

Preistoria -> medioevo -> rinascimento -> risorgimento -> rincoglionimento!

dr_vagus

... senza buttare via tutto e riscrivere il codice per passare a differente MCU, la strada più semplice è semplicemente cambiare la MCU restando su AVR ... ATmega 1284P o ATmega2560 ;)

Guglielmo

P.S.: se hai problemi di spazio, per entrambe le MCU si trovano schedine già pronte molto piccole ...
mah, tieni conto che STM32 costa 3 dollari e ha 64k, 8k di ram e 72Mhz di clock. Puoi programmarlo tramite Arduino IDE e mantiene un 'alta cmptibilità, non devi rifare lo sketch solo aggiustare il nome dei pin.

Si ho un paio di schedine 2560 versione micro, mentre non conoscevo il 1284P, ma non trovo moduli , sai indicare qualche link?

 grazie
----
don't be ...Vagus.

dr_vagus

Hai letto il file allegato DESCRIZIONE.DOC, hai visto quante cosa faccio per singolo arduino mega.. Mi sa che stai facendo come me all'inizio della stesura... Usavo troppe variabili e troppi sottoprogrammi inutili.
TU CON ARDUINO COSA STAI FACENDO?
ma non sono proprio all'inizio e ho attuato tutte le strategie possibili per minimizzare la memoria.
non ci sta proprio.

Ho letto il tuo file ma se non vedo lo sketch non mi dice molto. Ma con MEGA è facile. Io sto usando il 32U4 (leonardo)

posta uno sketch e vediamo come è fatto

il mio lo allego. Attualmente è lo sketch che sto usando ... sono quasi 600 righe e secondo me non è riducibile. Magari mi sbagliassi...

----
don't be ...Vagus.

Go Up