Ottimizzare moltiplicazione per 13 (PIC)

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!

Reply to
ice
Loading thread data ...

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 "

Reply to
SiMPoD

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!

Reply to
ice

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

Reply to
SiMPoD

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!

Reply to
ice

ice ha scritto:

Che intendi dire?

Reply to
Silvio Baccari

Con profiling?

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

Reply to
ice

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)
Reply to
Franco

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

Reply to
Silvio Baccari

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.