per via di uno sfortunato abbinamento mi trovo con un dsp (slave) che può ricevere dati in modo seriale sincrono, msb first
il pic (master) usa la sua uart integrata per comunicare con il dsp... purtroppo la uart configuarata come master-sincrono può trasmettere solo lsb first
c'è un sistema veloce per ribaltare un byte in modo che il suo msb diventi il suo lsb?
la prima cosa che mi viene in mente è quella di fare una doppia operazione di shift supponiamo che hai il byte da ribaltare che chiami byte e quello invertito che chiami "nuovo".
Fai uno shift verso sinistra di byte. In questo modo msb finisce in C di status. Fai uno shift verso destra di "nuovo". Così facendo msb entra da destra in "nuovo" e si sposterà sempre di più verso destra se cicli questa operazione fino a diventare lsb nel momento in cui hai ripetuto l'operazione per l'ultimo byte. Spero di essermi spiegato. Sinceramente non penso ci siano operazioni più veloci (ma potrei anche sbagliarmi)
considera poi che l'efficienza si può considerare in dipendenza del numero di linee di codice oppure nella velocità di esecuzione. Dipende dalle tue esigenze.
si certo, ho omesso di specificarlo in effetti! in questa situazione volevo ottimizzare la velocità di esecuzione
RISULTATI: con il metodo che ho postato in pratica la rotazione di un byte mi viene gratis perchè è semplicemente dovuta ad una mappatura forzata delle variabili in memoria (il C della CCS supporta questo anche per le variabili booleane) poi, di contro, dovevo rinunciare alla seriale sincrona hardware e mandare fuori i bit con una routine software. questo mi costava 80 istruzioni per buttare fuori 16 bit (2 bytes) nel caso migliore e 96 istruzioni nel worst-case (sempre per 16 bit ovviamente)
con il metodo da voi suggerito faccio la rotazione di 2 bytes con 40 istruzioni a cui vanno sommate 8 (worst-case, 6 nel best-case) istruzioni per spostare il 2 bytes (prima uno e poi l'altro) nel buffer di trasmissione (poi l'hardware si occupa di serializzarlo e mandarlo al dsp)
quindi, in ogni caso, il metodo delle rotazioni a desta e sinistra è più efficiente! forse marcello suggeriva un ulteriore passaggio visto i bytes da gestire sono proprio 2
è così che intendevi?
- alla funzione viene passato un intero a 16-bit chiamato "l" (elle minuscolo insomma)
- le 2 #locate servono per spezzare "gratis" "l" in due int8 (purtroppo la seriale sincrona del pic non può gestire 16 bit in un colpo solo)
Si, solo che, essendo abituato a lavorare più in termini di righe di codice e non di velocità (la gran parte delle volte la velocità non è importante nelle mie applicazioni), io avevo pensato ad un ciclo più che a delle singole istruzioni. Molto probabilmente (dal momento che un'operazione di salto l'equivalente di due istruzioni) con il ciclo il tempo di esecuzione sarebbe maggiore. In ogni caso ottimo mi è sembrato il suggerimento di lowcost che mi sembra tu non abbia considerato (e al momento in effetti a me non era neanche passato per la mente). Tu stai utilizzando una variabile di appoggio in cui ti trovi il risultato. Se al posto di utilizzare una qualsiasi variabile, hai già a disposizione il byte successivo che devi inviare, puoi utilizzare questo. Su questa variabile di appoggio stai infatti effettuando la stessa operazione di inversione tramite shift che stai facendo sulla prima variabile (anche se in maniera inversa). Aggiungendo una operazione di shift in più, così facendo, avrai ribaltato due byte e non uno solo, raddoppiando l'efficenza rispetto all'algoritmo così come lo avevo suggerito io in partenza.
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.