STM32 Nicht-Fließkommaeinheit-Chips

Ich würde gerne wissen, wie STM32F2-Chips und darunter keine Gleitkommaeinheit verarbeiten und eine Gleitkommaoperation durchführen.

Ich habe hier gelesen, dass erwähnt wird, dass der Gleitkommawert von Bibliotheksfunktionen verarbeitet wird, aber wenn ich meinen Firmware-Code schreibe und ich keine Bibliothek zur Verarbeitung dieser Gleitkommaoperationen hinzugefügt habe.

Beispiel: Wenn ich eine einfache Float-Berechnung durchführe

float gain = 1.2 * 1.5;

Ich habe keine externe Bibliothek eingeschlossen, aber es ist immer noch in der Lage, den Floating-Wert zu berechnen? Oder wenn ich kompiliere, erledigt der Compiler das automatisch für mich?

Versuchen Sie, sich den Disassemblierungscode anzusehen.

Antworten (3)

Im Zitat gibt es keine fp-Berechnung zur Laufzeit, sie wird vom Präprozessor durchgeführt und als Literal in den Code aufgenommen. Wenn es eine Berechnung geben würde, würde sie von Compiler-Low-Level-Bibliotheken gehandhabt, die im Fall von GCC fp-Funktionen sehen würden, die in die endgültige Binärdatei von einer bestimmten Version von libgcc.a verschmolzen würden, abhängig von der harten/weichen fp-Nutzung . Hier auf meinem System gibt es zwei Versionen von libgcc.a für cortex-m4:

/usr/lib/gcc/arm-none-eabi/5.3.0/armv7e-m/ softfp /libgcc.a
/usr/lib/gcc/arm-none-eabi/5.3.0/armv7e-m/ fpu /libgcc .A

Hinweis: Bei libgcc.a geht es nicht nur um fp.

Wenn ein Mikrocontroller keine "harte FPU" hat, führt die CPU eine sogenannte "weiche FPU" aus, die im Grunde ganzzahlige Arithmetik verwendet, um Gleitkommaoperationen durchzuführen.

Wenn Sie "soft" auf die Compiler-Option "-mfloat-abi" setzen, kümmert sich der Compiler darum, die Bibliotheksaufrufe durchzuführen, um weiche Gleitkommaoperationen zu ermöglichen ( Quelle ).

Diese weiche FPU wird in der Antwort auf diese Frage erläutert .

Hier sind einige Details zur Gleitkommabehandlung auf ARM-Architekturen.

Wie bereits erwähnt, wird der Compiler das für Sie erledigen.

Möglicherweise müssen Sie jedoch nach Linkerfehlern suchen - einige Compiler verknüpfen standardmäßig nicht in Gleitkommabibliotheken oder tun dies standardmäßig, erlauben Ihnen jedoch, sie zu deaktivieren. Auf kleinen Mikros ist der Platz im Allgemeinen knapp, daher ist dies eine vernünftige Strategie des Compilers. Dies ist jedoch beim Einrichten des Builds zu beachten.

Sie müssen auch sehr vorsichtig sein, welche Gleitkommaoperationen Sie wo ausführen. Alle Gleitkommaoperationen werden sehr langsam sein, wenn Sie also diese Berechnung in einer Hochleistungs-ISR durchführen, werden Sie wahrscheinlich Ihr Timing-Budget sprengen. Generell kann man damit rechnen, dass die Multiplikation langsamer ist als die Addition/Subtraktion und die Division wiederum langsamer.

Wenn keine Gleitkommaunterstützung vorhanden ist, sollten Sie ganzzahlige Werte mit einem Binärkomma verwenden. Siehe Wikipedia-Eintrag über Binärpunktskalierung für einige grundlegende Details.

Ich weiß, dass sowohl Clang als auch GCC das statische Linken von Bibliotheken unterstützen und anschließend unbenutzte Funktionen entfernen, aber ich bin mir nicht sicher, wie gut Mikrocontroller-Compiler heutzutage sind.
@JAB Eine "statische Bibliothek" ist normalerweise wirklich ein Archiv von größtenteils unabhängigen Objektdateien (die jeweils einer Quelldatei entsprechen), die jeweils nur eine Funktion oder eine kleine Anzahl eng verwandter Funktionen implementieren und nur diejenigen verknüpfen, die Funktionen definieren erforderlich sind, ist seit den 1970er Jahren gängige Praxis.
@JAB Das ist nicht das Problem. Das Problem besteht darin, dass emuliertes Gleitkomma dazu führt, dass der Compiler Aufrufe von Funktionen einrichtet, die diese Gleitkommaberechnung implementieren. Es gibt viele Möglichkeiten, die Fließkomma-Katze mit Skins zu versehen (z. B. abhängig von der gewünschten Genauigkeit), sodass Sie der Compiler mit verschiedenen Laufzeitbibliotheken verknüpfen kann. Wenn Sie nicht mit einer Laufzeitbibliothek verknüpfen, die die entsprechenden Funktionen bereitstellt, schlägt die Verknüpfung fehl. Siehe zum Beispiel stackoverflow.com/questions/2187379/… wo jemand genau diesen Fehler gemacht hat.
@Graham Sicher, aber wenn Sie einen haben, den Sie gerne verwenden, scheint es sinnvoll, ihn einfach standardmäßig in Ihren Build-Prozess aufzunehmen und den Linker damit zu beauftragen, ihn nicht einzuschließen, wenn Sie ihn am Ende nicht benötigen (was bedeutet, dass "Platz eine Prämie" ist). Kommentar ist nur für herstellerspezifische Linker von Bedeutung, die kein solches Code-Stripping durchführen).
@JAB Fairer Punkt. Aber eine typische Laufzeitbibliothek wird mit einer Unmenge von Kleinigkeiten geliefert, von denen Sie die meisten nie brauchen werden. Es ist also nicht ungewöhnlich, nur das zu verlinken, was man wirklich braucht. Auch wenn Sie weniger erfahrene Programmierer haben, kann es ein guter Plan sein, die Anzahl der Seile zu beschränken, die Sie ihnen erlauben. Ich habe letztes Jahr persönlich ein Beispiel dafür gesehen - jemand brachte mir Code, um den Fehler zu finden, und meine Antwort war: "Hier sind einige Dinge zu überprüfen, aber als ich dort war, bemerkte ich, dass Ihre Hauptschleife laufen sollte 10 ms und wäre glücklicherweise in 10 s fertig".
@Graham Auch faire Punkte.