Per l'esperienza che ho, ed il codice analizzato, in caso di calcolo su costanti, il compilatore tende ad ottimizzare e ridurre ad una unica costante.
Ovviamente hanno molta influenza tutte le parametrizzazioni ed ottimizzazioni richieste.
Il compilatore applica i NOT sulle costanti?
Moderatore:
Paolino
21 messaggi
• Pagina 2 di 3 • 1, 2, 3
1
voti
Forse il problema è arduinico, nel senso che se scrivo istruzioni per effettuare un calcolo, ho chiaro cosa si svolge; però il micro effettua un monte di calcoli che non vedo quando usa una libreria o una funzione già pronta.
Però non è questo il caso, mi pare: se parliamo di una costante pre definita attraverso una formula qualsiasi (di cui il compilatore, qualsiasi compilatore di qualsiasi linguaggio, ha il modo e gli elementi per risolverla), dato che appunto è una costante, viene calcolata dal compilatore stesso e sarà usata dal programma nella sua forma numerica.
Però non è questo il caso, mi pare: se parliamo di una costante pre definita attraverso una formula qualsiasi (di cui il compilatore, qualsiasi compilatore di qualsiasi linguaggio, ha il modo e gli elementi per risolverla), dato che appunto è una costante, viene calcolata dal compilatore stesso e sarà usata dal programma nella sua forma numerica.
-

Brianz
5.828 5 10 - CRU - Account cancellato su Richiesta utente
- Messaggi: 858
- Iscritto il: 24 mar 2016, 11:27
1
voti
Dunque, sto studiando le maschere su un libro* che sono certo abbia letto anche
paofanello.
Quindi
gotthard la domanda è molto generica e non si riferisce ad una riga di codice preciso in un contesto preciso, per facciamo questo esempio banale:
io voglio resettare a 0 il bit n°2 e per farlo voglio usare una maschera in un'operazione AND.
Fin qui credo che ci siamo tutti.
Nell'operazione ci sono una variabile (il byte che mi troverò al momento) e una costante (la maschera che deve essere 0b11111011)
Siccome a scrivere i bit uno ad uno è anche facile che ci si sbagli, il mio libro mi suggerisce di ricavare la maschera così: ~(1 << 2). Non vi devo spiegare io che significa, ovviamente.
Quindi avrò in ogni loop questo valore assegnato alla maschera e lo applicherò alla variabile così:
Sarebbe più vantaggio se passare al compilatore qualcosa tipo il codice seguente?
Come aveva intuito
paofanello, mi domandavo se il compilatore si prenderà la briga di fare questo calcolo e passare il byte giusto al micro, oppure il micro ad ogni loop si rifà il calcolo della maschera. E se questo deve in qualche modo preoccuparmi.
simo85, purtroppo non so fare quello che mi suggerisci. Non dimenticare che sono al mio primo rocchetto di stagno
*Makd: AVR Programming
Quindi
io voglio resettare a 0 il bit n°2 e per farlo voglio usare una maschera in un'operazione AND.
Fin qui credo che ci siamo tutti.
Nell'operazione ci sono una variabile (il byte che mi troverò al momento) e una costante (la maschera che deve essere 0b11111011)
Siccome a scrivere i bit uno ad uno è anche facile che ci si sbagli, il mio libro mi suggerisce di ricavare la maschera così: ~(1 << 2). Non vi devo spiegare io che significa, ovviamente.
Quindi avrò in ogni loop questo valore assegnato alla maschera e lo applicherò alla variabile così:
- Codice: Seleziona tutto
PORTB &= ~(1 <<2);
Sarebbe più vantaggio se passare al compilatore qualcosa tipo il codice seguente?
- Codice: Seleziona tutto
PORTB &= 0b11111011;
Come aveva intuito
*Makd: AVR Programming
Più so e più mi accorgo di non sapere.
Qualsiasi cosa abbia scritto, tieni presente che sono ancora al mio primo rocchetto di stagno.
Qualsiasi cosa abbia scritto, tieni presente che sono ancora al mio primo rocchetto di stagno.
2
voti
ll compilatore sostituisce formule e calcoli fin dove può con un numero quindi
int a ;
a = (3<<2) +(1 - 4*7) si traduce in una istruzione assembler che carica nella variabile a un valore costante che è il risultato delle operazioni scritte Calcolo che viene fatto in fase di compilazione
int a,b ;
a = b + (3<<2) +(1 - 4*7)
è la stessa cosa ma non si può tradurre in una semplcie istruzione di caricamento della variabile a
dipende da come viene tradotta l'istruzione ma in pratica si carica in un registro il valroe di B e si somma il numero costante risultato delle operazioni calcolate in fase di compilazione.
scrivere
const int a ;
ha un altro significato const definisce un valore non modificabile. Il segmento che contiene le varibili gloabli dicharate const, in un micro normalmente è memorizzato in flash proprio perché contine dati costanti non alterabili. Ma const può anche essere dichiarata una variabile all'interno di una funzione o i suoi parametri di ingresso. La variabile in quesot caso si trova in ram ( ad es. i parametri di ingresso di uan funzione sono sullo stack). L'attributo const però la rende non alterabile all'interno della funzione e una sua modifica (..un suo tentativo di modifica) viene segnalata come errore in fase di compilazione. E' una verifica che spetta al compilatore che "si rifiuta" di tradurre el operazioni di assegnazione a una variabile const.
Si potrebbe arrivare alla variabile const tramite un puntatore (il micro in runtime non conosce le variabili const) ma non so se il compilatore se ne accorge, secondo me sì ma non ho mai provato.
(Anche perché dichiarare const uan variabile che poi si vuole modificare ha poco senso...anzi nessuno)
int a ;
a = (3<<2) +(1 - 4*7) si traduce in una istruzione assembler che carica nella variabile a un valore costante che è il risultato delle operazioni scritte Calcolo che viene fatto in fase di compilazione
int a,b ;
a = b + (3<<2) +(1 - 4*7)
è la stessa cosa ma non si può tradurre in una semplcie istruzione di caricamento della variabile a
dipende da come viene tradotta l'istruzione ma in pratica si carica in un registro il valroe di B e si somma il numero costante risultato delle operazioni calcolate in fase di compilazione.
scrivere
const int a ;
ha un altro significato const definisce un valore non modificabile. Il segmento che contiene le varibili gloabli dicharate const, in un micro normalmente è memorizzato in flash proprio perché contine dati costanti non alterabili. Ma const può anche essere dichiarata una variabile all'interno di una funzione o i suoi parametri di ingresso. La variabile in quesot caso si trova in ram ( ad es. i parametri di ingresso di uan funzione sono sullo stack). L'attributo const però la rende non alterabile all'interno della funzione e una sua modifica (..un suo tentativo di modifica) viene segnalata come errore in fase di compilazione. E' una verifica che spetta al compilatore che "si rifiuta" di tradurre el operazioni di assegnazione a una variabile const.
Si potrebbe arrivare alla variabile const tramite un puntatore (il micro in runtime non conosce le variabili const) ma non so se il compilatore se ne accorge, secondo me sì ma non ho mai provato.
(Anche perché dichiarare const uan variabile che poi si vuole modificare ha poco senso...anzi nessuno)
-

