- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hello,
I'm trying to use the FPU in my baremetal project. I use the ARM DS-5 (altera edition) with the DS5-GCC. I try to compile a simple project with the following options:-mfloat-abi=hard -mfpu=vfpv3-d16-fp16 -ftree-vectorize -ffast-math -march=armv7-a -mtune=cortex-a9 -mcpu=cortex-a9
The output is always something like this: gcc version 4.6.3 (Sourcery CodeBench Lite 2012.03-56)
arm-none-eabi-g++ -Taltera-socfpga-hosted.ld -g -O0 -mfloat-abi=hard -mfpu=vfpv3-d16-fp16 -ftree-vectorize -ffast-math -march=armv7-a -mtune=cortex-a9 -mcpu=cortex-a9 -Werror -Wall -Wstrict-prototypes hello.o -o hello.axf
c:/altera/13.1/embedded/host_tools/mentor/gnu/arm/baremetal/bin/../lib/gcc/arm-none-eabi/4.6.3/../../../../arm-none-eabi/bin/ld.exe: error: hello.o uses VFP register arguments, hello.axf does not
c:/altera/13.1/embedded/host_tools/mentor/gnu/arm/baremetal/bin/../lib/gcc/arm-none-eabi/4.6.3/../../../../arm-none-eabi/bin/ld.exe: failed to merge target specific data of file hello.o
collect2: ld returned 1 exit status
make: *** Error 1
Ok, the message let me know, that at least one library (may be i.e. libc...) is not linked for hard floatingpoint. Maybe there is generally no hardware-floatingpoint support by the delivered DS5-GCC compiler/toolchain? Normally the Codesourcery Lite only supports software-floatingpoint and only the standard and professional versions have hardware floatingpoint support. using the flag -mfloat-abi=softfp doesn't work for me. In this case all floating point operation will be done by software and that's to slow. Does anyone know, how to get it work?
Link Copied
10 Replies
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
I found Bare metal example in altera\13.1\embedded\ds-5\examples\bare-metal_boards_examples.zip and when I added simple code to test how compiler interprets operations on doubles:
double a = 5.211312;
double b = 12.2131;
b = b + 1232.21321;
Disassembly looks like this: S:0xFFFF00D4 : VMOV.F64 d9,d0
S:0xFFFF00D8 : VLDR d0,
S:0xFFFF00DC : VMOV.F64 d8,d0
S:0xFFFF00E0 : VLDR d0,
S:0xFFFF00E4 : VADD.F64 d0,d8,d0
S:0xFFFF00E8 : VMOV.F64 d8,d0
S:0xFFFF00EC : VMUL.F64 d1,d9,d8
S:0xFFFF00F0 : VMOV.F64 d0,d1
S:0xFFFF00F4 : VMOV r2,r3,d0
You can see that complier uses FPU instructions. If you want to test it on your code, compiler has following settings: armcc --c99 -O0 --cpu=Cortex-A9 -g -c -o"hello.o" "../hello.c"
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi,
you are using the arm compiler, not the gcc. The armcc works, I know. But I want a gcc solution.- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Sorry, I didn't read your post carefully enough.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
The arm calling convertions for sotf-float and hard-float differ so the entire system has to be built for soft-float or hard-float.
It is possible to use a soft-float library that uses the hard-fp instructions (dunno where you'd find one).- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi,
I switched to the armcc compiler now. HardFP works fine in the hello world sample project. Now I want to get it run in a larger project. But there are some problems. - Compilation works. - I can load the Programm - Execution fails The project uses a Preloader, to initialize Hardware and RAM. The Execution of the Preloader was successfull, but when the main application is loaded, the execution fails (near the entry point). Now the question, does the preloader also have to be compiled with hard floating point support? The effect can be easily reproduced, if you take the sample project Altera-SoCFPGA-HardwareLib-16550-CV-ARMCC and compile it with hard-fpu support. Any advices?- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi,
ok, my mistake, I found the solution, why the code crashed... I had to initialize the FPU before the initialization of the ARM C Library...- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi,
Please help me to update my project for hardware floating point. my make file is like this: //====================================== SOCEDS_ROOT ?= $(SOCEDS_DEST_ROOT) HWLIBS_ROOT = $(SOCEDS_ROOT)/ip/altera/hps/altera_hps/hwlib HWLIBS_SRC := EXAMPLE_SRC := hello.c io.c C_SRC := $(EXAMPLE_SRC) $(HWLIBS_SRC) alt_fpga_manager.c alt_bridge_manager.c alt_clock_manager.c i2c.c cascade_header.c LINKER_SCRIPT := cycloneV-dk-ram-modified.ld MULTILIBFLAGS := -mcpu=cortex-a9 -mfloat-abi=softfp -mfpu=neon-fp16 CFLAGS := -g -O0 -Wall -Werror -std=c99 $(MULTILIBFLAGS) -I$(HWLIBS_ROOT)/include LDFLAGS := -T$(LINKER_SCRIPT) $(MULTILIBFLAGS) CROSS_COMPILE := arm-altera-eabi- CC := $(CROSS_COMPILE)gcc LD := $(CROSS_COMPILE)g++ OC := $(CROSS_COMPILE)objcopy MKIMAGE := mkimage RM := rm -rf CP := cp -f ELF ?= $(basename $(firstword $(C_SRC))).axf OBJ := $(patsubst %.c,%.o,$(C_SRC)) BIN = $(basename $(firstword $(C_SRC))).bin IMG = $(basename $(firstword $(C_SRC)))-mkimage.bin .PHONY: all all: $(BIN) $(ELF) $(IMG) $(SPL) .PHONY: clean clean: $(RM) $(ELF) $(HWLIBS_SRC) $(OBJ) $(BIN) $(IMG) %.c: $(HWLIBS_ROOT)/src/hwmgr/%.c $(CP) $< $@ $(OBJ): %.o: %.c Makefile $(CC) $(CFLAGS) -c $< -o $@ $(ELF): $(OBJ) $(LD) $(LDFLAGS) $(OBJ) -o $@ $(BIN): $(ELF) $(OC) -O binary $(ELF) $(BIN) $(IMG): $(BIN) $(MKIMAGE) -A arm -T standalone -C none -a 0x100040 -e 0 -n "baremetal image" -d $(BIN) $(IMG) //====================================== where I need to change ?? I have tried with hard in place of softfp and it gives me error in build project error is like this: //================= error: hello.o uses VFP register arguments, hello.axf does not //================= please help me as soon as possible Thanks in advance.- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi stefmaster,
can u please let me know what I need to change to use hard mfpu in my design. whan I update my makefile like this: MULTILIBFLAGS := -mcpu=cortex-a9 -mfloat-abi=hard -mfpu=neon-fp16 I got error that: hello.o uses VFP register arguments, hello.axf does not I am working on cyclone V soc with GCC compiler.- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
is your gcc compiler is free one? i check the release note that only the paid version of compiler allowed to use the hard floating point.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
HI,
Can anyone indicate the solution for the above problem? Since I am having the same problem and need to know how to solve it. When I set the -mfloat-abi to "hard" I get the error "AAA.o uses VFP register arguments, BBB.axf does not". I have read that the problem might be that part of the system is using soft-float ABI, but I don't know how I can solve it. Any help is greatly appreciated.
Reply
Topic Options
- Subscribe to RSS Feed
- Mark Topic as New
- Mark Topic as Read
- Float this Topic for Current User
- Bookmark
- Subscribe
- Printer Friendly Page