Quality RTOS & Embedded Software

 Real time embedded FreeRTOS RSS feed 
Quick Start Supported MCUs PDF Books Trace Tools Ecosystem


Problem whith makefile about double and float

Posted by kamran99kamran on 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)


Define all C source files (dependencies are generated automatically)

# SOURCES += src/uart.c SOURCES += src/ustime.c SOURCES += src/main.c SOURCES += src/startupstm32f4xx.S SOURCES += src/systemstm32f4xx.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/STM32F4xxStdPeriphDriver/src/misc.c SOURCES += libs/STM32F4xxStdPeriphDriver/src/stm32f4xxadc.c SOURCES += libs/STM32F4xxStdPeriphDriver/src/stm32f4xxcan.c SOURCES += libs/STM32F4xxStdPeriphDriver/src/stm32f4xxcrc.c SOURCES += libs/STM32F4xxStdPeriphDriver/src/stm32f4xxcryp.c SOURCES += libs/STM32F4xxStdPeriphDriver/src/stm32f4xxcrypaes.c SOURCES += libs/STM32F4xxStdPeriphDriver/src/stm32f4xxcrypdes.c SOURCES += libs/STM32F4xxStdPeriphDriver/src/stm32f4xxcryptdes.c SOURCES += libs/STM32F4xxStdPeriphDriver/src/stm32f4xxdac.c SOURCES += libs/STM32F4xxStdPeriphDriver/src/stm32f4xxdbgmcu.c SOURCES += libs/STM32F4xxStdPeriphDriver/src/stm32f4xxdcmi.c SOURCES += libs/STM32F4xxStdPeriphDriver/src/stm32f4xxdma.c SOURCES += libs/STM32F4xxStdPeriphDriver/src/stm32f4xxexti.c SOURCES += libs/STM32F4xxStdPeriphDriver/src/stm32f4xxflash.c SOURCES += libs/STM32F4xxStdPeriphDriver/src/stm32f4xxfsmc.c SOURCES += libs/STM32F4xxStdPeriphDriver/src/stm32f4xxgpio.c SOURCES += libs/STM32F4xxStdPeriphDriver/src/stm32f4xxhash.c SOURCES += libs/STM32F4xxStdPeriphDriver/src/stm32f4xxhashmd5.c SOURCES += libs/STM32F4xxStdPeriphDriver/src/stm32f4xxhashsha1.c SOURCES += libs/STM32F4xxStdPeriphDriver/src/stm32f4xxi2c.c SOURCES += libs/STM32F4xxStdPeriphDriver/src/stm32f4xxiwdg.c SOURCES += libs/STM32F4xxStdPeriphDriver/src/stm32f4xxpwr.c SOURCES += libs/STM32F4xxStdPeriphDriver/src/stm32f4xxrcc.c SOURCES += libs/STM32F4xxStdPeriphDriver/src/stm32f4xxrng.c SOURCES += libs/STM32F4xxStdPeriphDriver/src/stm32f4xxrtc.c SOURCES += libs/STM32F4xxStdPeriphDriver/src/stm32f4xxsdio.c SOURCES += libs/STM32F4xxStdPeriphDriver/src/stm32f4xxspi.c SOURCES += libs/STM32F4xxStdPeriphDriver/src/stm32f4xxsyscfg.c SOURCES += libs/STM32F4xxStdPeriphDriver/src/stm32f4xxtim.c SOURCES += libs/STM32F4xxStdPeriphDriver/src/stm32f4xxusart.c SOURCES += libs/STM32F4xxStdPeriphDriver/src/stm32f4xx_wwdg.c

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

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

