Gast
#215002
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