[RISOLTO] dichiarare variabili al momento che servono oppure no

maubarzi: @gpb01 sei un mito, mi esci sempre con il doc giusto al momento giusto.

:D :D :D ... ho un ampia biblioteca ;)

Guglielmo

e la bontà d'animo di condividerla sempre ;)

gpb01: Vi consiglio un attento studio dell'allegato documento di Atmel relativo alla ottimizzazione del codice. ;)

meraviglia grande Guglielmo, grazie Guglielmo, gagliardo Guglielmo e vai pure avanti tu.....https://www.dizy.com/it/aggettivi/g ho piacevolmente scoperto che anche Atmel va piu' veloce coi de-contatori, piuttosto che coi contatori mi ricorda tanto la mia vecchia Texas......... però mi viene un dubbio, se per usare variabili locali invece che globali sono costretto a passare più parametri piuttosto che restituire strutture?

Standardoil: ... se per usare variabili locali invece che globali sono costretto a passare più parametri piuttosto che restituire strutture?

... beh ... "Est modus in rebus" ;)

Guglielmo

gpb01: Ove possibile, le variabili LOCALI [u]sono da preferire[/u] alle variabili globali.

Vi consiglio un attento studio dell'allegato documento di Atmel relativo alla ottimizzazione del codice. ;)

Guglielmo

Veramente interessante! Chi si "prende la briga" di verificare come riportare i trucchi anche nella programmazione tipica di arduino?

Standardoil: però mi viene un dubbio, se per usare variabili locali invece che globali sono costretto a passare più parametri piuttosto che restituire strutture?

Mah... anche questo approccio mi convince poco. O meglio, il numero di parametri di una funzione non dovrebbe influenzare la scelta di usare variabili globali o locali. Poi concordo sul fatto che sia difficile stabilire dove sia la linea di confine...

Però tendenzialmente si dovrebbe praticamente sempre poter stabilire un contesto di validità delle variabili e quindi si potrebbe passare quello e da li accedere alle variabili che servono, senza doverle dichiarare per forza globali. Riformulo ribaltando l'ottica, ci sono sempre ambiti dove certe variabili non servono proprio e permetterne l'accessibilità (quindi anche la modificabilità) potrebbe causare solo problemi.

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

DESCRIZIONE.doc (63.5 KB)

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

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?

dr_vagus: 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 ...

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.

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 ...

... 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

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 :smiling_imp:

maubarzi: EDIT: Magari, invece, ci si riesce con qualche bella sana tecnica di hacking :smiling_imp:

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

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.

maubarzi: 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).

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.

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"

ah, ok. capito

gpb01: ... 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