Problem whith makefile about double and float

kamran99kamran wrote on Monday, March 17, 2014:


i have some problem about double!
Through terminal there is some query, that i should give some number.
for example how much delay in per hour.
if i give through terminal a number 1.1 h then it printed about -1173000!
It shall print only 1.1.
And i think, maybe there is some problem about makefile from FreeRTOS.
( because it doesn’t compiler through FreeRTOS to STM32F407 Processor! )

And I believe something throug this line shall be solved!

– CPU = -mcpu=cortex-m4 -mthumb -mfloat-abi=softfp -mfpu=fpv4-sp-d16

Please I need help, thanks

here is the fully Code of Makefile:

Optimization level, can be [0, 1, 2, 3, s].

0 = turn off optimization. s = optimize for size.

OPT = 0

Object files directory

Warning: this will be removed by make clean!

OBJDIR = obj

Target file name (without extension)

#TARGET = $(OBJDIR)/main

Define all C source files (dependencies are generated automatically)

SOURCES += src/uart.c
SOURCES += src/ustime.c
SOURCES += src/main.c
SOURCES += src/startup_stm32f4xx.S
SOURCES += src/system_stm32f4xx.c
SOURCES += src/syscalls.c
SOURCES += src/modbus.c
SOURCES += src/test.c
SOURCES += src/get.c
SOURCES += src/heap_2.c

SOURCES += FreeRTOS/Source/tasks.c
SOURCES += FreeRTOS/Source/queue.c
SOURCES += FreeRTOS/Source/list.c
SOURCES += FreeRTOS/Source/croutine.c
SOURCES += FreeRTOS/Source/portable/GCC/ARM_CM4F/port.c

SOURCES += libs/STM32F4xx_StdPeriph_Driver/src/misc.c
SOURCES += libs/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_adc.c
SOURCES += libs/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_can.c
SOURCES += libs/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_crc.c
SOURCES += libs/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_cryp.c
SOURCES += libs/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_cryp_aes.c
SOURCES += libs/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_cryp_des.c
SOURCES += libs/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_cryp_tdes.c
SOURCES += libs/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_dac.c
SOURCES += libs/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_dbgmcu.c
SOURCES += libs/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_dcmi.c
SOURCES += libs/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_dma.c
SOURCES += libs/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_exti.c
SOURCES += libs/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_flash.c
SOURCES += libs/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_fsmc.c
SOURCES += libs/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_gpio.c
SOURCES += libs/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_hash.c
SOURCES += libs/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_hash_md5.c
SOURCES += libs/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_hash_sha1.c
SOURCES += libs/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_i2c.c
SOURCES += libs/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_iwdg.c
SOURCES += libs/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_pwr.c
SOURCES += libs/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_rcc.c
SOURCES += libs/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_rng.c
SOURCES += libs/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_rtc.c
SOURCES += libs/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_sdio.c
SOURCES += libs/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_spi.c
SOURCES += libs/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_syscfg.c
SOURCES += libs/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_tim.c
SOURCES += libs/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_usart.c
SOURCES += libs/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_wwdg.c

OBJECTS = $(addprefix $(OBJDIR)/,$(addsuffix .o,$(basename $(SOURCES))))

Place -D, -U or -I options here for C and C++ sources

CPPFLAGS += -IFreeRTOS/Source/include
CPPFLAGS += -Ilibs/CMSIS/Include
CPPFLAGS += -Ilibs/Device/STM32F4xx/Include
CPPFLAGS += -Ilibs/STM32F4xx_StdPeriph_Driver/inc

#---------------- Compiler Options C ----------------

-g*: generate debugging information

-O*: optimization level

-f…: tuning, see GCC documentation

-Wall…: warning level

-Wa,…: tell GCC to pass this to the assembler.

-adhlns…: create assembler listing

CFLAGS += -std=gnu99
CFLAGS += -gdwarf-2
CFLAGS += -ffunction-sections
CFLAGS += -fdata-sections
CFLAGS += -Wall
#CFLAGS += -Wextra
#CFLAGS += -Wpointer-arith
#CFLAGS += -Wstrict-prototypes
#CFLAGS += -Winline
#CFLAGS += -Wunreachable-code
#CFLAGS += -Wundef
CFLAGS += -Wa,-adhlns=$(OBJDIR)/$(*F).lst

Optimize use of the single-precision FPU

CFLAGS += -fsingle-precision-constant

This will not work without recompiling libs

CFLAGS += -fshort-double

#---------------- Compiler Options C++ ----------------


#---------------- Assembler Options ----------------

-Wa,…: tell GCC to pass this to the assembler

-adhlns: create listing

ASFLAGS = -Wa,-adhlns=$(OBJDIR)/$(*F).lst

#---------------- Linker Options ----------------

-Wl,…: tell GCC to pass this to linker

-Map: create map file

–cref: add cross reference to map file

LDFLAGS += -lm
LDFLAGS += -Wl,-Map=$(TARGET).map,–cref
LDFLAGS += -Wl,–gc-sections
LDFLAGS += -Tsrc/stm32_flash.ld


Define programs and commands

TOOLCHAIN = d:/Programme/CodeSourcery/Sourcery_2011_09_ARM_EABI/bin/arm-none-eabi
OPENOCD = D:\Tools\openocd-0.7.0\bin\openocd-0.7.0.exe
DOXYGEN = doxygen
STLINK = tools/ST-LINK_CLI.exe
MKDIR = d:\tools\unxutils\bin\mkdir.exe