luxinterior
4.311 3 4 9 - Master EY

- Messaggi: 2690
- Iscritto il: 6 gen 2016, 17:48
2
voti
Qui fanno vedere un esempio (con relativo codice assembly) e dicono che i calcoli li fa il compilatore. Su pagine simili dicono la stessa cosa con qualche eccezione: essenzialmente il compilatore lo dovrebbe fare, ma non c'è la certezza, dipende sia dal compilatore che dai calcoli che deve fare.
Piuttosto che chiedere qualcosa a me, chiedila a Mara Maionchi. E' più competente.
-

paofanello
2.280 8 13 - Expert

- Messaggi: 532
- Iscritto il: 7 lug 2015, 21:01
0
voti
Si potrebbe arrivare alla variabile const tramite un puntatore (il micro in runtime non conosce le variabili const) ma non so se il compilatore se ne accorge, secondo me sì ma non ho mai provato.
In genere direi che non può accorgersene.
L'indirizzo a cui si punta potrebbe venire da un calcolo, o dall'esterno (ad esempio, un utente chiede via seriale di scrivere un dato in una certa locazione), il che renderebbe il comportamento non prevedibile a priori.
Un controllo del genere mi sembra più affare da tool di verifica della consistenza del codice secondo qualche standard (ad esempio, se ricordo bene, lo standard MISRA C non permette l'uso dei puntatori, o quasi).
-

SandroCalligaro
2.970 2 4 5 - G.Master EY

- Messaggi: 1181
- Iscritto il: 6 ago 2015, 19:25
0
voti
SandroCalligaro ha scritto:In genere direi che non può accorgersene.
Ho letto proprio ieri sul libro "C: a modern approach" che è possibile modificare un variabile dichiarata const in una funzione tramite puntatore. In effetti non comportando una locazione diversa rispetto alle variabili dice che il più delle volte si usa solo per rendere il programma più leggibile, più che per "blocco di sicurezza"
Piuttosto che chiedere qualcosa a me, chiedila a Mara Maionchi. E' più competente.
-

paofanello
2.280 8 13 - Expert

- Messaggi: 532
- Iscritto il: 7 lug 2015, 21:01
2
voti
Su una const c'è comunque, in compilazione, la "protezione" da una scrittura accidentale (posto che non venga fatta in modo non "tracciabile", tramite puntatore).
-

SandroCalligaro
2.970 2 4 5 - G.Master EY

- Messaggi: 1181
- Iscritto il: 6 ago 2015, 19:25
2
voti
Certo, infatti è una sicurezza dichiarare const una variabile in una funzione, ma solo una sicurezza per il programmatore un poco sbadato, non porta altri vantaggi, e la variabile risulta comunque modificabile tramite puntatore, ma, anche se si sa di essere un programmatore attento, dichiarare le variabili che non devono cambiare valore come const migliora la leggibilità del codice dagli esterni, questo intende il libro 

Piuttosto che chiedere qualcosa a me, chiedila a Mara Maionchi. E' più competente.
-

paofanello
2.280 8 13 - Expert

- Messaggi: 532
- Iscritto il: 7 lug 2015, 21:01
21 messaggi
• Pagina 2 di 3 • 1, 2, 3
Torna a Firmware e programmazione
Chi c’è in linea
Visitano il forum: Nessuno e 8 ospiti

Elettrotecnica e non solo (admin)
Un gatto tra gli elettroni (IsidoroKZ)
Esperienza e simulazioni (g.schgor)
Moleskine di un idraulico (RenzoDF)
Il Blog di ElectroYou (webmaster)
Idee microcontrollate (TardoFreak)
PICcoli grandi PICMicro (Paolino)
Il blog elettrico di carloc (carloc)
DirtEYblooog (dirtydeeds)
Di tutto... un po' (jordan20)
AK47 (lillo)
Esperienze elettroniche (marco438)
Telecomunicazioni musicali (clavicordo)
Automazione ed Elettronica (gustavo)
Direttive per la sicurezza (ErnestoCappelletti)
EYnfo dall'Alaska (mir)
Apriamo il quadro! (attilio)
H7-25 (asdf)
Passione Elettrica (massimob)
Elettroni a spasso (guidob)
Bloguerra (guerra)

