Arduino Forum

International => Italiano => Generale => Topic started by: bitmanrc on Jan 12, 2019, 02:14 pm

Title: [RISOLTO] dichiarare variabili al momento che servono oppure no
Post by: bitmanrc on Jan 12, 2019, 02:14 pm
Naturalmente, mi sono accorto che "dichiarando" le variabili all'inizio del programma, (prima della funzione SETUP), mi implica un "impegno di memoria". Se li dichiaro quando mi servono, quindi dentro i void  oppure in genere nel listato, la memoria utilizzata NON viene intaccata. Secondo VOI è la stessa cosa dichiararle prima o quando mi servono? oppure quando vengono dichiarate all'occorrenza la memoria si "occupa" e dopo si "libera"? Spero di essermi spiegato. Grazie
Title: Re: dichiarare variabili
Post by: nid69ita on Jan 12, 2019, 02:23 pm
Le variabili locali (quelle dichiarate nelle funzioni) vengo allocate entri nella funzione e deallocate quando la funzione finisce.

Occhio però. Esempio hai 4 variabili int (2 byte l'una) e quindi 8 bytes:
1. Se dichiari globali occupano sempre 8 bytes.
2. Se la funzione in cui la dichiari è la loop() che è sempre eseguita...   non cambia molto come occupazione. In pratica essendo la loop() sempre eseguita, non c'e' quasi mai "praticamente" un momento in cui non occupi 8 bytes.
Inoltre uno sketch Arduino in realtà è circa (è nascosta la cosa):
Code: [Select]
void main()
{ setup();
   while(1) { loop(); }
}

Quindi se dichiari in loop, hai un continuo alloca/dealloca nello stack (anche se operazione che non porta via molto tempo, un calcolo per lo spazio da riservare in stack x var locali)

Ricorda poi che le variabili locali non sono inizializzate a zero.
Title: Re: dichiarare variabili
Post by: bitmanrc on Jan 12, 2019, 03:38 pm
quindi conviene allocarle/dichiararle dentro la funzione, cosi poi la memoria ritorna libera?
Title: Re: dichiarare variabili
Post by: nid69ita on Jan 12, 2019, 03:39 pm
Normalmente si.

Occhio però che se occupi in memoria globale 100 byte e poi nella loop() altri 100 byte,
in compilazione ti viene detto che occupi 100 byte. Il compilatore non sa che occuperai altri 100 byte con allocazione di variabili locali. In fase di esecuzione quando sei nella loop() quindi occupi 200 byte e con solo 2Kb di SRAM è facile consumare tutta la memoria (arduino con atmega 328)

Title: Re: dichiarare variabili
Post by: bitmanrc on Jan 12, 2019, 03:41 pm
Grazieeeeeeeeee
Title: Re: dichiarare variabili
Post by: maubarzi on Jan 12, 2019, 03:45 pm
dipende dall'uso che ne devi fare, io non sceglierei il punto dove dichiararle in base a questi aspetti, ma all'uso  che ne devi fare.
A meno che le prestazioni rincorse in modo maniacale non siano fondamentali, cioè dove devi recuperare e ottimizzare ogni singolo ciclo macchina...
Se le dichiari dentro la funzione hanno vita locale, si dichiarano quando non devono mantenere il valore tra un ciclo e l'altro. Si dichiarano fuori se devi memorizzare valori che devono sopravvivere al singolo ciclo di loop.

Se poi decidi di dichiararle fuori perchè ti piace di più o per altri motivi legittimi, ma devono avere vita locale al loop, le devi re-inizializzare ad ogni loop, resettare alla fine o inizializzare prima del loro utilizzo, altrimenti rischi di avere valori sporchi che ti alterano l'esecuzione.
Title: Re: [RISOLTO] dichiarare variabili al momento che servono oppure no
Post by: Silente on Jan 12, 2019, 04:42 pm
No una variabile locale è una variabile globale Sono due cose distinte in quanto
1) nelle variabili globali può non essere dato un valore iniziale in quanto prendono come inizio Zero, Mentre se uso una variabile locale devo in sede di dichiarazione darle un valore se no il valore di quella variabile sarà sbagliato ( corrispondente al valore che quel pezzo di memoria ha avuto la volta precedente che venne usato).
2) Una variabile globale Può essere utilizzata senza problemi in ogni parte del programma Mentre una locale va Passata come parametro per ogni funzione che la utilizza
3) in sede di compilazione io conosco l'intero volume occupato dalle variabili globali ma non ho nessuna idea su quello che occuperanno le locali.
Title: Re: [RISOLTO] dichiarare variabili al momento che servono oppure no
Post by: gpb01 on Jan 12, 2019, 05:45 pm
Ove possibile, le variabili LOCALI sono da preferire alle variabili globali.

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