SUBWCREV = tools/SubWCRev64.exe
SUBWCREV = tools/SubWCRev.exe

Compiler flags to generate dependency files


Combine all necessary flags and optional flags

Add target processor to flags.

#CPU = -mcpu=cortex-m3 -mthumb -mfloat-abi=soft
#CPU = -mcpu=cortex-m4 -mthumb

// kannst du mal nach dem problem suchen? Und dich ueber floating point probleme informieren?
// auf der ARM cpu oder spezielle dieser F407 cpu

CPU = -mcpu=cortex-m4 -mthumb -mfloat-abi=softfp -mfpu=fpv4-sp-d16
#CPU = -mcpu=cortex-m4 -mthumb


Default target.

all: setup gccversion build showsize

$(MKDIR) -p $(OBJDIR)\src
$(MKDIR) -p $(OBJDIR)\FreeRTOS\Source
$(MKDIR) -p $(OBJDIR)\FreeRTOS\Source\portable\GCC\ARM_CM4F
$(MKDIR) -p $(OBJDIR)\libs\STM32F4xx_StdPeriph_Driver\src

build: elf hex lss sym bin

elf: $(TARGET).elf
hex: $(TARGET).hex
bin: $(TARGET).bin
lss: $(TARGET).lss
sym: $(TARGET).sym

@echo Creating Doxygen documentation

Display compiler version information

@$(CC) --version

Show the final program size

showsize: elf
@$(SIZE) $(TARGET).elf

debug level


interface and board/target settings (using the OOCD target-library here)

OOCD_CL+=-c “fast enable”

OOCD_CL+=-f interface/signalyzer.cfg -f openocd/stm32f4x.cfg
OOCD_CL+=-f openocd/config.cfg
OOCD_CL+=-c init -c targets

commands to prepare flash-write

OOCD_CL+=-c “halt”

flash-write and -verify

OOCD_CL+=-c “flash write_image erase $(TARGET).elf” -c “verify_image $(TARGET).elf”

reset target

OOCD_CL+=-c “reset run”

terminate OOCD after programming

OOCD_CL+=-c shutdown

Flash the device

flash: hex

$(OPENOCD) -f “interface/signalyzer.cfg” -f “openocd/stm32f4x.cfg” -f “openocd/config.cfg” -c “flash_image $(TARGET).elf; shutdown”


$(STLINK) -c SWD -P $(TARGET).hex -Run

Target: clean project

@echo Cleaning project:
rm -rf $(OBJDIR)
rm -rf docs/html

Create extended listing file from ELF output file

%.lss: %.elf
@echo Creating Extended Listing: $@
$(OBJDUMP) -h -S -z $< > $@

Create a symbol table from ELF output file

%.sym: %.elf
@echo Creating Symbol Table: $@
$(NM) -n $< > $@

Link: create ELF output file from object files

@echo Linking: $@
$(CC) $^ $(LDFLAGS) --output $@

Create final output files (.hex, .eep) from ELF output file.

%.hex: %.elf
@echo Creating hex file: $@
$(OBJCOPY) -O ihex $< $@

Create bin file :

%.bin: %.elf
@echo Creating bin file: $@
$(OBJCOPY) -O binary $< $@

Compile: create object files from C source files

$(OBJDIR)/%.o : %.c
@echo Compiling C: $<
$(CC) -c $(CPPFLAGS) $(CFLAGS) $(GENDEPFLAGS) $< -o $@

Compile: create object files from C++ source files

$(OBJDIR)/%.o : %.cpp
@echo Compiling CPP: $<

Assemble: create object files from assembler source files

$(OBJDIR)/%.o : %.s
@echo Assembling: $<
$(CC) -c $(CPPFLAGS) $(ASFLAGS) $< -o $@

Include the dependency files

-include $(wildcard $(OBJDIR)/*.d)

Listing of phony targets

.PHONY: all build flash clean
doxygen elf lss sym
showsize gccversion
build elf hex bin lss sym clean clean_list setup program

rtel wrote on Monday, March 17, 2014:

There are few things that can effect printing of floating point numbers, only one of which is FreeRTOS related.

In the past we have found that stacks must be 8 byte aligned to use optimised floating point printf() functions - this is inline with the official ABI from ARM but we had been reliably informed 4 was enough but evidentially not! All FreeRTOS Cortex-M ports have had the correct 8 byte alignment for a long time now, so it should not be an issue, but just to double check try using printf() on a double before starting the scheduler, so the stack is exactly the stack setup by the tools for use by main() and not the task stack.

If it fails from main() too then you need to look at your compiler options and the support for floating point in your library build. Many libraries come in multiple versions, with full, partial or no floating point support to save code space. The easiest thing to do with regards to compiler options is look in the ARM GCC FAQs, and other example projects.


kamran99kamran wrote on Tuesday, March 18, 2014:

It is the true, that it even failed from main() too.
I am using CodeSourcery!
I have looked in ARM GCC FAQs, but there is not some solution to my problem.
I am using STM32F407ZGT6.

please show me the linking to website!

rtel wrote on Tuesday, March 18, 2014:

Please contact CodeSourcery about this issue. They should be able to tell you the command line options or the libraries needed, or at least have some documentation they can point you to.