Go Down

Topic: risparmiare ram (Read 2 times) previous topic - next topic

leo72


Non è semplice, anche con poche righe di codice, capire cosa combina il compilatore e come ottimizza, spesso e volentieri il solo modo per verificare rapidamente se c'è stato un guadagno, o una perdita, di velocità sul nostro codice è fare delle misure strumentali.
Più tardi faccio un paio di prove, mirate a rilevare la reale differenza in cicli macchina tra l'uso di const e define, con l'utilizzo dell'analizzatore di stati logici in modo da poter misurare con precisione l'effettiva differenza.


Ti ho appena mostrato che i 2 sketch il compilatore li trasforma nello stesso identico codice macchina.
Sul microcontrollore ci sarà quindi lo stesso binario, giusto? Quindi il comportamento è lo stesso.


Risultato di diff eseguito su di essi:
Code: [Select]

[leo@desktop-hp build8853307674189123112.tmp]$ diff define.txt const.txt -s
I file define.txt e const.txt sono identici


?R

usando define però non posso usare PROGMEM, no?
Riccardo Ertolupi of the Vicenza Thunders Team: http://www.VicenzaThunders.com

leo72


usando define però non posso usare PROGMEM, no?

#define x y istruisce il compilatore a sostituire nel testo tutte le corrispondenze di "x" con "y", PROGMEM serve invece a dire al compilatore che i dati sono da prelevare dalla Flash.
Con #define non cambi solo dei valori ma puoi anche sostituire ad una parola chiave un qualcosa d'altro. Ad esempio PROGMEM è un alias creato con #define:
Code: [Select]

#define PROGMEM   __ATTR_PROGMEM__

che può essere poi riutilizzato:
Code: [Select]
#define PSTR ( s )   ((const PROGMEM char *)(s))


astrobeed


Con #define non cambi solo dei valori ma puoi anche sostituire ad una parola chiave un qualcosa d'altro.


Con la define puoi anche creare delle macro, ovvero del codice vero e proprio collegato ad una parola chiave, p.e. cbi() e sbi() (clear bit e set bit) che vengono implementate tramite define:

Code: [Select]

#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))


qsecofr




ho dovuto complicarlo un po' perchè questo  compilatore non è proprio tanto rinc0glionito... fa delle ottimizzazioni non esattamente scontate...


Non è semplice, anche con poche righe di codice, capire cosa combina il compilatore e come ottimizza, spesso e volentieri il solo modo per verificare rapidamente se c'è stato un guadagno, o una perdita, di velocità sul nostro codice è fare delle misure strumentali.
Più tardi faccio un paio di prove, mirate a rilevare la reale differenza in cicli macchina tra l'uso di const e define, con l'utilizzo dell'analizzatore di stati logici in modo da poter misurare con precisione l'effettiva differenza.



si be ma l'assembler non mente... le due assegnazioni vengono tradotte proprio uguale come ha confermato il mio codice e anche leo. Ora si potrebbe discquisire se questi adeguamenti avvengono sempre in modo uguale oppure delle volte le costanti vengono effettivamente memorizzate in ram come sarebbe logico supporre (ma che non avviene).
...comunque veramente incredibile cosa fa il compilatore... se fai di seguito  ciccio = b; ciccio = c;... toglie proprio ciccio = b;

Go Up