Guglielmo

Title: Re: [RISOLTO] dichiarare variabili al momento che servono oppure no
Post by: maubarzi on Jan 12, 2019, 05:46 pm
Il No è riferito a me?

No una variabile locale è una variabile globale Sono due cose distinte in quanto
Ovvio, io non volevo dire che una variabile dichiarata fuori era locale o cose di questo tipo ma, essendo un po' più precisi per non fraintendersi: usare una variabile globale al posto di una locale quando nel programma ne basta una locale.

1) nelle variabili globali può non essere dato un valore iniziale in quanto prendono come inizio Zero, Mentre se uso una variabile locale devo in sede di dichiarazione darle un valore se no il valore di quella variabile sarà sbagliato ( corrispondente al valore che quel pezzo di memoria ha avuto la volta precedente che venne usato).
In genere il compilatore in questi casi da errore, quindi è implicito tutto questo discorso.
Mi fai venire il dubbio su Arduino, visto che lo hai accennato e io inizializzo sempre di prassi, non penso di averlo mai verificato nella pratica, ma in altri linguaggi c'è errore in compilazione.

2) Una variabile globale Può essere utilizzata senza problemi in ogni parte del programma Mentre una locale va Passata come parametro per ogni funzione che la utilizza
Questo dovrebbe far parte della progettazione, ovvio che se ti serve globale non la dichiari locale, ma se ti serve locale la puoi sempre dichiarare globale, ma ti tiri dietro le eventuali conseguenze... cioè devi sapere quello che fai e i problemi in cui puoi incappare...

3) in sede di compilazione io conosco l'intero volume occupato dalle variabili globali ma non ho nessuna idea su quello che occuperanno le locali.
Si, però questo non dovrebbe essere una discriminante per farti dichiarare tutto globale.
Anche perchè per sapere l'ammontare all'inizio hai un enorme spreco sul codice. Puoi dichiarare variabili locali ovunque, non solo dentro il loop ma anche dentro tutte le tue procedure/funzioni/metodi o come le vogliamo chiamare. Dichiari tutto globale per sapere quanto occupano? direi proprio di no o sbaglio?

Se il NO non era riferito a me... pecà, ho solo chiarito meglio il mio pensiero... inutilmente ...

EDIT (causa concomitanza):
@gpb01 sei un mito, mi esci sempre con il doc giusto al momento giusto.
me lo leggo mooolto volentieri ;)
Title: Re: [RISOLTO] dichiarare variabili al momento che servono oppure no
Post by: gpb01 on Jan 12, 2019, 06:05 pm
@gpb01 sei un mito, mi esci sempre con il doc giusto al momento giusto.
:D :D :D ... ho un ampia biblioteca ;)

Guglielmo
Title: Re: [RISOLTO] dichiarare variabili al momento che servono oppure no
Post by: maubarzi on Jan 12, 2019, 06:07 pm
e la bontà d'animo di condividerla sempre ;)
Title: Re: [RISOLTO] dichiarare variabili al momento che servono oppure no
Post by: Standardoil on Jan 12, 2019, 06:28 pm
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 (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?
Title: Re: [RISOLTO] dichiarare variabili al momento che servono oppure no
Post by: gpb01 on Jan 12, 2019, 07:50 pm
... se per usare variabili locali invece che globali sono costretto a passare più parametri piuttosto che restituire strutture?
... beh ... "Est modus in rebus" ;)

