............
int aux;
int seno[360];//vettore seno x 10000
int main (void) {
............//riempimento del vettore
elabora: aux=seno[45];
........}
Quanto tempo di elaborazione consuma l'istruzione aux=seno[45]; posta nel main di una MCU?
Accede per tentativi o punta direttamente? Dipende dal compilatore?
Tempo di accesso a un vettore
Moderatore:
Paolino
12 messaggi
• Pagina 1 di 2 • 1, 2
0
voti
L'operazione da svolgere è:
Se l'hardware lo permette, indirizzo vettore può essere caricato in un registro e la somma viene eseguita in hardware durante l'accesso al dato.
Se non lo permette, si fanno "a mano" tutti i passi.
Nel caso in questione il compilatore considera quell'accesso equivalente a:
dove il 45 è implicitamente moltiplicato per la dimensione del tipo dato se superiore a un byte (shift a sinistra di N bit)
In assembly Z80 ad esempio è un'operazione che richiederebbe parecchi passaggi (per la bellezza di 91 cicli di clock):
- Codice: Seleziona tutto
indirizzo valore = indirizzo vettore + (indice * lunghezza tipo dato)
Se l'hardware lo permette, indirizzo vettore può essere caricato in un registro e la somma viene eseguita in hardware durante l'accesso al dato.
Se non lo permette, si fanno "a mano" tutti i passi.
Nel caso in questione il compilatore considera quell'accesso equivalente a:
- Codice: Seleziona tutto
aux = *(seno+45)
dove il 45 è implicitamente moltiplicato per la dimensione del tipo dato se superiore a un byte (shift a sinistra di N bit)
In assembly Z80 ad esempio è un'operazione che richiederebbe parecchi passaggi (per la bellezza di 91 cicli di clock):
- Codice: Seleziona tutto
LD HL,45 ; indice
ADD HL,HL ; tipo dato a 16 bit
LD DE,seno ; indirizzo vettore
ADD HL,DE ; indirizzo valore
LD E,(HL) ; legge byte basso
INC HL
LD D,(HL) ; legge byte alto
LD (aux),DE ; scrive valore nella variabile
Una domanda ben posta è già mezza risposta.
0
voti
Mi sono espresso male. Un indirizzo calcolato a runtime viene sempre caricato su un registro con funzione di puntatore, ma il modo in cui questo registro può essere usato dall'hardware dipende dalle modalità di indirizzamento permesse. Questo fa la differenza tra un'operazione di accesso/lettura singola, e più operazioni. Non conoscendo l'asm dei dsPIC non ti so dire.
Una domanda ben posta è già mezza risposta.
0
voti
Esatto. Nal tuo caso bisognerebbe vedere l'assembly prodotto dal compilatore relativo a quell'accesso a vettore, e sommare i tempi delle istruzioni.
Una domanda ben posta è già mezza risposta.
0
voti
Esatto. I dsPic col compilatore Microchip student free li trovo meravigliosi, ho fatto uso libero degli interrupt e nessun problema. Passando al pic32 è crollato il mondo, manca la macroistruzione per dichiarare le ISR e addio libertà.
1
voti
Non ha senso che acceda per tentativi. Quando dichiari un array, viene riservata una zona di memoria di N elementi quindi la CPU sà quale è la direzione di memoria e offset, attraverso le istruzioni ovviamente.
Il tempo di esecuzione dipende dalla frequenza di clock della CPU, dall'architettura della stessa e dal tempo load e store.
Il tempo di esecuzione dipende dalla frequenza di clock della CPU, dall'architettura della stessa e dal tempo load e store.
0
voti
Purtroppo non mi è chiaro quello che vuoi fare
I compilatori solitamente hanno delle opzioni per ottimizzare il codice in base a certi criteri e tra questi c'è la velocità di esecuzione.
Se devi memorizzare la tabella di una funzione trigonometrica ti conviene calcolarla a priori ad esempio in excel e poi memorizzare la tabella statica nel codice (Sempre che tu possa farlo)
Altro suggerimento ti basta memorizzare un vettore con 1/4 dei punti totali poi ti ricavi facilmente gli altri con semplici operazioni sull'indice
I compilatori solitamente hanno delle opzioni per ottimizzare il codice in base a certi criteri e tra questi c'è la velocità di esecuzione.
Se devi memorizzare la tabella di una funzione trigonometrica ti conviene calcolarla a priori ad esempio in excel e poi memorizzare la tabella statica nel codice (Sempre che tu possa farlo)
Altro suggerimento ti basta memorizzare un vettore con 1/4 dei punti totali poi ti ricavi facilmente gli altri con semplici operazioni sull'indice
-

luxinterior
4.311 3 4 9 - Master EY

- Messaggi: 2690
- Iscritto il: 6 gen 2016, 17:48
1
voti
djnz ha scritto:Nel caso in questione il compilatore considera quell'accesso equivalente a:
- Codice: Seleziona tutto
aux = *(seno+45)
Esatto, e visto che la somma è commutativa, puoi farti odiare da chiunque debba capire cosa fa quel codice scrivendo
- Codice: Seleziona tutto
aux = 45[seno];
Boiler
12 messaggi
• Pagina 1 di 2 • 1, 2
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)






