Wie trigonometrische Funktionen mit dem STM32 nutzen

Gast #1457712
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
#1556961
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
}

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.