Metodo più veloce (PIC)

Ciao!

Mi domando se in un PIC sprovvisto di moltiplicatore hw sia più veloce una (moltiplicazione per 12) oppure uno (shift a sinistra di 2 ed una moltiplicazione per 3) Qualcuno sa aiutarmi?

Grazie in anticipo!

Reply to
ice
Loading thread data ...

Sicuramente più veloce uno shift. tutte le moltiplicazioni possono essere fatte come combinazione di shift e somme, quindi conviene in caso di moltiplizazioni per coefficienti costanti farle con lo shift. Max

Reply to
Max

Perchè? Io ho supposto che moltiplicare x12 per il pic significa fare "12 somme" mentre nel caso di shift+moltiplicazione per il pic vuol dire shift e "3 somme" Puo essere?

Grazie ancora

Reply to
ice

"ice" ha scritto

Dipende dall'algoritmo usato. Se non ho sbagliato a scrivere, il codice qui sotto richiede un massimo di 8 somme anche se il numero e' da moltiplicare per 255 (per l'esattezza avvengono tante somme quanti sono i bit a 1 nel moltiplicatore):

;MPL=moltiplicando a 8 bit ;MPR=moltiplicatore a 8 bit ;PH:PL=parte alta e bassa del prodotto a 16 bit ;CL=contatore dei bit

CLRF PH MOVLW 8 MOVWF CL

MUL1

BTFSS MPR,0 GOTO MUL2 MOVF MPL,W ADDWF PH,F

MUL2

RRF PH,F RRF PL,F RRF MPR,F DECFSZ CL,F GOTO MUL1

Puo' essere ancora meglio ricordando che A*12=A*8+A*4, cioe' 3 shift e una somma. Per esempio se siamo sicuri che il nostro prodotto sara' sempre contenibile in 8 bit (dipende dal problema da risolvere) allora basterebbero

8 istruzioni:

BCF STATUS,C RLF MPL,F BCF STATUS,C RLF MPL,F MOVF MPL,W BCF STATUS,C RLF MPL,F ADDWF MPL,F

Claudio F

Reply to
Claudio F

Sei un grande! Però non ho capito perchè 3 shift quando fai A*12=A*8+A*4 Per ora l'algoritmo è implementato in C ma se necessito di + velocità conviene, secondo te, passare in ASM oppure le ottimizzazioni che fa il compilatore C sono equivalenti? Uso il pcw della ccs

Grazie ancora Ciao!

Reply to
ice

"ice" ha scritto

Stavo ragionando in assembler, per ottenere A*4 occorrono due shift elementari di 1 bit a sinistra, con il terzo shift si ottiene A*8.

Non ho mai usato il C, anche se per sentito dire il livello di ottimizzazione sembrerebbe molto buono. Rimane il fatto che il codice compilato puo' prevedere l'uso di funzioni predefinite generali molto piu' lunghe rispetto allo stretto necessario. Se la velocita' e' un fattore fondamentale il dubbio secondo me non si pone neppure, in assembler si puo' scrivere una routine ottimizzata appositamente per lo specifico problema spremendo fino l'ultimo microsecondo.

Claudio F

Reply to
Claudio F

Il Sat, 06 Mar 2004 16:05:34 GMT, "ice" ha scritto:

Se simuli il tutto con MPLAB puoi valutare quanti cicli utilizza il codice in C e fare quindi il confronto con quelli teorici (o pratici) che utilizza l'assembler. E' un metodo utile anche per valutare l'effetto delle ottimizzazioni.

remove ù for e-mail reply

Reply to
Simone Bern

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.