Создал проект для GCC Cortex-M3. Проект содержит только функцию main следующего содержания
Код
#include "efm32g890f128.h"
#include <math.h>
volatile float DeltaX=50, DeltaY=120, Angle=3.14/4;
volatile float Delta;
volatile unsigned char DistanceFlag;
int main() {
while (1) {
float dx=DeltaX, dy=DeltaY, angle=Angle, distance_delta;
dx=dx*cos(angle);
distance_delta=dx*dx+dy*dy;
distance_delta=sqrt(distance_delta);
if (distance_delta>100)
DistanceFlag=1;
Delta=distance_delta;
}
}
#include <math.h>
volatile float DeltaX=50, DeltaY=120, Angle=3.14/4;
volatile float Delta;
volatile unsigned char DistanceFlag;
int main() {
while (1) {
float dx=DeltaX, dy=DeltaY, angle=Angle, distance_delta;
dx=dx*cos(angle);
distance_delta=dx*dx+dy*dy;
distance_delta=sqrt(distance_delta);
if (distance_delta>100)
DistanceFlag=1;
Delta=distance_delta;
}
}
Получил на выходе
Код
10416 1092 264 11772 2dfc ./exe/efm_cpp_main.axf
Что так много-то?
Запустил elf в Keil. Цикл while выполнился за ~3500 тактов, если Keil мне не врёт.
Makefile:
CODE
#+---------------------------------------------------------------------------
#
# Copyright © 2010 Anton Gusev aka AHTOXA (HTTP://AHTOXA.NET)
#
# File: makefile
#
# Contents: makefile to build arm Cortex-M3 software with gcc
#
#----------------------------------------------------------------------------
############# program name
TARGET = efm_cpp_main
# program version
VER_MAJOR = 0
VER_MINOR = 1
TOOL = arm-none-eabi-
# TOOL = arm-kgp-eabi-
# compile options
MCU = cortex-m3
OPTIMIZE = -O3
USE_LTO = NO
# Select family
# STM32F10X_LD : STM32 Low density devices
# STM32F10X_LD_VL : STM32 Low density Value Line devices
# STM32F10X_MD : STM32 Medium density devices
# STM32F10X_MD_VL : STM32 Medium density Value Line devices
# STM32F10X_HD : STM32 High density devices
# STM32F10X_HD_VL : STM32 XL-density devices
# STM32F10X_CL : STM32 Connectivity line devices
# STM32F10X_XL : STM32G890 XL-density devices
CHIP = EFM32G890
#defines
DEFS = -D$(CHIP)
DEFS += -DVER_MAJOR=$(VER_MAJOR)
DEFS += -DVER_MINOR=$(VER_MINOR)
###########################################################
# common part for all my cortex-m3 projects
###########################################################
BASE = .
CC = $(TOOL)gcc
CXX = $(TOOL)g++
LD = $(TOOL)g++
AS = $(CC) -x assembler-with-cpp
OBJCOPY = $(TOOL)objcopy
OBJDUMP = $(TOOL)objdump
SIZE = $(TOOL)size -d
FLASHER = openocd
RM = rm -f
CP = cp
MD = mkdir
# dirs
SRCDIR = $(BASE)/src
OBJDIR = $(BASE)/obj
EXEDIR = $(BASE)/exe
LSTDIR = $(BASE)/lst
PRJDIR = $(BASE)/prj
BAKDIR = $(BASE)/bak
#files
HEX = $(EXEDIR)/$(TARGET).hex
BIN = $(EXEDIR)/$(TARGET).bin
ELF = $(EXEDIR)/$(TARGET).axf
MAP = $(LSTDIR)/$(TARGET).map
LSS = $(LSTDIR)/$(TARGET).lss
OK = $(EXEDIR)/$(TARGET).ok
# linker script (chip dependent)
LD_SCRIPT = $(PRJDIR)/$(CHIP).ld
# source directories (all *.c, *.cpp and *.S files included)
DIRS := $(SRCDIR)
DIRS += $(COMMON)
# includes
INCS := $(patsubst %, -I "%", $(DIRS))
# individual source files
SRCS :=
#calc obj files list
OBJS := $(SRCS)
OBJS += $(wildcard $(addsuffix /*.cpp, $(DIRS)))
OBJS += $(wildcard $(addsuffix /*.c, $(DIRS)))
OBJS += $(wildcard $(addsuffix /*.S, $(DIRS)))
OBJS := $(notdir $(OBJS))
OBJS := $(OBJS:.cpp=.o)
OBJS := $(OBJS:.c=.o)
OBJS := $(OBJS:.S=.o)
OBJS := $(patsubst %, $(OBJDIR)/%, $(OBJS))
#files to archive
ARCFILES = \
$(SRCDIR) \
$(PRJDIR) \
$(BASE)/makefile \
$(BASE)/.cproject \
$(BASE)/.project
# flags
FLAGS = -mcpu=$(MCU) -mthumb
FLAGS += $(INCS)
FLAGS += -MD
FLAGS += $(DEFS)
FLAGS += -Wa,-adhlns=$(addprefix $(LSTDIR)/, $(notdir $(addsuffix .lst, $(basename $<))))
AFLAGS = $(FLAGS)
CFLAGS = $(FLAGS)
CFLAGS += $(OPTIMIZE)
CFLAGS += -std=gnu99
CFLAGS += -g
CFLAGS += -ffunction-sections -fdata-sections
CFLAGS += -Wall -Wextra
CFLAGS += -Wimplicit -Wcast-align -Wpointer-arith -Wredundant-decls
CFLAGS += -Wshadow -Wcast-qual -Wcast-align -Wnested-externs -pedantic
CXXFLAGS = $(FLAGS)
CXXFLAGS += $(OPTIMIZE)
CXXFLAGS += -g
CXXFLAGS += -fno-exceptions -fno-rtti
CXXFLAGS += -ffunction-sections -fdata-sections
CXXFLAGS += -fno-threadsafe-statics
CXXFLAGS += -funsigned-bitfields -fshort-enums
CXXFLAGS += -Wall -Wextra
CXXFLAGS += -Winline
CXXFLAGS += -Wpointer-arith -Wredundant-decls
CXXFLAGS += -Wshadow -Wcast-qual -Wcast-align -pedantic
LD_FLAGS = -mcpu=$(MCU)
LD_FLAGS += -mthumb
LD_FLAGS += -nostartfiles
LD_FLAGS += -Wl,-Map="$(MAP)",--cref
LD_FLAGS += -Wl,--gc-sections
LD_FLAGS += -T$(LD_SCRIPT)
ifeq ($(USE_LTO),YES)
CFLAGS += -flto
CXXFLAGS += -flto
LD_FLAGS += -flto $(OPTIMIZE)
endif
#openocd command-line
# debug level (d0..d3)
oocd_params = -d0
# interface and board/target settings (using the OOCD target-library here)
# oocd_params += -c "fast enable"
oocd_params += -f interface/arm-usb-ocd.cfg
oocd_params += -f board/stm32f10x_128k_eval.cfg
oocd_params += -c init -c targets
oocd_params_program = $(oocd_params)
# commands to prepare flash-write
oocd_params_program += -c "halt"
# flash-write and -verify
oocd_params_program += -c "flash write_image erase $(ELF)"
oocd_params_program += -c "verify_image $(ELF)"
# reset target
oocd_params_program += -c "reset run"
# terminate OOCD after programming
oocd_params_program += -c shutdown
oocd_params_reset = $(oocd_params)
oocd_params_reset += -c "reset run"
oocd_params_reset += -c shutdown
.SILENT :
.PHONY: all start dirs build clean program reset archive
############# targets
all : start dirs $(ELF) $(BIN) $(LSS) $(OK)
build: clean all
start:
@echo --- building $(TARGET)
$(LSS): $(ELF) makefile
@echo --- making asm-lst...
# @$(OBJDUMP) -dStC $(ELF) > $(LSS)
@$(OBJDUMP) -dC $(ELF) > $(LSS)
$(OK): $(ELF)
@$(SIZE) $(ELF)
@echo "Errors: none"
$(ELF): $(OBJS) makefile
@echo --- linking...
$(LD) $(OBJS) $(LIBS) $(LD_FLAGS) -o "$(ELF)"
$(HEX): $(ELF)
@echo --- make hex...
@$(OBJCOPY) -O ihex $(ELF) $(HEX)
$(BIN): $(ELF)
@echo --- make binary...
@$(OBJCOPY) -O binary $(ELF) $(BIN)
program: $(ELF)
@echo "Programming with OPENOCD"
$(FLASHER) $(oocd_params_program)
reset:
@echo Resetting device
$(FLASHER) $(oocd_params_reset)
VPATH := $(DIRS)
$(OBJDIR)/%.o: %.cpp makefile
@echo --- compiling $<...
$(CXX) -c $(CXXFLAGS) -o $@ $<
$(OBJDIR)/%.o: %.c makefile
@echo --- compiling $<...
$(CC) -c $(CFLAGS) -o $@ $<
$(OBJDIR)/%.o: %.S makefile
@echo --- assembling $<...
$(AS) -c $(AFLAGS) -o $@ $<
dirs: $(OBJDIR) $(EXEDIR) $(LSTDIR) $(BAKDIR)
$(OBJDIR):
-@$(MD) $(OBJDIR)
$(EXEDIR):
-@$(MD) $(EXEDIR)
$(LSTDIR):
-@$(MD) $(LSTDIR)
$(BAKDIR):
-@$(MD) $(BAKDIR)
clean:
-@$(RM) $(OBJDIR)/*.d 2>/dev/null
-@$(RM) $(OBJDIR)/*.o 2>/dev/null
-@$(RM) $(LSTDIR)/*.lst 2>/dev/null
-@$(RM) $(ELF)
-@$(RM) $(HEX)
-@$(RM) $(LSS)
-@$(RM) $(MAP)
archive:
@echo --- archiving...
7z a $(BAKDIR)/$(TARGET)_`date +%Y-%m-%d,%H-%M-%S` $(ARCFILES)
@echo --- done!
# dependencies
ifeq (,$(findstring build,$(MAKECMDGOALS)))
ifeq (,$(findstring clean,$(MAKECMDGOALS)))
ifeq (,$(findstring dirs,$(MAKECMDGOALS)))
-include $(wildcard $(OBJDIR)/*.d)
endif
endif
endif
Toolchain: Yagarto.
Чтобы в нём поменять?Нажмите для просмотра прикрепленного файла
P.S. Из интереса создал точно такой же проект в AtmelStudio6 для xmega128A1. Запустил AVRStudio 4.18.
Цикл while выполнился за 2900 тактов.
Нажмите для просмотра прикрепленного файла