Go Down

Topic: analogici usati da digitali.. (Read 3697 times) previous topic - next topic

leo72

Aspe, ho scritto che i "valori" dei #define e delle const vengono salvati in flash direttamente. Se si disassembla il firmware compilato con #define oppure con const byte si vedrà che c'è il caricamento diretto del valore specificato nel registro che viene usato per eseguire l'istruzione.

Per il resto si tratta di differenze fra l'uso di un sistema di definizione di una costante (#define o const) e l'uso di una variabile "normale". In questo secondo caso si va ad occupare RAM inutilmente.

astrobeed


n questo secondo caso si va ad occupare RAM inutilmente.


Non solo occupi ram inutilmente, ma pure il linguaggio macchina derivante è più complesso e più lento perché i dati devono essere recuperati da una zona della memoria invece di essere disponibili subito, ovvero più istruzioni assembly e più cicli macchina per nulla.
Scientia potentia est

PaoloP

Ho visto alcuni sketch dove invece di
Code: [Select]
#define pinled 13
scrivevano
Code: [Select]
#define pinled (byte)13

Però non ho notato variazioni di dimensioni nel file compilato.

nid69ita

#18
May 01, 2013, 02:36 pm Last Edit: May 01, 2013, 05:55 pm by nid69ita Reason: 1

Ho visto alcuni sketch dove invece di
Code: [Select]
#define pinled 13
scrivevano
Code: [Select]
#define pinled (byte)13
Però non ho notato variazioni di dimensioni nel file compilato.


Se si disassembla il firmware compilato con #define oppure con const byte si vedrà che c'è il caricamento diretto del valore specificato nel registro che viene usato per eseguire l'istruzione.


Non che non mi fidassi, ma @Leo ha ragione, il compilatore è così intelligente che la const non viene memorizzata e poi letta ma caricata direttamente nei registri come se fosse un valore numerico immediato.      ( assembly:    ldi r24,lo8(13)  identico !!!)

Però tra const e #define c'e' una differenza piccola ma forse può influire sul codice macchina generato. Nella const siamo costretti a dichiararne il tipo mentre con la define no.  
Credo che fare la define con cast come @paolop ha riportato, può aiutare il compilatore.

Certo che a voler essere pignoli anche dichiarare:
 const int PINxx=13;
invece di byte è una piccola cavolata. Sembra che il compilatore usi un valore a 16 invece che a 8 bit (non ottimizza)
my name is IGOR, not AIGOR

leo72

L'uso delle #define è una eredità del C. Nel C++ le #define ho notato che tendono ad eliminarle in favore delle costanti dichiarate con "const". Così scrive anche Stroustrup (l'autore del C++) nella sua guida.
Personalmente non ho una preferenza per l'uno o l'altro sistema, però per usare un metodo unico sto iniziando anch'io ad usare "const" per definire valori fissi. In questo modo posso specificare anche il tipo, evitando quindi dubbi al compilatore che poi potrebbe risolvere come gli pare a lui  ;)

nid69ita

Nel mio post precedente mi è sfuggito un non.   Volevo dire che mi fido delle dichiarazioni di @leo

Comunque:  tendenzialmente mi fidavo di più ad usare la  #define per un semplice motivo. Credevo che la const fosse una variabile di tipo read-only e che per questo occupasse lo spazio di una variabile.
Adesso mi son ricreduto e visto che ne dichiari pure il tipo, adotterò anche io la const a scapito della #define per le costanti.
W la const, M la #define   :smiley-mr-green:
my name is IGOR, not AIGOR

PaoloP

#21
May 01, 2013, 06:59 pm Last Edit: May 01, 2013, 07:01 pm by PaoloP Reason: 1
[OT]
Regole per il C++ --> http://www.doc.ic.ac.uk/lab/cplus/c++.rules/chap20.html

La mia preferita
Quote from: Rule 49

Never use goto.

nid69ita

Questa mi fa ridere:
>> Rule 6: All comments are to be written in English.
my name is IGOR, not AIGOR

astrobeed


La mia preferita
Quote from: Rule 49

Never use goto.



Ottima anche questa (quando si lavora con le piccole mcu).

Code: [Select]

Rule 50
Do not use malloc, realloc or free.

Scientia potentia est

gpb01

#24
May 01, 2013, 08:49 pm Last Edit: May 01, 2013, 09:03 pm by gpb01 Reason: 1

Ottima anche questa (quando si lavora con le piccole mcu).

Code: [Select]

Rule 50
Do not use malloc, realloc or free.



Mentre concordo pienamente nel NON uso del goto, concordo un po' meno sul totale non uso del malloc,realloc e free ... che direi si possono usare anche su piccole mcu, ma "cum grano salis".

Difatti ci sono casi in cui sono molto comode e si possono "usare" ... sicuramente NON abusare !!! ;)

Guglielmo

P.S. : Comunque siamo sulla stessa linea ... il K&R è praticamente "la Bibbia" XD
Search is Your friend ... or I am Your enemy !

Go Up