Sto lavorando a un progetto incorporato in cui devo scrivere un valore di timeout in due registri byte di alcuni micro-chip.Decomporre l'intero in due byte
Il timeout è definito come:
timeout = REG_a * (REG_b +1)
Voglio programmare questi registri utilizzando un numero intero nella gamma di 256 a consente di dire 60000. Sto cercando un algoritmo che, dato un timeout- valore, calcola REG_a e REG_b.
Se una soluzione esatta è impossibile, mi piacerebbe ottenere il prossimo valore di timeout più ampio possibile.
Che cosa ho fatto finora:
mia soluzione attuale calcola:
temp = integer_square_root (timeout) +1;
REG_a = temp;
REG_b = temp-1;
questo si traduce in valori che funzionano bene in pratica. Comunque mi piacerebbe vedere se voi ragazzi poteste trovare una soluzione più ottimale.
Oh, e io sono limitato dalla memoria, quindi i tavoli di grandi dimensioni sono fuori questione. Anche il tempo di esecuzione è importante, quindi non posso semplicemente forzare la soluzione.
Si desidera ridurre al minimo la differenza tra "timeout" e il valore calcolato? È questo lo scopo di questo esercizio? Altrimenti quello che hai sembra bene. –
Una versione ottimale è ridurre a icona un registro e massimizzare l'altro. Ci sono problemi con questa interfaccia di registro in cui non ti piacerebbe cambiare bruscamente entrambi i registri. Poiché non è possibile eseguire entrambe le scritture di memoria contemporaneamente, potrebbero verificarsi problemi se i registri sono scritti ** mentre ** il timer è in esecuzione. Riducendo al minimo un registro, è possibile lasciare lo stesso quando si passa a un timeout più piccolo poiché il minimo fornisce una granularità temporale migliore. –