mikrocontroller.net

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


Autor: Christian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Ben F. (confessor)
Datum:

Bewertung
0 lesenswert
nicht 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
}

Autor: arm-user (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
du musst libm.a einbinden!!!

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.