Schnelle Methode für *2 und /2

Begonnen von hugo, 31. Oktober 2008, 14:38:17

Vorheriges Thema - Nächstes Thema

0 Mitglieder und 4 Gäste betrachten dieses Thema.

hugo

viele SPS haben keine floating point unit und benötigen zur Gleitpunkt Multiplikation und Division beträchtliche Zeit.
Eine optimierung ist hier aber leicht möglich wenn man folgende Dinge beachtet:

eine Messung an einer Wago841 (32 Bit ARM CPU) ergint dabei folgende Werte

REAL#X * 2 6,3us
REAL#X / 2 8,7us
daraus ergibt sich: eine division durch konstanten kann einfach durch Multiplikation ersetzt werden. z.B: /2 wird ersetzt mit *0.5
dies spart 40% ausführungszeit ! und ergibt keinen Nachteil bei CPUs mit Gleitkommaeinheit.

wer programmierfest ist kann noch weiter optimieren:
mittels pointer und bitoperation kann eine multiply by 2,4,8,... durch eine simple addition ersetzt werden
und eine division durch 2,4,8,... durch eine subtraktion.
hier ist allerdings vorsicht mit pointern angebracht.

Beispiel:
ptx := pointer to dword; (eingangswert X)
pty := pointer to dword; (ausgangswert Y)

pty := adr(Y);
ptx := adr(X);

pty^ := ptx^ + 8388608;  (* dieses statement multipliziert den wert von X mit 2 durch addition im exponenten *)
pty^ := ptx^ - 8388608;  (* dieses statement dividiert den wert von X mit 2 durch subtraktion im exponenten *)

innerhalb der OSCAT LIB verwenden wir bereits wo möglich diese optimierungen um beste performance zu gewährleisten

Ein Beispiel für den Einsatz dieser Technik findet Ihr im Baustein TEMP_PT