Hallo, ich versuche mich an der FPU des STM32F4 mit CooCox und 'gcc-arm-none-eabi'. Die Multiplikation zweier Float-Zahlen aus der 'main.c' im Anhang funktioniert und erzeugt im Disassembler den Befehl 08000288: vmul.f32 s15, s14, s15 Jedoch wird bei 'sqrtf()' die FPU anscheinend nicht benutzt, denn der Disassembler zeigt 08000294: bl 0x8000570 <sqrtf> statt vsqrt.f32 wie es lt. http://www.atmel.com/Images/Atmel-42144-SAM4E-FPU-and-CMSIS-DSP-Library_AP-Note_AT03157.pdf und Beitrag "Re: Floating Pointing Unit STM32F4" eigentlich sein sollte. Ich benutze 'gcc-arm-none-eabi 5.4'. Als libm.a verwende ich die aus dem Verzeichnis \arm-none-eabi\lib\armv7e-m\fpu Andere Versuche mit \arm-none-eabi\lib\fpu\libm.a \arm-none-eabi\lib\armv7e-m\fpu\libm.a \arm-none-eabi\lib\armv7-m\libm.a \arm-none-eabi\lib\armv7-ar\thumb\fpu\libm.a \arm-none-eabi\lib\armv7e-m\fpu\fpv5-d16\libm.a bringen bestenfalls das gleiche Ergebnis, in manchen Fällen läuft auch das Programm nicht mehr oder das Kompilieren/Linken bricht mit einer Fehlermeldung ab. Ich hatte irgendwo gelesen, dass die o.g. \arm-none-eabi\lib\armv7e-m\fpu\libm.a benutzt werden soll. Allerdings ist ARMv7E-M meines Wissens die Architektur des Cortex-M7. Die Architektur des Cortex-M4 ist lt. https://de.wikipedia.org/wiki/ARM-Architektur die ARMv7-M. Ein Verzeichnis \arm-none-eabi\lib\armv7-m\fpu ist aber leider bei mir nicht vorhanden. Kann mir jemand helfen? Gruß Dirk P.S.: Compileraufruf: 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 -IC:\CooCox\CoIDE\workspace\Testprojekt_02 -IC:\CooCox\CoIDE\workspace\Testprojekt_02\cmsis_boot -IC:\CooCox\CoIDE\workspace -IC:\CooCox\CoIDE\workspace\Testprojekt_02\cmsis_lib -IC:\CooCox\CoIDE\workspace\Testprojekt_02\cmsis -IC:\CooCox\CoIDE\workspace\Testprojekt_02\cmsis_lib\include C:\CooCox\CoIDE\workspace\Testprojekt_02\main.c Linkeraufruf: arm-none-eabi-gcc -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard -mthumb -Wall -g -nostartfiles -Wl,-Map=Testprojekt_02.map -O0 -Wl,--gc-sections -LC:\CooCox\CoIDE\configuration\ProgramData\Testprojekt_02 -Wl,-TC:\CooCox\CoIDE\configuration\ProgramData\Testprojekt_02/arm-gcc-l ink.ld -g -o Testprojekt_02.elf ..\obj\startup_stm32f4xx.o ..\obj\main.o ..\obj\stm32f4xx_rcc.o ..\obj\stm32f4xx_gpio.o ..\obj\system_stm32f4xx.o -L..\..\.. -lm
Dirk schrieb: > Ich benutze 'gcc-arm-none-eabi 5.4'. Als libm.a verwende ich die aus dem > Verzeichnis > \arm-none-eabi\lib\armv7e-m\fpu GCC ist durchaus in der Lage sich die korrekte Lib selbst rauszusuchen, Du musst ihm aber beim Linken die Optionen für CPU und FPU mit angeben. Mein GCC generiert da interessanten Code:
1 | 22: eef1 7ac7 vsqrt.f32 s15, s14 |
2 | 26: eef4 7a67 vcmp.f32 s15, s15 |
3 | 2a: eef1 fa10 vmrs APSR_nzcv, fpscr |
4 | 2e: d005 beq.n 3c <main+0x3c> |
5 | 30: eeb0 0a47 vmov.f32 s0, s14 |
6 | 34: f7ff fffe bl 0 <sqrtf> |
Da wird sqrtf() offenbar für die Sonderfälle aufgerufen. Ich nehme an dass die Arbeitsweise der Instruktion nicht 100%ig mit der C-Definition für Square Root übereinstimmt. Übrigens generert er nur die vsqrt.f32 Instruktion mit "-ffast-math".
Jim M. schrieb: > GCC ist durchaus in der Lage sich die korrekte Lib selbst rauszusuchen, > Du musst ihm aber beim Linken die Optionen für CPU und FPU mit angeben. Was müsste ich denn dazu bei meinem Linker-Aufruf (siehe oben) ändern? Jim M. schrieb: > Mein GCC generiert da interessanten Code: Arbeitest Du auch mit CooCox? Wie sieht denn Dein Compiler-, Linkeraufruf aus? Und welchen libm.a-Pfad benutzt Du? Jim M. schrieb: > Da wird sqrtf() offenbar für die Sonderfälle aufgerufen. Ich nehme an > dass die Arbeitsweise der Instruktion nicht 100%ig mit der C-Definition > für Square Root übereinstimmt. Was meinst Du denn mit "Sonderfälle"? > > Übrigens generert er nur die vsqrt.f32 Instruktion mit "-ffast-math". Habe ich bei CooCox unter 'Misc Controls' eingetragen und erschien dann auch in der Konsole beim Compileraufruf. Hat aber leider nichts geholfen...
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.