Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Tempo di accesso a un vettore

Raccolta di codici sorgenti

Moderatore: Foto UtentePaolino

0
voti

[1] Tempo di accesso a un vettore

Messaggioda Foto UtenteEcoTan » 15 mar 2025, 9:34

............
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?
Avatar utente
Foto UtenteEcoTan
7.720 4 12 13
Expert EY
Expert EY
 
Messaggi: 5421
Iscritto il: 29 gen 2014, 8:54

0
voti

[2] Re: Tempo di accesso a un vettore

Messaggioda Foto Utentedjnz » 15 mar 2025, 11:14

L'operazione da svolgere è:

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.
Avatar utente
Foto Utentedjnz
1.590 1 4 7
Master
Master
 
Messaggi: 708
Iscritto il: 26 lug 2020, 14:52

0
voti

[3] Re: Tempo di accesso a un vettore

Messaggioda Foto UtenteEcoTan » 15 mar 2025, 12:12

OK grazie. La MCU in questione è dsPic, sicuramente può usare i registri.
Avatar utente
Foto UtenteEcoTan
7.720 4 12 13
Expert EY
Expert EY
 
Messaggi: 5421
Iscritto il: 29 gen 2014, 8:54

0
voti

[4] Re: Tempo di accesso a un vettore

Messaggioda Foto Utentedjnz » 16 mar 2025, 10:00

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.
Avatar utente
Foto Utentedjnz
1.590 1 4 7
Master
Master
 
Messaggi: 708
Iscritto il: 26 lug 2020, 14:52

0
voti

[5] Re: Tempo di accesso a un vettore

Messaggioda Foto UtenteEcoTan » 16 mar 2025, 10:09

djnz ha scritto: 91 cicli di clock

Hai sommato i cicli delle diverse istruzioni?
Avatar utente
Foto UtenteEcoTan
7.720 4 12 13
Expert EY
Expert EY
 
Messaggi: 5421
Iscritto il: 29 gen 2014, 8:54

0
voti

[6] Re: Tempo di accesso a un vettore

Messaggioda Foto Utentedjnz » 16 mar 2025, 10:33

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.
Avatar utente
Foto Utentedjnz
1.590 1 4 7
Master
Master
 
Messaggi: 708
Iscritto il: 26 lug 2020, 14:52

0
voti

[7] Re: Tempo di accesso a un vettore

Messaggioda Foto UtenteEcoTan » 16 mar 2025, 11:39

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à.
Avatar utente
Foto UtenteEcoTan
7.720 4 12 13
Expert EY
Expert EY
 
Messaggi: 5421
Iscritto il: 29 gen 2014, 8:54

1
voti

[8] Re: Tempo di accesso a un vettore

Messaggioda Foto Utentegvee » 16 mar 2025, 19:28

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.
Avatar utente
Foto Utentegvee
1.475 5 7
Sostenitore
Sostenitore
 
Messaggi: 525
Iscritto il: 11 feb 2018, 20:34

0
voti

[9] Re: Tempo di accesso a un vettore

Messaggioda Foto Utenteluxinterior » 16 mar 2025, 19:53

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

1
voti

[10] Re: Tempo di accesso a un vettore

Messaggioda Foto Utenteboiler » 16 mar 2025, 20:06

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 :mrgreen:
Avatar utente
Foto Utenteboiler
26,4k 5 9 13
G.Master EY
G.Master EY
 
Messaggi: 5600
Iscritto il: 9 nov 2011, 12:27

Prossimo

Torna a Firmware e programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 8 ospiti