Ich möchte ich einen string mithilfe von sscanf() auswerten.
Gleichzeitig muss ich aber die FPU direkt nutzen. Leider führt diese
Kombination dazu , dass der Linkvorang nicht durchführbar ist, da die
newlib anscheinend nur als nicht FPU Variante vorhanden ist. Auch die
Verwendung von siscanf() hilft nicht ...
1
[cc]22totalfilestobecompiled.
2
[cc]arm-none-eabi-gcc-mcpu=cortex-m4-mfpu=fpv4-sp-d16-mfloat-abi=hard-mthumb-Wall-ffunction-sections-g-O0-c-DSTM32F407VG-DSTM32F4XX-DUSE_STDPERIPH_DRIVER-D__ASSEMBLY__-D__FPU_USED-//habe die includes rausgeworfen
3
[cc]Startinglink
4
[cc]arm-none-eabi-gcc-mcpu=cortex-m4-mthumb-g-nostartfiles-Wl,-Map=fw_Target_Flash.map-O0-Wl,--gc-sections-LC:\CooCox\CoIDE\configuration\ProgramData\fw_Target-Wl,-TC:\CooCox\CoIDE\configuration\ProgramData\fw_Target/arm-gcc-link.ld-g-ofw_Target_Flash.elf..\obj\common_data.o..\obj\stm32f4xx_usart.o..\obj\stm32f4xx_can.o..\obj\epos.o..\obj\drive.o..\obj\startup_stm32f4xx.o..\obj\main.o..\obj\stm32f4xx_rcc.o..\obj\printf.o..\obj\can.o..\obj\default_hardware.o..\obj\odometry.o..\obj\can_drive.o..\obj\stm32f4xx_gpio.o..\obj\stm32f4xx_flash.o..\obj\system_stm32f4xx.o..\obj\syscalls.o..\obj\misc.o..\obj\serial.o..\obj\spline.o..\obj\circular_buffer.o..\obj\stm32f4xx_tim.o"-L..\..\..\..\..\..\..\..\..\..\..\Program Files (x86)\GNU Tools ARM Embedded\4.6 2012q2\arm-none-eabi\lib\armv7e-m\fpu"-lm
Die ABI ( https://de.wikipedia.org/wiki/Bin%C3%A4rschnittstelle )
bestimmt, wie dein Programm mit Bibliotheken kommuniziert. Etliche
Compileroptionen verändern die ABI, so auch -mfloat-abi. Es ist also nur
logisch, dass Funktionen, die unterschiedliche -mfloat-abi-Einstellungen
benutzten, nicht miteinander reden können.
Die konsequente Lösung ist, dir eine newlib mit -mfloat-abi=hard zu
bauen.
Was dich vermutlich jetzt erstmal weiterbringt ist -mfloat-abi=softfp.
Damit nutzt GCC die FPU, kommuniziert aber mit anderen Funktionen als ob
es keine FPU gäbe. Das ist natürlich weniger effizient als konsequente
FPU-Nutzung, aber es läuft eben auch mit gemischtem FPU/soft-float code.
Wenn du mit dem gcc-frontend linkst, wird gegen libgcc gelinkt, die
typischweise arithmetische Funktionionen implementiert die der Compiler
nicht direkt durch Assembler ersetzt.
Deine Compilerchain sollte hardfloat unterstützen (multilib), du must
dem linker aber sagen welche libgcc du denn haben willst (soft- oder
hardfloat), offensichtlich verwendet sie softfloat Standardmäßig.
also -mfloat-abi=hard bei linken mit angeben.
Grüße,
Andy
"Die konsequente Lösung ist, dir eine newlib mit -mfloat-abi=hard zu
bauen."
wie mache ich das?
Die FPU soft zu nutzen würde ich nur sehr ungerne machen da ich die FPU
viel nutze.
habe -mfloat-abi=hard mit angegeben, die Fehler bleiben bestehen:
1
[cc]Startinglink
2
[cc]arm-none-eabi-gcc-mcpu=cortex-m4-mthumb-g-nostartfiles-Wl,-Map=fw_Target_Flash.map-O0-Wl,--gc-sections-LC:\CooCox\CoIDE\configuration\ProgramData\fw_Target-Wl,-TC:\CooCox\CoIDE\configuration\ProgramData\fw_Target/arm-gcc-link.ld-g-ofw_Target_Flash.elf..\obj\common_data.o..\obj\stm32f4xx_usart.o..\obj\stm32f4xx_can.o..\obj\epos.o..\obj\drive.o..\obj\startup_stm32f4xx.o..\obj\main.o..\obj\stm32f4xx_rcc.o..\obj\printf.o..\obj\can.o..\obj\default_hardware.o..\obj\odometry.o..\obj\can_drive.o..\obj\stm32f4xx_gpio.o..\obj\stm32f4xx_flash.o..\obj\system_stm32f4xx.o..\obj\syscalls.o..\obj\misc.o..\obj\serial.o..\obj\spline.o..\obj\circular_buffer.o..\obj\stm32f4xx_tim.o"-L..\..\..\..\..\..\..\..\..\..\..\Program Files (x86)\GNU Tools ARM Embedded\4.6 2012q2\arm-none-eabi\lib\armv7e-m\fpu"-lm
Ok. Vermutlich fehlt gcc die fpu-version: -mfpu=fpv4-sp-d16 um die
geeignete multilib zu finden.
mit
arm-none-eabi-gcc -print-multi-lib
siehst du welche libs dein compiler hat.
OK Problem gelöst: Ich musste einfach selbst die libgcc.a und die
libgcov.a aus dem lib\gcc\arm-none-eabi\4.6.2\armv7e-m\fpu Verzeichnis
zum linker hinzuzufügen. Schade, dass das CoIDE nicht automatisch macht
wenn man Hard FPU wählt.
Felix schrieb:> OK Problem gelöst: Ich musste einfach selbst die libgcc.a und die> libgcov.a aus dem lib\gcc\arm-none-eabi\4.6.2\armv7e-m\fpu Verzeichnis> zum linker hinzuzufügen. Schade, dass das CoIDE nicht automatisch macht> wenn man Hard FPU wählt.
Muss es auch nicht bei verwendung von gcc zum linken: