Forum: Mikrocontroller und Digitale Elektronik Wie trigonometrische Funktionen mit dem STM32 nutzen


von Christian (Gast)


Lesenswert?

Hallo,

ich stehe gerade etwas auf dem Schlauch: Ich arbeite mit dem STM32F103 
und der CodeSourcery Toolchain. Da ich einige trigonometrische 
Funktionen brauche, habe ich die math.h eingebunden und bei den 
Linker-Flags im Makefile ein -lm angehängt. Compiliert wird das ganze 
fehlerfrei, nur beim Funktionsaufruf stürzt der Controller ab.

Jetzt hatte ich hier diesen Thread gefunden

Beitrag "STM32-Float-Ops gehen nicht"

und die libgcc.a mit eingebunden. Seitdem habe ich keine Probleme mit 
float mehr, aber meine trigonometrischen Funktionen gehen immer noch 
nicht.

Jemand ne Idee, was ich noch machen muss? Leider ist das STM32-Forum von 
ST auch gerade offline.

Christian

von Ben F. (confessor)


Lesenswert?

wie wärs denn damit?


s32 sin32fixed(s32 wink_bogen) {

  register s32 akku asm ("r9") = wink_bogen;
  register s32 potenz asm ("r10") = 0;
  register s32 square asm("r6") = 0;
  register s32 ii asm("r8") = 0;
  register s32 dummy_lo asm("r5") = 0;
  const s32 nenn_fkt_sgn [5] = {0xeaaaaaab, // (1/3!)*(2^31) dann 2er 
Komplement
                                0x01111111, // (1/5!)*(2^31-1)
                                0xFFF97F98, // (1/7!)*(2^31) dann 2er 
Komplement
                                0x0000171e, // (1/9!)*(2^31-1)
                                0xffffffca};// (1/11!)*(2^31) dann 2er 
Komplement
  // Konstantentabelle enthält Vorzeichen und Faktoren der 
Winkelpotenzen
  // also -1/3!, +1/5!, -1/7!, +1/9!, -1/11!


  potenz=akku;
  asm ("smull r5,r6,r9,r9" : "=r"(dummy_lo),"=r"(square) : 
"r"(akku),"r"(akku));

  square<<=1; // normiere
  // wink_bogen^2 ist in r6, potenz in r10 ist zunaechst wink_bogen
  akku>>=1; // da die Summation in der Schleife in einer anderen Norm 
erfolgt, muss entsprechend vorgeteilt werden
  if (akku&0x40000000) akku|=0x80000000; // Vorzeichenerweiterung
  else akku&=0x7fffffff;
  for (ii=0; ii<5; ii++) {
    //  multipliziere potenz mit wink_bogen^2
    asm ("smull r5,r10,r10,r6" : "=r"(dummy_lo),"=r"(potenz) : 
"1"(potenz),"r"(square));
    potenz<<=1; // normiere jeweils
    dummy_lo=0;  // damit sich das nicht reinaddiert
    asm ("smlal r5,r9,r10,%[rn]" : "=r"(dummy_lo),"=r"(akku) :
                                   "0"(dummy_lo),"1"(akku),"r"(potenz),[rn]"r"(nenn_fkt_sgn[ii]));
  }
  akku<<=1; // normiere Endergebnis, weil das in der Schleife nicht 
passiert
  return akku;  // gib Ergebnis zurück
}

von arm-user (Gast)


Lesenswert?

du musst libm.a einbinden!!!

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.