Skip to main content
fmiklasz
Associate
June 4, 2010
Question

problem with casting between float and int

  • June 4, 2010
  • 12 replies
  • 3641 views
Posted on June 04, 2010 at 19:09

problem with casting between float and int

    This topic has been closed for replies.

    12 replies

    fmiklasz
    fmiklaszAuthor
    Associate
    May 17, 2011
    Posted on May 17, 2011 at 13:53

    the same hardfault exception

     

    t1_it
    Visitor II
    May 17, 2011
    Posted on May 17, 2011 at 13:53

    I don't know anything about the

    codesourcery compiler but you should not need to cast.  The compiler should generate the code to convert int to float without it.

     

     

    What happens if you remove the cast?

     

    t1_it
    Visitor II
    May 17, 2011
    Posted on May 17, 2011 at 13:53

    What assembly code is the compiler generating for the assignment?

    Can you put a breakpoint on this assignment, switch to disassembly mode in the debugger and step through the code instruction by instruction?

    Andrew Neil
    Super User
    May 17, 2011
    Posted on May 17, 2011 at 13:53

    Do you actually have floating point enabled and properly configured?

    Many embedded toolsets default to not providing floating point support because it can be quire resource hungry - see my 1st reply in this thread:

    [DEAD LINK /public/STe2ecommunities/mcu/Lists/ARM%20CortexM3%20STM32/Flat.aspx?RootFolder=/public/STe2ecommunities/mcu/Lists/ARM CortexM3 STM32/usart printf float&FolderCTID=0x01200200770978C69A1141439FE559EB459D758000626BE2B829C32145B9EB5739142DC17E&TopicsView=https://my.st.com/public/STe2ecommunities/mcu/Lists/ARM%2520CortexM3%2520STM32/AllItems.aspx&currentviews=231]https://my.st.com/public/STe2ecommunities/mcu/Lists/ARM%20CortexM3%20STM32/Flat.aspx?RootFolder=%2fpublic%2fSTe2ecommunities%2fmcu%2fLists%2fARM%20CortexM3%20STM32%2fusart%20printf%20float&FolderCTID=0x01200200770978C69A1141439FE559EB459D758000626BE2B829C32145B9EB5739142DC17E&TopicsView=https%3A%2F%2Fmy%2Est%2Ecom%2Fpublic%2FSTe2ecommunities%2Fmcu%2FLists%2FARM%2520CortexM3%2520STM32%2FAllItems%2Easpx&currentviews=231

    A complex system that works is invariably found to have evolved from a simple system that worked.A complex system designed from scratch never works and cannot be patched up to make it work.
    Tesla DeLorean
    Guru
    May 17, 2011
    Posted on May 17, 2011 at 13:53

    The Cortex-M3 does not support ARM code, only THUMB(2), you are including an ARM library/function and that is why the code traps.

     8001c50: f008 ef0a blx 800aa68 <__aeabi_ui2f>

    0800aa68 <__aeabi_ui2f>: <= 32 BIT ARM CODE

     800aa68: e3a03000 mov r3, #0

    Tips, Buy me a coffee, or three.. PayPal VenmoUp vote any posts that you find helpful, it shows what's working..
    fmiklasz
    fmiklaszAuthor
    Associate
    May 17, 2011
    Posted on May 17, 2011 at 13:53

    as I said I can use floating point variables. I.e. function Sin(float) from math.h goes correct and everything its ok.

    I disassemble the code and simplifing it looks like:

    a = aaa();

    val = a+bbb();

         =>

     8001c40: f7ff ffc4 bl 8001bcc <aaa>

     8001c44: 4603       mov r3, r0

     8001c46: 607b       str r3, [r7, #4]

     8001c48: f001 f944 bl 8002ed4 <bbb>

     8001c4c: 4603       mov r3, r0

     8001c4e: 4618       mov r0, r3

     8001c50: f008 ef0a blx 800aa68 <__aeabi_ui2f>

     8001c54: 4603       mov r3, r0

     8001c56: 4618       mov r0, r3

     8001c58: 6879       ldr r1, [r7, #4]

     8001c5a: f008 ee28 blx 800a8ac <__addsf3>

        

        

        

        

    ....

    0800aa68 <__aeabi_ui2f>:

     800aa68: e3a03000 mov r3, #0

     800aa6c: ea000001 b 800aa78 <__aeabi_i2f+0x8>

    'a' is simply just this :

    float a = aaa(); // float aaa() {return 2.5;}

    and funciton bbb is:

    uint32_t bbb();

    The exception occurred in the line 8001c5. It didn't jump to <__aeabi_ui2f>...

    fmiklasz
    fmiklaszAuthor
    Associate
    May 17, 2011
    Posted on May 17, 2011 at 13:53

    hmm unfortunately I'm new in the arm/cortex world and have prepared by someone a Makefile. As I see there is -mthumb option during compiling and I didn't see any implicite linking oder than library for m3 core... Could you look at this and say where is a mistake?

    TOOLCHAIN_BASE = /opt/CodeSourcery/bin/arm-none-eabi-

    COMPILE_OPTS = -mcpu=cortex-m3 -mthumb -Wall -g -O0 -mfloat-abi=soft

    PROJECT_NAME = plytka

    #====================================================

    # Paths and directories names

    #=====================================================

    WORKSPACE_DIR = workspace

    PROJECT_DIR = /home/$(USER)/$(WORKSPACE_DIR)/$(PROJECT_NAME)

    FIRMWARE_DIR = ./hardware/firmware

    SPD_INC_DIR = $(FIRMWARE_DIR)/STM32F10x_StdPeriph_Driver/inc

    CMSIS_INC_DIR = $(FIRMWARE_DIR)/CMSIS/Core/CM3

    INCLUDE_DIRS = -I. -I$(SPD_INC_DIR) -I$(CMSIS_INC_DIR)

    OUTPUT_DIR = $(PROJECT_DIR)/out

    DOCS_DIR = $(PROJECT_DIR)/doc

    SUBDIRS = hardware

    #=====================================================

    # Input files

    #=====================================================

    C_SRC = $(wildcard *.c)

    CPP_SRC = $(wildcard *.cpp)

    ASM_SRC = $(wildcard *.s)

    #===============================================================================

    # Output files created from input files

    #===============================================================================

    CPP_OBJS = $(addprefix $(OUTPUT_DIR)/,$(CPP_SRC:.cpp=.o))

    C_OBJS = $(addprefix $(OUTPUT_DIR)/,$(C_SRC:.c=.o))

    ASM_OBJS = $(addprefix $(OUTPUT_DIR)/,$(ASM_SRC:.s=.o))

    OBJS = $(ASM_OBJS) $(C_OBJS) $(CPP_OBJS) $(USER_OBJS)

    #===============================================================================

    # tools for compiling, linking and other

    #===============================================================================

    CC = $(TOOLCHAIN_BASE)gcc

    CFLAGS = $(COMPILE_OPTS) $(INCLUDE_DIRS)

    CXX = $(TOOLCHAIN_BASE)g++

    CXXFLAGS = $(COMPILE_OPTS) $(INCLUDE_DIRS)

    AS = $(TOOLCHAIN_BASE)gcc

    ASFLAGS = $(COMPILE_OPTS) -c

    LD = $(TOOLCHAIN_BASE)gcc

    LDFLAGS = -Wl,--gc-sections,-Map=$@.map,-cref,-u,Reset_Handler $(INCLUDE_DIRS) -T $(FIRMWARE_DIR)/stm32.ld

    OBJCP = $(TOOLCHAIN_BASE)objcopy

    OBJCPFLAGS = -O binary

    AR = $(TOOLCHAIN_BASE)ar

    ARFLAGS = cr

    SIZE = $(TOOLCHAIN_BASE)size

    #===============================================================================

    # Destination files

    #===============================================================================

    MAIN_OUT = $(PROJECT_NAME)

    MAIN_OUT_ELF = $(MAIN_OUT).elf

    MAIN_OUT_BIN = $(MAIN_OUT).bin

    #===============================================================================

    # main Makefile rule

    #===============================================================================

    all:

    rm -f $(MAIN_OUT_ELF) $(MAIN_OUT_BIN) $(MAIN_OUT_ELF).map

    $(shell mkdir $(OUTPUT_DIR) 2>/dev/null)

    cd hardware; make all

    make this

    this: $(OBJS) $(MAIN_OUT_ELF) $(MAIN_OUT_BIN) print_size

    #===============================================================================

    # compiling - C source -> objects

    #===============================================================================

    $(OUTPUT_DIR)/%.o : %.c

    @echo 'Compiling file: $<'

    $(CC) -c $(CFLAGS) $< -o $@

    @echo ' '

    #===============================================================================

    # assembling - ASM source -> objects

    #===============================================================================

    $(OUTPUT_DIR)/%.o : %.s

    @echo 'Assembling file: $<'

    $(AS) -c $(ASFLAGS) $< -o $@

    @echo ' '

    #===============================================================================

    # creating destination files

    #===============================================================================

    $(MAIN_OUT_ELF): $(OBJ)

    $(LD) $(LDFLAGS) $(OUTPUT_DIR)/*.o --output $@

    $(MAIN_OUT_BIN): $(MAIN_OUT_ELF)

    $(OBJCP) $(OBJCPFLAGS) $< $@

    sjo2
    Visitor II
    May 17, 2011
    Posted on May 17, 2011 at 13:53

    You CFLAGS contains the correct -mcpu=cortex-m3 -mthumb but the LDFLAGS will also need this info to pull in the correct cortex libs.

    Adding COMPILE_OPTS to the LDFLAGS should solve the problem.

    Cheers

    sjo

    Tesla DeLorean
    Guru
    May 17, 2011
    Posted on May 17, 2011 at 13:53

    Make sure it is pulling the libraries from a lib/thumb2 directory, I don't use GNU/GCC

    Tips, Buy me a coffee, or three.. PayPal VenmoUp vote any posts that you find helpful, it shows what's working..
    bboyandru
    Visitor II
    May 17, 2011
    Posted on May 17, 2011 at 13:53

    Hi,

    I have recently reached the floating point problem for cortex m3 stm32f103 mcu. I saw that compiler generates __aeabi_ui2f which is undefined.

    This problem occurs only when I am trying to cast to float. If I have an unsigned int variable with a value assigned to it and cast this variable to float this is working fine(only if I enable compiler optimizations), but if I pass a number to a function and try to cast that number to float compiler creates this undefined instruction.

    Please let me know if you have managed to get it to work properly.

    I have attached my test project.

    Thank you,

    Andrei