Guglielmo
Title: Re: [RISOLTO] dichiarare variabili al momento che servono oppure no
Post by: speedyant on Jan 12, 2019, 08:10 pm
Ove possibile, le variabili LOCALI sono da preferire 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?
Title: Re: [RISOLTO] dichiarare variabili al momento che servono oppure no
Post by: maubarzi on Jan 12, 2019, 08:46 pm
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.
Title: Re: [RISOLTO] dichiarare variabili al momento che servono oppure no
Post by: bitmanrc on Jan 12, 2019, 11:28 pm
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
Title: Re: [RISOLTO] dichiarare variabili al momento che servono oppure no
Post by: dr_vagus on Jan 14, 2019, 02:25 pm
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
Title: Re: [RISOLTO] dichiarare variabili al momento che servono oppure no
Post by: bitmanrc on Jan 14, 2019, 02:32 pm
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?
Title: Re: [RISOLTO] dichiarare variabili al momento che servono oppure no
Post by: gpb01 on Jan 14, 2019, 03:03 pm
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 ...
Title: Re: [RISOLTO] dichiarare variabili al momento che servono oppure no
Post by: maubarzi on Jan 14, 2019, 04:25 pm
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.
Title: Re: [RISOLTO] dichiarare variabili al momento che servono oppure no
Post by: gpb01 on Jan 14, 2019, 04:41 pm
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
Title: Re: [RISOLTO] dichiarare variabili al momento che servono oppure no
Post by: maubarzi on Jan 14, 2019, 04:45 pm
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:
Title: Re: [RISOLTO] dichiarare variabili al momento che servono oppure no
Post by: gpb01 on Jan 14, 2019, 05:04 pm
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
Title: Re: [RISOLTO] dichiarare variabili al momento che servono oppure no
Post by: maubarzi on Jan 14, 2019, 05:17 pm
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.
Title: Re: [RISOLTO] dichiarare variabili al momento che servono oppure no
Post by: Claudio_FF on Jan 14, 2019, 09:00 pm
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).
Title: Re: [RISOLTO] dichiarare variabili al momento che servono oppure no
Post by: maubarzi on Jan 14, 2019, 09:12 pm
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.
Title: Re: [RISOLTO] dichiarare variabili al momento che servono oppure no
Post by: gpb01 on Jan 14, 2019, 09:33 pm
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"
Title: Re: [RISOLTO] dichiarare variabili al momento che servono oppure no
Post by: maubarzi on Jan 14, 2019, 10:16 pm
ah, ok. capito
Title: Re: [RISOLTO] dichiarare variabili al momento che servono oppure no
Post by: dr_vagus on Jan 17, 2019, 06:20 pm
... 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
Title: Re: [RISOLTO] dichiarare variabili al momento che servono oppure no
Post by: dr_vagus on Jan 17, 2019, 06:34 pm
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...

Title: Re: [RISOLTO] dichiarare variabili al momento che servono oppure no
Post by: gpb01 on Jan 17, 2019, 06:44 pm
... mentre non conoscevo il 1284P, ma non trovo moduli , sai indicare qualche link?
E' una bella MCU con il doppio della SRAM del 2560 (ma metà della flash ... però comunque 128K) ... una schedina facilmente reperibile in Italia è QUESTA (https://www.futurashop.it/Pro-Midi-1284P-7300-PROMIDI1284P) ;)

Guglielmo

P.S.: Non farti ingannare da quel midi nel nome ... non ha nulla a che vedere con il protoccolo per musica, è per indicare che è una via di mezzo tra una mini, micro e mega :D :D :D
Title: Re: [RISOLTO] dichiarare variabili al momento che servono oppure no
Post by: dr_vagus on Jan 17, 2019, 07:29 pm
E' una bella MCU con il doppio della SRAM del 2560 (ma metà della flash ... però comunque 128K) ... una schedina facilmente reperibile in Italia è QUESTA (https://www.futurashop.it/Pro-Midi-1284P-7300-PROMIDI1284P) ;)

Guglielmo

