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

[1] Il compilatore applica i NOT sulle costanti?

Messaggioda Foto UtenteSjuanez » 10 giu 2016, 9:16

Ho una domanda da principiante:

Se nel codice in C per un ATMEGA (o un micro in genere) scrivo qualcosa come ~(1 << 2) , il compilatore farà l'operazione oppure viene lasciata a carico del micro?

E, nel secondo caso, conviene forse scrivere direttamente 0b11111011 ?

Ho la sensazione che siano solo seghe mentali, ma chiedere non guasta.

O_/ O_/ 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

2
voti

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

Messaggioda Foto Utentesimo85 » 10 giu 2016, 10:05

Sjuanez ha scritto:il compilatore farà l'operazione oppure viene lasciata a carico del micro?

Cosa intendi esattamente ?

Il compilatore genera un file binario che può essere tradotto dal micro.
Puoi comunque disassemblare il codice per vedere cosa fa. Dal file binario puoi sempre fare un objdump per vedere cosa c'è dentro (vedere le istruzioni Assembly e relativo operand code).
Avatar utente
Foto Utentesimo85
30,9k 7 12 13
Disattivato su sua richiesta
 
Messaggi: 9927
Iscritto il: 30 ago 2010, 4:59

0
voti

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

Messaggioda Foto UtenteSjuanez » 10 giu 2016, 10:23

Beh, quelle cose ancora non so leggerle :oops:

In ogni modo intendevo il caso in cui, per comodità, si definisce un byte e poi se ne fa il contrario con NOT. Ad esempio nella costruzione delle maschere.

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

2
voti

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

Messaggioda Foto Utentesimo85 » 10 giu 2016, 10:40

Il compilatore fa da traduttore.
I calcoli li fa il micro.

Quando esegui il firmware nell' ATmega, questo viene eseguito nel micro non nel computer dove lo hai compilato. ;-)
Avatar utente
Foto Utentesimo85
30,9k 7 12 13
Disattivato su sua richiesta
 
Messaggi: 9927
Iscritto il: 30 ago 2010, 4:59

1
voti

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

Messaggioda Foto UtenteSjuanez » 10 giu 2016, 11:01

Interessante, grazie. :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

3
voti

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

Messaggioda Foto UtenteSandroCalligaro » 10 giu 2016, 11:10

Il compilatore fa da traduttore.
I calcoli li fa il micro.

I calcoli sulle costanti non avrebbe senso che sia il micro ad eseguirli.

Non ho molta esperienza in proposito (nel senso che non sono andato così spesso a guardare l'assembly), ma per quel che ho visto purtroppo il risultato della compilazione dipende dal compilatore e dalle ottimizzazioni attivate.
Un compilatore "furbo" potrebbe ad esempio compilare
Codice: Seleziona tutto
a = b/(2/1);

(con a e b interi) come
Codice: Seleziona tutto
a = b>>1;

mentre un compilatore più "stupido" potrebbe eseguire pedissequamente tutti i conti.

E' evidente che l'assembly del compilatore "stupido" sarebbe molto meno efficiente, senza dare alcuna differenza nel risultato.

PS: non mi riferisco al caso dell'ATMEGA, che praticamente non ho mai usato, il discorso è generale.
Ultima modifica di Foto UtenteSandroCalligaro il 10 giu 2016, 11:14, modificato 3 volte in totale.
Avatar utente
Foto UtenteSandroCalligaro
2.970 2 4 5
G.Master EY
G.Master EY
 
Messaggi: 1181
Iscritto il: 6 ago 2015, 19:25

1
voti

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

Messaggioda Foto Utentepaofanello » 10 giu 2016, 11:11

Un attimo... Non se Foto Utentesimo85 hai capito ciò che vuole sapere Foto UtenteSjuanez (credo di averlo intuito):
Scrivere direttamente il byte in linguaggio binario (0b11111011) è scomodo e risulta di difficile comprensione per qualcuno di esterno che vede il codice.
Quindi di solito si consiglia un approccio di operazioni sui byte come quello che riporta Foto UtenteSjuanez ~(1 << 2) ancora meglio se al posto dei numeri si usano i nomi dei bit delle porte digitali (ad esempio).
Ma, quello che penso si chieda lui è:
- nel primo caso il micro prende il byte scritto direttamente e ci fa quello che ci deve fare
- nel secondo caso si prende un byte, si "applica" uno scorrimento, e si inverte
Così, su due piedi, sembrerebbe che nel primo caso il micro esegua in una sola istruzione tutto, nel secondo caso che gliene servano 3... ma queste "3 istruzioni" vengono fatte dal micro ogni volta che si ha l'assegnazione in questione (rallentando il tutto) oppure il compilatore calcola il byte "costante" che si ottiene dopo questi 3 passaggi e scrive nella memoria del micro solo il risultato finale dell'espressione?
Per quello che so io (che è poco, quindi correggetemi se sbaglio) il calcolo lo fa il compilatore, quindi l'operazione non pesa sulla velocità del programma del micro.
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

1
voti

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

Messaggioda Foto Utentegotthard » 10 giu 2016, 11:14

simo85 ha scritto:Quando esegui il firmware nell' ATmega, questo viene eseguito nel micro non nel computer dove lo hai compilato.

Bè, quello è vero.

Però, ad esempio, se per "costante" Foto UtenteSjuanez intendesse una macro, questa verrebbe risolta dal compilatore, e quindi il NOT verrebbe sicuramente eseguito in compile-time.

Nel caso in cui per "costante" si intendesse una variabile dichiarata con il qualificatore const o in qualsiasi altro caso, purtroppo non so se l' operazione la si fa in compile-time o in run-time.

Purtroppo sono abbastanza ignorante su ciò che riguarda cosa avviene precisamente "dietro le quinte" nel periodo di tempo che va dalla fase di compilazione a quella dell' esecuzione vera e propria del codice. :?

PS: Foto UtenteSjuanez, puoi postare la riga di codice in questione per intero?
...\frac{\mathrm{d} p}{\mathrm{d} t}=JCM... :!:
Avatar utente
Foto Utentegotthard
4.611 2 5 9
Expert EY
Expert EY
 
Messaggi: 1357
Iscritto il: 5 lug 2013, 14:01

1
voti

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

Messaggioda Foto UtenteSandroCalligaro » 10 giu 2016, 11:20

Nel caso in cui per "costante" si intendesse una variabile dichiarata con il qualificatore const o in qualsiasi altro caso, purtroppo non so se l' operazione la si fa in compile-time o in run-time.

Nel caso di const sono quasi certo che il calcolo venga eseguito dal micro.

Per l'altro caso, che sia una sostituzione (con #define) o siano dei numeri scritti direttamente la cosa non cambia, appunto perché la sostituzione della stringa nel codice C viene effettuata prima della compilazione.
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

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

Messaggioda Foto Utentesimo85 » 10 giu 2016, 11:30

Basta che Foto UtenteSjuanez dichiari una funzione nel preprocessore e faccia un disassembling del codice per vedere cosa fa.

Se poi riporta i risultati buon per tutti.

O_/
Avatar utente
Foto Utentesimo85
30,9k 7 12 13
Disattivato su sua richiesta
 
Messaggi: 9927
Iscritto il: 30 ago 2010, 4:59

Prossimo

Torna a Firmware e programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite