Jak resite na MCU nasledujici problem ?

Marek Pavlů marekpavlu@mybox.cz
Sobota Srpen 14 01:03:29 CEST 2004


Zdravim,
 
1)
Vychazel jsem z vety: A ted babo rad jak to narvat do maleho 8bit MCU a
minima pameti ?
Z cehoz mi vyslo, ze je potreba optimalizovat vypocet a mnou uvedenym
postupem se zbavite jednoho nasobeni, jednoho prevodu:
Integer -> Float a pak zpet Float->Integer
Deleni se vlastne vubec neobjevi, protoze je realizaovano bitovym
posuvem.
Uz toto samo o sobe muze znamenat tak 100 - 200 instrukci na vetsine
procesoru a to minimalne!
 
2)
Ptal jsem se po vyznamech jednotlivych promennych z duvodu toho,
ze teprve timto zpusobem se da navrhnout nejaka smysluplna optimalizace
vypoctu,
ktera umozni realizaci i na malem procesoru s malou pameti.
Pokud znam vlastnosti promennych, tak 
 
3)
Zkuste ale popremyslet o tomto:
Kazde cislo uz mame vlastne v bitovem zapisu v procesoru.
A ze zakladni skoly vime, ze podil dvou cisel v expanencialnim tvaru:
 
a^x/a^y  = a^(x-y)
 
My sice mame polynomy, ale limitne to zhruba pasuje i pro ne.
 
Takze si projdu kazdou promennou bit po bitu od nejvyssiho po nejnizsi a
ptam se, ktery je prvni nastaven na jednicku.
Kdyz jej najdu tak si ulozim pozici bitu, ke ktere ale prictu jednicku.
Mimo to musite davat pozor, jak je ulozeno znamenko dane promenne
 
Kdyz tohle provedu pro Cx a pozice bude napriklad v promenne n_cx, tak
bude platit toto:
 
Cx + 1 <= 2^n_cx
 
 
Pro Fx:
 
Fx + 1 <= 2^n_fx
 
 
 
A ted, protoze chcete dostavovat pomoci promenne Y bude puvodni rovnice
v nasich "fiktivnich" exponentech vypadat takto:
 
2^n_fx = (2^n_x/2^n_cx)  *  2^n_k
 
2^n_k reprezentuje zbytek vyrazu : (1-0.2489.Y) ale kladne vycislene,
jako absolutni hodnotu vyrazu.
 
Pak se vyraz upravi:
 
2^n_fx = (2^n_x/2^n_cx)  *  2^n_k
2^n_fx * 2^n_cx / 2^n_x =  2^n_k
 
n_fx +  n_cx  - n_x=  n_k
n_fx +  n_cx  - n_x - n_k  = 0
 
n_fx +  n_cx   mate vlastne zadano uzivatelsym nastavenim/daty
 
 
Urcite si zhruba mozna rozmezi n_k vhledem k vyrazu: ABS((1-0.2489.Y))
A neleknete se, ze n_fx,n_cx,n_k,n_x budou mit vetsi pocet bitu nez je
bitova velikost promenne,
ale nikdy ne vice nez o jede bit!
 
No a pozor, vyraz se nemusi presne rovnat nule, ale je mozne tolerovat
male odchylky.
Druha vec je, ze pro urcite nastaveni vubec nemusi byt mozne ten Vas
vyraz vypocitat!!
 
Ze snahy se co nejvice priblizit nule Vam vylezou nejake n_x a n_k. U
n_k bych doporucoval tabulku,
ktera danemu n_k priradi Y a vysledek vyrazu (1-0.2489.Y)
 
 
Postup je asi takovyto:
 
Krok 1:
Nastavite n_k a n_x na na nejaky odhad
 
Krok 2:
Provedete vypocet:
 
n_fx +  n_cx  - n_x - n_k  = 0
 
Krok 3:
 
Pokud je vyraz > 0, tak JDI NA krok 4
Jinak JDI NA Krok 6:
 
Krok 4:
2^(n_cx - 1) >= Cx, pokud ano, tak n_cx = n_cx - 1
2^(n_fx - 1)  >=  Fx, pokud ano, tak n_fx = n_fx - 1
Pokud ani jedno neni pravda, JDI NA Krok 5:
JDI NA Krok 2
 
Krok 5:
n_x + 1 <= mezni ?? Pokud ano, n_x = n_x +1
n_k + 1 <= mezni ?? Pokud ano, n_k = n_k +1
Ani jedno neni pravda: Vypocet nelze dokoncit!!!!!
Jinak zpet: JDI NA Krok 2
 
Krok 6:
Mame hruby odhad.
 
X = 2^n_x
 
Y z tabulky podle n_k
 
 
Pokud jeste nebudete s priblizenim dostatecne spokojen, tak zacnete
dostavovat Y nebo X.
 
Je to vice nez mirne krkolomne, ale ma to vyhodu v tom, ze tam neni
zadne deleni,
zadne nasobeni, ale jen soucty, rozdily a hledani nejvyssiho bitu.
Algoritmus muzete ruzne upravovat, tohle neni nejjednodussi ani
nejoptimalnejsi, ale dokaze to udelat rychle prvni odhad.
Mne se takto povedlo zoptimalizovat par vypoctu, kde bylo hlavni najit
rychle prvni odhad.
Proste hlavni myslenka je v tom, ze prevodem cisel na exponencialni tvar
se da udelat dobry prvni odhad.
 
 
 
S pozdravem,
                        Marek Pavlu
 
-----Original Message-----
From: hw-list-bounces@mailman.nethouse.cz
[mailto:hw-list-bounces@mailman.nethouse.cz] On Behalf Of Malecek
Sent: Wednesday, August 11, 2004 8:47 AM
To: [HWnews]
Subject: Re: Jak resite na MCU nasledujici problem ?
 
Asi jsem se nepresne vyjadril, ale ono ani tak nejde o to ja zjednodusit
uvadenou rovnici, ale o to jak co nejrychleji a predevsim nejpresneji
nastavit parametry zarizeni tak aby se prava strana rovnice co nejvice
priblizila zadane hodnote Fx (do MCU ji zasila nadrizeny system nebo
pripadne i obsluha)
Fx je 32bit integer a vyjadruje pozadovane nastaveni pristroje a pro to
abych toho dosahl mam k dispozici tri ovladaci prvky:
- Cx coz je vyctovy typ typu integer dnes 16 bit v budoucnu 24bit pro
predstavu muze nabyvat hodnot v radu  20,200,2000,20000,200000 v realu
jde o logiku ovladajici ventily
- X + Y coz jsou 12 integer (  v pripade Y hodnota se znamenkem)  v
realu 12bit DA prevodniky ovladajici volaake cudo.
 
Z rovnice a vahy jednotlivych promenych je videt, ze nejvetsi vliv ma Cx
nasleduje X a Y, kterym lze nejjemeji dostavit system.
 
Tak ze jde o to jak co neefektivneji urcit v MCU hodnoty  Cx,X,Y,
 
 
Zatim to delam tak, ze pomoci pevne nastavenych podminek (podle
velikosti Fx) urcim Cx 
nasledne provedu vypocet X=Fx*Cx cimz urcim hodnotu a nastaveni
prevodniku X
a v poslednim kroku kdy uz mam v rovnici jen jednu neznamou dopocitam Y.
 
Nicmene mi to nepripada prilis matematicky elegantni a z duvodu nejake
certifikace musi byt k zarizeni prilozen podrobny popis pouziteho
algoritmu a ja si nechci uriznout ostudu a tak se ptam, zda neni nejaky
vice matematicky zpusob. :-)))
 
 
 
