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.