P.S.: Non farti ingannare da quel midi nel nome ... non ha nulla a che vedere con il protoccolo per musica, è per indicare che è una via di mezzo tra una mini, micro e mega :D :D :D
bellissima, ma... 20 fischioni!!!!   è difficile tenere il confronto con STM32...
Title: Re: [RISOLTO] dichiarare variabili al momento che servono oppure no
Post by: maubarzi on Jan 17, 2019, 09:03 pm
il mio lo allego. Attualmente è lo sketch che sto usando ... sono quasi 600 righe e secondo me non è riducibile. Magari mi sbagliassi...
Ci ho dato un'occhiata...
Premetto che non sono per le ottimizzazioni estreme se non servono o se costano di più del passaggio a piattaforme più potenti.

Però se ci dovessi proprio far stare questo software su una scatola di vermi, da una prima occhiata mi pare ci siano alcuni punti su cui intervenire.
Hai un sacco di costanti che si potrebbero definire come #define
Poi ci sono un sacco di stringhe costanti per formattare i messaggi di errore, queste si potrebbero tutte trasferire nella EEPROM con una funzione generica che legge da un indirizzo preciso per una lunghezza precisa entrambi definiti come define o cablati senza passare per variabili.
Poi, forse, analizzando bene il codice si potrebbero eliminare gran parte delle variabili globali rendendole locali e dichiarandole solo dove realmente servono, non ho analizzato in dettaglio, ma qualcosa sicuramente si può recuperare anche qui.
Ci sono anche un paio di String bonificabili.

Resta però valida la mia premessa iniziale, se con pochi euro riesci a passare a qualcosa di più "potente" non vale la pena spendere ore in ottimizzazioni perchè costerebbero di più del cambio MCU.
Title: Re: [RISOLTO] dichiarare variabili al momento che servono oppure no
Post by: Silente on Jan 17, 2019, 09:50 pm
Qualche consiglio:
incorpora fino alla morte le boolean in variabili di tipo byte (non so per che cosa le usi ma ne ho contate una quindicina soltanto tra le dichiarate globali)
Contrario, solo in apparenza, a quanto dissi: sei certo che tutta quella pappardella di variabili globali ti siano utili? Quelle che ti servono solo per momenti rendile locali, che poi spariscono.
Ho visto una cosa che non mi piace:un, ma forse sono di più, esemplare di String. Estinguili.
Rendi #define TUTTE le variabili il cui valore NON debba cambiare nel programma. Altro che "const unsigned long", e pin di pulsanti manco dichiarati const.
Sicuro che ti serva leggere lobstato di pulsanti e ricordarlo in variabile? Se tale variabile la usi una volta sola in lettura basta leggere lo stato del pulsante in quel punto.
Poi mi spieghi perché dichiari alcune bool come =!HIGH (5 caratteri) e non come =LOW (3 caratteri)? Il risultato é lo stesso, ma il secondo é più chiaro.

Non ho ancora attaccato oa loop()
Title: Re: [RISOLTO] dichiarare variabili al momento che servono oppure no
Post by: Datman on Jan 17, 2019, 09:57 pm
Servono davvero quelle float e quelle long?... Ti servono tutte quelle cifre o puoi dividere arrotondando? Si alleggerirebbero anche i calcoli.
Inoltre, facendo for() da n a 0, anziché da 0 a n, si guadagna qualcosa in velocità, perché i confronti vengono fatti con 0.
Title: Re: [RISOLTO] dichiarare variabili al momento che servono oppure no
Post by: maubarzi on Jan 17, 2019, 10:07 pm
Poi mi spieghi perché dichiari alcune bool come =!HIGH (5 caratteri) e non come =LOW (3 caratteri)? Il risultato é lo stesso, ma il secondo é più chiaro.
Folcloristico come uso ma il numero di caratteri è ininfluente al fine dello spazio occupato nel compilato ;)

