Ottimizzare moltiplicazione per 13 (PIC)

Apr 06, 2004 8 Replies

Ciao a tutti! Lavoro in C con un PIC18f458 Devo moltiplicare un numero intero (8 bit) per la costante 13. Chiedo se qualcuno sa consigliarmi un metodo veloce per farlo, tipo shift... ma in questo caso penso che una soluzione con shift non sia fattibile L'unica idea che ho al momento è impiegare un array con tutte le moltiplicazioni già calcolate... Altre idee?



Grazie!


Premetto che non conosco quel PIC. Se il problema è calcolare x*13, allora si può scrivere: x*13 = x*(8+4+1) = 8*x + 4*x + x a questo punto, indicando con il simbolo "

Grazie 1000! Ti chiedo un'altra cosa: sapresti farmi una stima di quanto si migliora passando dal moltiplicare per 13 al tuo sistema? Anche un grosso modo, giusto per capire se conviene quello che mi hai illustrato oppure usare un lut...

Grazie ancora! Ciao!

Mi sono documentato meglio riguardo il PIC 18F458. Nel tuo caso la cosa più veloce credo sia usare l'istruzione MULLW 13 (pagina 308 del datasheet) che ti mette nei registri PRODH e PRODL rispettivamente la parte alta e bassa del risultato della moltiplicazione di W*13. Questa istruzione impiega 1 solo ciclo di esecuzione. L'implementazione del metodo degli shift impiegherebbe (a occhio) una decina di cicli. Ti avevo proposto questa soluzione perchè non credevo che il tuo PIC avesse l'istruzione MULLW.

La look up table (se è questo che intendi per "lut") non credo sia una soluzione efficiente per quanto riguarda l'occupazione di memoria.

Simone

Ho capito... Allora uso direttamente la moltiplicazione per 13 senza passare in asm, tanto il compilatore C si appoggerà automaticamente al moltiplicatore hw. O no? Ultimissima cosa! Esiste uno strumento software che permetta di fare profiling su un .hex?

Grazie infinite! Ciao!

ice ha scritto:

Che intendi dire?

Con profiling?

Uno software che mi permetta di cronometrare i tempi di esecuzione di alcune porzioni di codice...

la look up table, come ti hanno detto, e` sprecata. Visto che il processore ha la moltiplicazione, sfruttala.

Se vuoi fare in assembler una moltiplicazione per una costante, i due modi classici con somma e shift sono quelli per somma e per sottrazione.

Per moltiplicare per 13 (in binario 1101), sommi il numero a una variabile inizializzata a zero, poi fai due shift a sinistra, e risommi, ancora uno shift a sinistra e ancora una somma. In questo caso usi la rappresentazione binaria del valore 13: sommo il numero a se stesso moltiplicato per 4 e poi ancora a se stesso moltiplicato per 8.

Oppure puo` essere usata la tecnica a sottrazione: al posto di dire che

13=8+4+1 puoi dire che 13=16-2-1 in questo caso non ci sono differenze di costo nel fare l'operazione, ma per alcuni valori di costanti puo` essere conveniente.
Franco Wovon man nicht sprechen kann, darüber muß man schweigen. (L. Wittgenstein)

ice ha scritto:

Si. Lo strumento di sviluppo integrato (MPLAB) ti permette di mettere dei breakpoint, inoltre esiste un cronometro che ti permette di misurare ogni intervallo. Ciao

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required