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?
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...
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.
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?
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)
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
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.