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?
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.
seetharaman