EDIT:
Vorrei rivedere un cicinin questa mia affermazione:
Premetto che non sono per le ottimizzazioni estreme se non servono o se costano di più del passaggio a piattaforme più potenti.
Intendo su progetto one shot, se si tratta di un prodotto con un ciclo di vita non brevissimo invece sono abbastanza per l'ottimizzazione, magari non maniacale ma quasi ;)
Title: Re: [RISOLTO] dichiarare variabili al momento che servono oppure no
Post by: Silente on Jan 17, 2019, 10:14 pm
Lo so. era solo per dire che ti piace pure scrivere di più
Title: Re: [RISOLTO] dichiarare variabili al momento che servono oppure no
Post by: maubarzi on Jan 17, 2019, 10:19 pm
Però non negherai che è un modo carino di scrivere codice, per me è pure simpatico.
Sembra quasi una firma stilistica ;)
Title: Re: [RISOLTO] dichiarare variabili al momento che servono oppure no
Post by: Standardoil on Jan 17, 2019, 10:24 pm
a me personalmente non piace
preferisco semmai scrivere 1 piuttosto che !LOW, che passa per una macro e una negazione per scrivere un uno, mi sembra una pippa inutile
Title: Re: [RISOLTO] dichiarare variabili al momento che servono oppure no
Post by: maubarzi on Jan 17, 2019, 10:37 pm
incorpora fino alla morte le boolean in variabili di tipo byte (non so per che cosa le usi ma ne ho contate una quindicina soltanto tra le dichiarate globali)
Si potrebbero usare i bit di un singolo int per le 15 boolean che hai contato invece di 15 byte o addirittura di 15 int, non ricordo come erano dichiarate.
Title: Re: [RISOLTO] dichiarare variabili al momento che servono oppure no
Post by: Standardoil on Jan 17, 2019, 10:39 pm
Si potrebbero usare i bit di un singolo int per le 15 boolean che hai contato invece di 15 byte o addirittura di 15 int, non ricordo come erano dichiarate.

no credo che ci guadagnamo molto, perchè poi diventa più complicata la gestione, considero l'attule compromesso "boolean grande uguale uguale a byte" un buon compromesso
Title: Re: [RISOLTO] dichiarare variabili al momento che servono oppure no
Post by: maubarzi on Jan 17, 2019, 10:43 pm
si, forse hai ragione, probabile che sprechi di più a indicare di leggere il bit N con la bitRead che a dichiararlo e usarlo come byte
Title: Re: [RISOLTO] dichiarare variabili al momento che servono oppure no
Post by: gpb01 on Jan 17, 2019, 11:32 pm
si, forse hai ragione, probabile che sprechi di più a indicare di leggere il bit N con la bitRead che a dichiararlo e usarlo come byte
No, anzi ... si risparmia tantissimo a raggruppare valori booleani in un singolo bit di un byte e poi fare il set, reset e test con gli operatori bitwise e magari, per brevità di scrittura, con l'ausilio della macro _BV() ...

Code: [Select]
set    : varByte |= _BV(numeroBit);
reset  : varByte &= ~(_BV(numeroBit));
test   : if (varByte & _BV(numeroBit)) ....

... tutte cose eseguite in uno paio di cicli macchina o poco più ... ;)

Guglielmo

P.S.: la macro _BV() è definita in <avr/sfr_defs.h> come:  #define _BV (bit)   (1 << (bit))
Title: Re: [RISOLTO] dichiarare variabili al momento che servono oppure no
Post by: maubarzi on Jan 17, 2019, 11:43 pm
Non si parlava di tempo di esecuzione ma di spazio utilizzato in memoria.
se ad ogni test devi aggiungere un byte per indicare numeroBit già ti sei perso il vantaggio mi sa.
Title: Re: [RISOLTO] dichiarare variabili al momento che servono oppure no
Post by: gpb01 on Jan 17, 2019, 11:57 pm
se ad ogni test devi aggiungere un byte per indicare numeroBit già ti sei perso il vantaggio mi sa.
... mmm ... non ne sono sicurissimo. Certo, occorrerebbe valutare quante variabli booleane ti servono, quali operazioni fai più spesso, ecc. ecc. e valutare caso per caso l'ottimizzazione migliore :)

Guglielmo
Title: Re: [RISOLTO] dichiarare variabili al momento che servono oppure no
Post by: maubarzi on Jan 18, 2019, 07:14 am
... mmm ... non ne sono sicurissimo. Certo, occorrerebbe valutare quante variabli booleane ti servono, quali operazioni fai più spesso, ecc. ecc. e valutare caso per caso l'ottimizzazione migliore :)

