Forum: Mikrocontroller und Digitale Elektronik H8/300H mit IAR int Multiplikation


von Ralf (Gast)


Lesenswert?

Hallo zusammen!

Ich versuche gerade die folgende Gleichung auf einem H8/300H Controller
von Renesas zu implementieren:

x = 1/sqrt(3) * (y + 2*z)

Als Compiler verwende ich den von IAR.

Soweit ist auch alles klar wie ich das ganze Umsetzen muss und es
funktioniert auch schon. Nur macht der Compiler nicht so ganz das was
ich will, d.h. ich habe folgendes probiert um mit 1/sqrt(3) zu
multiplizieren:

#define PWM_SQRT3_INV_Q15    18919  //!< 1/sqrt(3) in q15 format  =>
1/sqrt(3)*2^15

lTemp_     = (long)iTemp_ * SQRT3_INV_Q15; //   * 1 / sqrt(3)
lTemp_   <<= 1;                   // format to q12 in high word
x = (int)(lTemp_ >> 16); // store high word to x


Der Compiler erzeugt nun im Listing einen Unterfunktionsaufruf um die
beiden 16Bit Integer im long-Format zu multiplizieren. Er könnte jedoch
auch einfach den mul-Befehl verwenden und temporär in einem
32Bit-Register arbeiten. Da ich Zeit sparen möchte würde ich dem
Compiler also gerne den Funktionsaufruf verbieten.
Ich habe das ganze auch mal auf einem Renesas-Compiler getestet und da
wird alles so genacht wie ich es erwartet hätte.

Hat vielleicht einer einen Tip wie ich den COmpiler überreden kann dass
zu tun was ich möchte? Ich habe schon mit den verschiedensten Castings
rumprobiert, allerdings ohne Erfolg :-(

Viele kB Grüße,

Ralf

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.