Lorsque je compile du code C avec ma chaîne d’outils croisés, l’éditeur de liens imprime des pages d’avertissements indiquant que mon exécutable utilise des flotteurs dures, mais que ma bibliothèque utilise des flottants. Quelle est la différence?
Réponses
Trop de publicités?Les flotteurs durs utilisent une unité à virgule flottante sur puce. Les flotteurs progressifs en émulent un dans le logiciel. La différence est la vitesse. Il est étrange de voir les deux utiliser sur la même architecture cible, car la puce a un FPU ou pas. Vous pouvez activer la virgule flottante dans GCC avec -msoft-float. Vous voudrez peut-être recompiler votre libc pour utiliser une virgule flottante matérielle si vous l'utilisez.
Il existe trois façons de faire de l'arithmétique en virgule flottante:
- Utilisez les instructions float si votre CPU dispose d’une FPU. (vite)
- Demandez à votre compilateur de convertir l'arithmétique en virgule flottante en arithmétique entière. (lent)
- Utilisez les instructions float et une CPU sans FPU. Votre CPU générera une exception (Instruction réservée, Instruction non-implémentée ou similaire) et si votre noyau de système d'exploitation inclut un émulateur de virgule flottante, il émulera ces instructions (le plus lent).
Il semble que votre libc a été construit pour les logiciels d'opérations en virgule flottante, tandis que votre exe a été compilé en supposant un support matériel pour la virgule flottante. À court terme, vous pouvez forcer le doux flotte comme un compilateur drapeau. (si vous utilisez gcc, je pense que c'est-msoft-float)
À plus long terme, si votre cible processeur dispose d'un support matériel pour les opérations à virgule flottante, vous voudrez généralement de construire ou de trouver une croix de la chaîne avec du matériel d'flottante pour la vitesse. Certaines familles de processeurs ont des variantes de modèle certains avec et sans support matériel. Ainsi, par exemple, juste en disant que votre processeur est un ARM est insuffisant pour savoir si vous avez du matériel à virgule flottante de soutien.
Le calcul peut être fait soit en virgule flottante de matériel ou de logiciel, basé sur l'arithmétique des nombres entiers.
Le faire dans le matériel est beaucoup plus rapide, mais de nombreux microcontrôleurs n'ont pas de virgule flottante. Dans ce cas, vous pouvez éviter d'utiliser de virgule flottante (généralement la meilleure option), ou s'appuyer sur une mise en œuvre de logiciels, qui sera le cadre de la C de la bibliothèque.
Dans certaines familles de contrôleurs, par exemple le BRAS, la virgule flottante est présent dans certains modèles de la famille, mais pas dans d'autres, afin de gcc pour ces familles qui supporte à la fois. Votre problème semble être que vous avez mélangé les deux options.