Guglielmo
In effetti, stanotte, ragionando (leggi dormendo), è venuto il dubbio pure a me.
Bisognerebbe vedere esattamente come viene scritto in assembly questo test, se riesce a mettere tutto negli stessi byte perchè di fatto non serve un intero byte per indicare numeroBit (ne potrebbero bastano 3 o 4 a seconda se si accede a 1 byte o 2) dipende dai bit che servono per l'indirizzamento della variabile da testare...
Non è che dal cilindro tiri fuori un reference del linguaggio assembly? Sul datasheet dell'ATmega c'è solo la lista delle istruzioni con l'identificativo mnemonico, non con quella binaria, almeno se non ho visto male.
Title: Re: [RISOLTO] dichiarare variabili al momento che servono oppure no
Post by: gpb01 on Jan 18, 2019, 07:27 am
In effetti, stanotte, ragionando (leggi dormendo), è venuto il dubbio pure a me .....
... moltissimo conta come ottimizza il compilatore e quale livello di ottimizzazione si sceglie (cosa che non fa nessuno, ma esiste sia un apposito #pragma che un __attribute per cambiare le ottmizzazioni del codice tra le varie possibili).

Ripeto, per avere indicazioni reali, occorrerbbe mettersi a scivere aluni test, compilarli e guardare, con l'aiuto del .elf, l'assemblato generato per la varie righe scritte ;)

Guglielmo
Title: Re: [RISOLTO] dichiarare variabili al momento che servono oppure no
Post by: maubarzi on Jan 18, 2019, 08:55 am
Ho trovato un po' di doc e mi sa che alla fine il buon vecchio Guglielmo non aveva proprio tutti i torti.
Le istruzioni sono a 16 bit per cui c'è tutto lo spazio per gestire il numeroBit nell'istruzione principale per cui non dovrebbe richiedere il byte in più che avevo ipotizzato.

L'unica pecca è che alla sua risposta mancava il solito doc di specifica cui ci ha sempre abituati...  ;)  ad abituare bene le persone ...  :smiley-evil:  poi queste non sono mai contente ...  :P

Quindi mi sa che possiamo dire che anche accorpare i boolean come bit di byte ha il suo vantaggio.
Title: Re: [RISOLTO] dichiarare variabili al momento che servono oppure no
Post by: gpb01 on Jan 18, 2019, 09:03 am
L'unica pecca è che alla sua risposta mancava il solito doc di specifica cui ci ha sempre abituati...  ;)  
:D :D :D ... eccone uno (piuttosto vecchio) che magari ti sarà utile (se non lo hai già trovato) ...

Guglielmo
Title: Re: [RISOLTO] dichiarare variabili al momento che servono oppure no
Post by: maubarzi on Jan 18, 2019, 09:15 am
Non mi dire che questa volta riesco io ad aggiornare la tua immensa libreria ;)
Ne ho trovato uno del 2014.
Però il karma te lo metto lo stesso, anche se guadagnato in zona Cesarini ;)
Title: Re: [RISOLTO] dichiarare variabili al momento che servono oppure no
Post by: gpb01 on Jan 18, 2019, 09:30 am
Non mi dire che questa volta riesco io ad aggiornare la tua immensa libreria ;)
:D :D :D ... grazie, dato lo scarso uso che ne faccio, non mi ero preoccupato molto di cercare un aggiornamento ;)

Guglielmo
Title: Re: [RISOLTO] dichiarare variabili al momento che servono oppure no
Post by: dr_vagus on Jan 18, 2019, 11:34 am
Qualche consiglio:
incorpora fino alla morte le boolean in variabili di tipo byte (non so per che cosa le usi ma ne ho contate una quindicina soltanto tra le dichiarate globali)
Contrario, solo in apparenza, a quanto dissi: sei certo che tutta quella pappardella di variabili globali ti siano utili? Quelle che ti servono solo per momenti rendile locali, che poi spariscono.
Ho visto una cosa che non mi piace:un, ma forse sono di più, esemplare di String. Estinguili.
Rendi #define TUTTE le variabili il cui valore NON debba cambiare nel programma. Altro che "const unsigned long", e pin di pulsanti manco dichiarati const.
Sicuro che ti serva leggere lobstato di pulsanti e ricordarlo in variabile? Se tale variabile la usi una volta sola in lettura basta leggere lo stato del pulsante in quel punto.
Poi mi spieghi perché dichiari alcune bool come =!HIGH (5 caratteri) e non come =LOW (3 caratteri)? Il risultato é lo stesso, ma il secondo é più chiaro.

