Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Il compilatore applica i NOT sulle costanti?

Raccolta di codici sorgenti

Moderatore: Foto UtentePaolino

1
voti

[11] Re: Il compilatore applica i NOT sulle costanti?

Messaggioda Foto UtenteCandy » 10 giu 2016, 11:37

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.
Avatar utente
Foto UtenteCandy
32,5k 7 10 13
CRU - Account cancellato su Richiesta utente
 
Messaggi: 10123
Iscritto il: 14 giu 2010, 22:54

1
voti

[12] Re: Il compilatore applica i NOT sulle costanti?

Messaggioda Foto UtenteBrianz » 10 giu 2016, 12:00

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.
Avatar utente
Foto UtenteBrianz
5.828 5 10
CRU - Account cancellato su Richiesta utente
 
Messaggi: 858
Iscritto il: 24 mar 2016, 11:27

1
voti

[13] Re: Il compilatore applica i NOT sulle costanti?

Messaggioda Foto UtenteSjuanez » 10 giu 2016, 12:09

Dunque, sto studiando le maschere su un libro* che sono certo abbia letto anche Foto Utentepaofanello.

Quindi Foto Utentegotthard 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ì:
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 Foto Utentepaofanello, 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.

Foto Utentesimo85, purtroppo non so fare quello che mi suggerisci. Non dimenticare che sono al mio primo rocchetto di stagno :oops:

*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.
Avatar utente
Foto UtenteSjuanez
11,3k 6 8 13
G.Master EY
G.Master EY
 
Messaggi: 3479
Iscritto il: 18 mar 2015, 13:48

2
voti

[14] Re: Il compilatore applica i NOT sulle costanti?

Messaggioda Foto Utenteluxinterior » 10 giu 2016, 12:30

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)
Avatar utente
Foto Utenteluxinterior
4.311 3 4 9
Master EY
Master EY
 
Messaggi: 2690
Iscritto il: 6 gen 2016, 17:48

2
voti

[15] Re: Il compilatore applica i NOT sulle costanti?

Messaggioda Foto Utentepaofanello » 10 giu 2016, 12:39

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.
Avatar utente
Foto Utentepaofanello
2.280 8 13
Expert
Expert
 
Messaggi: 532
Iscritto il: 7 lug 2015, 21:01

0
voti

[16] Re: Il compilatore applica i NOT sulle costanti?

Messaggioda Foto UtenteSjuanez » 10 giu 2016, 12:42

:ok: O_/
Più so e più mi accorgo di non sapere.

Qualsiasi cosa abbia scritto, tieni presente che sono ancora al mio primo rocchetto di stagno.
Avatar utente
Foto UtenteSjuanez
11,3k 6 8 13
G.Master EY
G.Master EY
 
Messaggi: 3479
Iscritto il: 18 mar 2015, 13:48

0
voti

[17] Re: Il compilatore applica i NOT sulle costanti?

Messaggioda Foto UtenteSandroCalligaro » 10 giu 2016, 16:30

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).
Avatar utente
Foto UtenteSandroCalligaro
2.970 2 4 5
G.Master EY
G.Master EY
 
Messaggi: 1181
Iscritto il: 6 ago 2015, 19:25

0
voti

[18] Re: Il compilatore applica i NOT sulle costanti?

Messaggioda Foto Utentepaofanello » 10 giu 2016, 16:40

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.
Avatar utente
Foto Utentepaofanello
2.280 8 13
Expert
Expert
 
Messaggi: 532
Iscritto il: 7 lug 2015, 21:01

2
voti

[19] Re: Il compilatore applica i NOT sulle costanti?

Messaggioda Foto UtenteSandroCalligaro » 10 giu 2016, 16:42

Su una const c'è comunque, in compilazione, la "protezione" da una scrittura accidentale (posto che non venga fatta in modo non "tracciabile", tramite puntatore).
Avatar utente
Foto UtenteSandroCalligaro
2.970 2 4 5
G.Master EY
G.Master EY
 
Messaggi: 1181
Iscritto il: 6 ago 2015, 19:25

2
voti

[20] Re: Il compilatore applica i NOT sulle costanti?

Messaggioda Foto Utentepaofanello » 10 giu 2016, 16:46

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 :ok:
Piuttosto che chiedere qualcosa a me, chiedila a Mara Maionchi. E' più competente.
Avatar utente
Foto Utentepaofanello
2.280 8 13
Expert
Expert
 
Messaggi: 532
Iscritto il: 7 lug 2015, 21:01

PrecedenteProssimo

Torna a Firmware e programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 8 ospiti