xiomara suave paso original leslie grace facil duro coreografía coreografia c linux floating-point arm libc

paso - leslie grace duro y suave



¿Cuál es la diferencia entre los números de coma flotante duro y suave? (5)

Cuando compilo el código C con mi cadena de herramientas cruzada, el enlazador imprime páginas de advertencias que dicen que mi ejecutable usa flotas duras pero mi libc usa flotación suave. ¿Cual es la diferencia?


El cálculo se puede hacer mediante hardware de coma flotante o en software basado en aritmética de enteros.

Hacerlo en hardware es mucho más rápido, pero muchos microcontroladores no tienen hardware de coma flotante. En ese caso, puede evitar el uso de punto flotante (generalmente la mejor opción) o confiar en una implementación en el software, que será parte de la biblioteca C.

En algunas familias de controladores, por ejemplo ARM, el hardware de coma flotante está presente en algunos modelos de la familia pero no en otros, por lo que gcc para estas familias es compatible con ambos. Tu problema parece ser que confundiste las dos opciones.


Estrictamente hablando, todas estas respuestas me parecen incorrectas.

Cuando compilo el código C con mi cadena de herramientas cruzada, el enlazador imprime páginas de advertencias que dicen que mi ejecutable usa flotas duras pero mi libc usa flotación suave. ¿Cual es la diferencia?

El wiki de Debian VFP tiene información sobre las tres opciones para -mfloat-abi ,

  • soft - este es un software puro
  • softfp : admite una FPU de hardware, pero la ABI es compatible.
  • hard : el ABI usa registros float o VFP .

El error del enlazador (cargador) se debe a que tiene una biblioteca compartida que pasará los valores de coma flotante en los registros enteros. Aún puede compilar su código con -mfpu=vfp , etc. pero debe usar -mfloat-abi=softfp para que si la libc necesita un flotante se pase de una manera que la biblioteca entienda.

El kernel de Linux puede soportar la emulación de las instrucciones de VFP. Obviamente, es mejor compilar con -mfpu=none para este caso y hacer que el código de compilación genere directamente en lugar de confiar en cualquier emulación de kernel de Linux. Sin embargo, no creo que el error del PO esté realmente relacionado con este problema. Está separado y también debe tratarse junto con el -mfloat-abi .

La biblioteca compartida Armv5 con CPU ArmV7 es un opuesto a esta; el libc era hard float pero la aplicación solo era suave . Tiene algunas formas de evitar el problema, pero recompilar con las opciones correctas es siempre lo más fácil.

Otro problema es que el kernel de Linux debe admitir tareas de VFP (o cualquier punto flotante de ARM presente) para guardar / restaurar los registros en un cambio de contexto.


Hay tres formas de hacer aritmética en coma flotante:

  • Use instrucciones de flotación si su CPU tiene una FPU. (rápido)
  • Haga que su compilador traduzca la aritmética de punto flotante a la aritmética de enteros. (lento)
  • Use instrucciones flotantes y una CPU sin FPU. Su CPU generará una excepción (Instrucción reservada, Instrucción no implementada o similar), y si su kernel OS incluye un emulador de punto flotante, emulará esas instrucciones (la más lenta).

Parece que tu libc fue creada para operaciones de coma flotante de software mientras que tu exe se compiló asumiendo soporte de hardware para coma flotante. En el corto plazo, podría forzar carrozas blandas como indicador del compilador. (Si estás usando gcc, creo que es -msoft-float)

A más largo plazo, si el procesador de su objetivo tiene soporte de hardware para operaciones de punto flotante, generalmente querrá construir o encontrar una cadena de herramientas cruzada con flotador de hardware habilitado para la velocidad. Algunas familias de procesadores tienen algunas variantes de modelo y algunas sin soporte de hardware. Entonces, por ejemplo, decir que su procesador es un ARM es insuficiente para saber si tiene soporte de punto flotante de hardware.


Los flotadores duros usan una unidad de coma flotante en el chip. Las carrozas suaves emulan una en el software. La diferencia es la velocidad. Es extraño ver ambos utilizados en la misma arquitectura de destino, ya que el chip tiene una FPU o no. Puede habilitar el punto flotante suave en GCC con -msoft-float. Es posible que desee recompilar su libc para usar el punto flotante de hardware si lo usa.