CPPFLAGS += -Isrc CPPFLAGS += -IFreeRTOS/Source/include CPPFLAGS += -Ilibs/CMSIS/Include CPPFLAGS += -Ilibs/Device/STM32F4xx/Include CPPFLAGS += -Ilibs/STM32F4xxStdPeriphDriver/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 = -O$(OPT) 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/Sourcery201109ARMEABI/bin/arm-none-eabi CC = $(TOOLCHAIN)-gcc OBJCOPY = $(TOOLCHAIN)-objcopy OBJDUMP = $(TOOLCHAIN)-objdump SIZE = $(TOOLCHAIN)-size NM = $(TOOLCHAIN)-nm OPENOCD = D:Toolsopenocd-0.7.0binopenocd-0.7.0.exe DOXYGEN = doxygen STLINK = tools/ST-LINK_CLI.exe MKDIR = d:toolsunxutilsbinmkdir.exe

ifeq (AMD64, $(PROCESSOR_ARCHITEW6432)) SUBWCREV = tools/SubWCRev64.exe else SUBWCREV = tools/SubWCRev.exe endif

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

setup: $(MKDIR) -p $(OBJDIR) $(MKDIR) -p $(OBJDIR)src $(MKDIR) -p $(OBJDIR)FreeRTOSSource $(MKDIR) -p $(OBJDIR)FreeRTOSSourceportableGCCARMCM4F $(MKDIR) -p $(OBJDIR)libsSTM32F4xxStdPeriph_Driversrc

build: elf hex lss sym bin

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

doxygen: @echo @echo Creating Doxygen documentation @$(DOXYGEN)

Display compiler version information

gccversion: @$(CC) --version

Show the final program size

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

debug level


interface and board/target settings (using the OOCD target-library here)
OOCD_CL+=-c "fast enable"

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

commands to prepare flash-write

OOCD_CL+=-c "halt"

flash-write and -verify

OOCDCL+=-c "flash writeimage 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

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

Create extended listing file from ELF output file

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

Create a symbol table from ELF output file

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

Link: create ELF output file from object files

.SECONDARY: $(TARGET).elf .PRECIOUS: $(OBJECTS) $(TARGET).elf: $(OBJECTS) @echo @echo Linking: $@ $(CC) $^ $(LDFLAGS) --output $@

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

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

Create bin file :

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

Compile: create object files from C source files

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

Compile: create object files from C++ source files

$(OBJDIR)/%.o : %.cpp @echo @echo Compiling CPP: $< $(CC) -c $(CPPFLAGS) $(CXXFLAGS) $(GENDEPFLAGS) $< -o $@

Assemble: create object files from assembler source files

$(OBJDIR)/%.o : %.s @echo @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

Problem whith makefile about double and float

Posted by rtel on 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.


Problem whith makefile about double and float

Posted by kamran99kamran on 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!

Problem whith makefile about double and float

Posted by rtel on 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.


[ Back to the top ]    [ About FreeRTOS ]    [ Privacy ]    [ Sitemap ]    [ ]

Copyright (C) Amazon Web Services, Inc. or its affiliates. All rights reserved.

Latest News

FreeRTOS v10.2.1 is available for immediate download. MIT licensed, includes 64-bit RISC-V, NXP Cortex-M33 demo, Nuvoton Cortex-M23 demo & STM32H745 dual core (AMP) demo.

NXP tweet showing LPC5500 (ARMv8-M Cortex-M33) running FreeRTOS.

View a recording of the "OTA Update Security and Reliability" webinar, presented by TI and AWS.


FreeRTOS and other embedded software careers at AWS.

FreeRTOS Partners

ARM Connected RTOS partner for all ARM microcontroller cores

Cadence Tensilica Cortes

Espressif ESP32

IAR Partner

Microchip Premier RTOS Partner

RTOS partner of NXP for all NXP ARM microcontrollers





STMicro RTOS partner supporting ARM7, ARM Cortex-M3, ARM Cortex-M4 and ARM Cortex-M0

Texas Instruments MCU Developer Network RTOS partner for ARM and MSP430 microcontrollers

OpenRTOS and SafeRTOS

Xilinx Microblaze and Zynq partner