----- Original Message ----- 
From: Marek Pavlů <mailto:marekpavlu@mybox.cz>  
To: '[HWnews]' <mailto:hw-list@mailman.nethouse.cz>  
Sent: Wednesday, August 11, 2004 2:42 AM
Subject: RE: Jak resite na MCU nasledujici problem ?
 
Zdravim,
 
Mozna, kdyz reknete, co ty promenne X,Y,Cx,Fx jsou, tak nekdo neco
poradi.
 
Sice uvadite pocty bitu na jednotlive parametry, ale neuvadite, jestli
realna/prirozena cisla.
Predpokladam tedy, ze X,Y,Cx jsou prirozena cisla.
 
Pak:
0.2489 nahradime cislem 1/4 s presnosti na jednu desetinu.
 
Fx=(X/Cx).(1-Y/4) = (X/Cx).(4-Y)/4 = -1 . (X/Cx) . (Y - 4) / 4
 
Deleni ctyrmi provedete jako bitovy posuv doprava, takze zustava jen
jedno nasobeni a jedno deleni.
+,- nepocitam, tam je to jednoduche, ale pokud je neco z cisel realne,
tak bude dalsi kod bastit prevod 
prirozene >> realne
 
Vic se z toho vypotit neda :-).
 
Nechcete se vice rozepsat o tom, co tyhle tajne konstanty znamenaji
:-)... ???
Popripade, jak je to zapojeno ????
 
 
S pozdravem,
                        Marek Pavlu
 
-----Original Message-----
From: hw-list-bounces@mailman.nethouse.cz
[mailto:hw-list-bounces@mailman.nethouse.cz] On Behalf Of Malecek
Sent: Tuesday, August 10, 2004 8:20 PM
To: [HWnews]
Subject: Jak resite na MCU nasledujici problem ?
 
 
Mam funkci Fx=(X/Cx).(1-0.2489.Y)
 
pricemz:
 
Cx je vyctovy typ, ktery muze nabyvat cca 10 hodnot typu integer 16bit
X a Y jsou 12bitova cisla nastavujici DA prevodniky
a Fx je hodnota (32bit), kterou do MCU zasle nadrizeny system a ukolem
MCU  je 
vybrat  Cx a nastavit  X , Y tak aby se prava strana rovnice co nejvice
priblizila pozadovane hodnote Fx.
 
A ted babo rad jak to narvat do maleho 8bit MCU a minima pameti ?
 
Me soucasne reseni:
nejdrive podle velikosti Fx a pevne danych podminek vybere hodnotu Cx
(hodnota Cx je v rozsahu 4 radu),
nasledne provedu vypocet X=Fx.Cx a
nasledne provedu jemne doladeni pomoci hodnoty Y.
 
Nicmene mi to vubec nepripada matematicky sofistikovane a dostatecne in.
 
Je nejake lepsi reseni o kterem nevim ?
 
Dekuji za pripominky.
 
 
---
avast! Antivirus: Odchozi zprava cista.
Virova databaze (VPS): 0433-1, 09/08/2004
Testovano: 10.8.2004 21:44:35
avast! (c) copyright 2000-2003 ALWIL Software.
http://www.avast.com



   _____  

_______________________________________________
HW-list mailing list  -  sponsored by www.HW.cz
HW-list@mailman.nethouse.cz
http://nethouse.cz/mailman/listinfo/hw-list
---
avast! Antivirus: Odchozi zprava cista.
Virova databaze (VPS): 0433-2, 10/08/2004
Testovano: 11.8.2004 22:48:59
avast! (c) copyright 2000-2003 ALWIL Software.
http://www.avast.com



---
avast! Antivirus: Odchozi zprava cista.
Virova databaze (VPS): 0433-3, 13/08/2004
Testovano: 14.8.2004 1:03:29
avast! (c) copyright 2000-2003 ALWIL Software.
http://www.avast.com



------------- další část ---------------
HTML příloha byla odstraněna...
URL: http://list.hw.cz/pipermail/hw-list/attachments/20040814/09426658/attachment-0001.htm 


Další informace o konferenci Hw-list