If I compile GCC project for Cortex-M4 (LPC4357) and use -mcpu=cortex-m4 switch floats aren't working (calls blx __addsf3, which eventually branches to stmia command, which results in an error interrupt, probably due to bad values in registers). If I compile with -mcpu=cortex-m3 it calls bl __addsf3, which has a different source and works.
I think I might have to fix other switches in order to make floats work with -mcpu=cortex-m4... I tried several things, but this is really strange.
Relevant compiler and linker switches:
Compiler: -mthumb -mcpu=cortex-m4 -std=c99 -c -g -D DEBUG -D gcc
Linker: -nostartfiles -nostdlib -nodefaultlibs -fno-exceptions -mthumb -mcpu=cortex-m4 -mfloat-abi=hard -mfpu=fpv4-sp-d16 -O0 -lgcc -lc
Can you tell if I'm missing something obvious here?
With the GNU Tools for ARM Embedded Processors toolchain provided by ARM, you need to compile with:
-mthumb -mcpu=cortex-m4 -mfloat-abi=hard -mfpu=fpv4-sp-d16
to use hardware floating point. See the following table from the readme.txt file:
Architecture options usage -------------------------------------------------------------------- | ARM Core | Command Line Options | multilib | |----------|--------------------------------------------|----------| |Cortex-M0+| -mthumb -mcpu=cortex-m0plus | armv6-m | |Cortex-M0 | -mthumb -mcpu=cortex-m0 | | |Cortex-M1 | -mthumb -mcpu=cortex-m1 | | | |--------------------------------------------| | | | -mthumb -march=armv6-m | | |----------|--------------------------------------------|----------| |Cortex-M3 | -mthumb -mcpu=cortex-m3 | armv7-m | | |--------------------------------------------| | | | -mthumb -march=armv7-m | | |----------|--------------------------------------------|----------| |Cortex-M4 | -mthumb -mcpu=cortex-m4 | armv7e-m | |(No FP) |--------------------------------------------| | | | -mthumb -march=armv7e-m | | |----------|--------------------------------------------|----------| |Cortex-M4 | -mthumb -mcpu=cortex-m4 -mfloat-abi=softfp | armv7e-m | |(Soft FP) | -mfpu=fpv4-sp-d16 | /softfp | | |--------------------------------------------| | | | -mthumb -march=armv7e-m -mfloat-abi=softfp | | | | -mfpu=fpv4-sp-d16 | | |----------|--------------------------------------------|----------| |Cortex-M4 | -mthumb -mcpu=cortex-m4 -mfloat-abi=hard | armv7e-m | |(Hard FP) | -mfpu=fpv4-sp-d16 | /fpu | | |--------------------------------------------| | | | -mthumb -march=armv7e-m -mfloat-abi=hard | | | | -mfpu=fpv4-sp-d16 | | |----------|--------------------------------------------|----------| |Cortex-R4 | [-mthumb] -march=armv7-r | armv7-ar | |Cortex-R5 | | /thumb | |Cortex-R7 | | | |(No FP) | | | |----------|--------------------------------------------|----------| |Cortex-R4 | [-mthumb] -march=armv7-r -mfloat-abi=softfp| armv7-ar | |Cortex-R5 | -mfpu=vfpv3-d16 | /thumb | |Cortex-R7 | | /softfp | |(Soft FP) | | | |----------|--------------------------------------------|----------| |Cortex-R4 | [-mthumb] -march=armv7-r -mfloat-abi=hard | armv7-ar | |Cortex-R5 | -mfpu=vfpv3-d16 | /thumb | |Cortex-R7 | | /fpu | |(Hard FP) | | | |----------|--------------------------------------------|----------| |Cortex-A* | [-mthumb] -march=armv7-a | armv7-ar | |(No FP) | | /thumb | |----------|--------------------------------------------|----------| |Cortex-A* | [-mthumb] -march=armv7-a -mfloat-abi=softfp| armv7-ar | |(Soft FP) | -mfpu=vfpv3-d16 | /thumb | | | | /softfp | |----------|--------------------------------------------|----------| |Cortex-A* | [-mthumb] -march=armv7-a -mfloat-abi=hard | armv7-ar | |(Hard FP) | -mfpu=vfpv3-d16 | /thumb | | | | /fpu | --------------------------------------------------------------------
You should really read the README file that come with gcc toolchains no matter where you get them from.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With