Non ho ancora attaccato oa loop()
come scritto a molte delle cose che indichi ci avevo già pensato. Altre si potrebbero fare, ma quanto shrinko? 10-20-50 byte? ormai sono fuori di 600 byte.

"!HIGH" capisco la perplessità, ma cio' che sembra chiaro a te non lo per me. Uso "!HIGH" semplicemente perchè i relè si eccitato con stato LOW, e mi rimane piu intuitivo scrivere !HIGH per capire quando sto eccitando il relè." 

I problemi non sono solo SW ma anche HW: questo progetto è stato inserito in una scatola elettrica di certe dimensioni, molto compatte... con Arduino Pro Micro è tutto compatto, se metto un mega2560 devo rifare tutto.

Eppoi considerazione conclusiva: è bello anche poter scrivere il codice con un minimo di libertà di scrittura, ottimizzando si, ma senza dover rinunciare al proprio "stile", e al modo in cui ciascuno è abituato a scriversi il codice e a leggerlo.
Inoltre c'è da distinguere due tipi di sketcher: ci sono gli smanettoni, di solito piu esperti e molto bravi, ma spesso troppo intrippati con il coding (è bello concordo), e poco pratici, ma poi ci sono anche altri che per vari motivi non hanno tempo o voglia di dedicarsi troppo ai problemi SW e HW e preferiscono realizzare il progetto in modo piu agevole (quindi evitando di dedicarsi troppoai problemi di cavilli SW). Io appartengo alla seconda specie.

L'idea di passare a STM32 è dovuta 1) al costo 2) alle dimensioni fisiche (mi consente di utilizzare lo chassis già in suo) 3) la memoria, 64K è il doppio di quello che mi serve 4) non da ultimo il clock 72Mhz invece di 16.

Almeno per questo progetto, in altri casi rimango fedele ad ATMEL. :-)

Grazie cmq delle osservazioni di cui faccio sicuramente tesoro.
Title: Re: [RISOLTO] dichiarare variabili al momento che servono oppure no
Post by: dr_vagus on Jan 18, 2019, 11:37 am
Resta però valida la mia premessa iniziale, se con pochi euro riesci a passare a qualcosa di più "potente" non vale la pena spendere ore in ottimizzazioni perchè costerebbero di più del cambio MCU.

Eh già. Anche perchè ahimè di tempo ne ho veramente poco. Tra figli moglie lavoro.. alla fine mi restano dei ritagli... perdere ore per comprimere di 100byte mi pare poco costruttivo nel mio caso almeno.

Grazie molto per le osservazioni.
Title: Re: [RISOLTO] dichiarare variabili al momento che servono oppure no
Post by: gpb01 on Jan 18, 2019, 11:38 am
... non da ultimo il clock 72Mhz invece di 16.
... questo dato, buttato così, non è molto signifcativo ... ho visto blasolante MCU viaggiare a quelle frequenze e svolgere i loro compiti più lentamente degli AVR a 16 MHz ... occorre esaminare molte cose, il solo clock non basta ;)

Guglielmo
Title: Re: [RISOLTO] dichiarare variabili al momento che servono oppure no
Post by: maubarzi on Jan 18, 2019, 12:19 pm
Eh già. Anche perchè ahimè di tempo ne ho veramente poco. Tra figli moglie lavoro.. alla fine mi restano dei ritagli... perdere ore per comprimere di 100byte mi pare poco costruttivo nel mio caso almeno.
Ma si, dai... siamo sempre in ambito hobbistico!
Se lo si fa per lavoro sarebbe già diverso, altrimenti si rischia di fare come una nota azienda di software che con le sue pessimizzazioni riesce sempre a vanificare tutti i miglioramenti prestazionali dell'hardware ;)

:D :D :D ... grazie, dato lo scarso uso che ne faccio, non mi ero preoccupato molto di cercare un aggiornamento ;)
Io però la metto lo stesso nel mio curriculum ;)