1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
|
###
# GNU ARM Embedded Toolchain
CC=arm-none-eabi-gcc
LD=arm-none-eabi-ld
AR=arm-none-eabi-ar
AS=arm-none-eabi-as
CP=arm-none-eabi-objcopy
OD=arm-none-eabi-objdump
SIZE=arm-none-eabi-size
###
# Directory Structure
BINDIR=bin
SRCDIR=.
ASOURCES=$(shell find -L $(SRCDIR) -name '*.s')
CSOURCES+=$(shell find -L $(SRCDIR) -name '*.c')
HEADERS=$(shell find -L $(SRCDIR) -name '*.h')
INC=$(shell find -L $(SRCDIR) -name '*.h' -exec dirname {} \; | uniq)
INC+=../common/includes
INCLUDES=$(INC:%=-I%)
# Create object list
OBJECTS=$(CSOURCES:%.c=obj/%.o)
OBJECTS+=$(ASOURCES:%.s=obj/%.o)
# Define output files ELF & IHEX
BINELF=outp.elf
BINHEX=outp.hex
###
# MCU FLAGS
MCFLAGS=-mcpu=cortex-m4 -mthumb -mlittle-endian \
-mfpu=fpv4-sp-d16 -mfloat-abi=softfp -mthumb-interwork
# COMPILE FLAGS
DEFS=-DUSE_STDPERIPH_DRIVER -DSTM32F4XX -DARM_MATH_CM4 -D__FPU_PRESENT=1
CFLAGS =-Wall -ggdb -std=c99 -c $(MCFLAGS) $(DEFS) $(INCLUDES)
# LINKER FLAGS
LDSCRIPT= $(SRCDIR)/bsp/stm32_flash.ld
LDFLAGS =-T $(LDSCRIPT) --specs=nosys.specs $(MCFLAGS) -Wl,-Map=$(BINDIR)/outp.map
###
# Optimizations
OPT?='O2 O3 O6'
# O1 and O4 are irrelevant
# O5 breaks FreeRTOS somehow
# I'm not trusting O7
ifneq ($(filter O1,$(OPT)),)
CXXFLAGS+=-fno-exceptions # Uncomment to disable exception handling
DEFS+=-DNO_EXCEPTIONS # The source code has to comply with this rule
endif
ifneq ($(filter O2,$(OPT)),)
CFLAGS+=-Os # Optimize for size https://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html
CXXFLAGS+=-Os
LDFLAGS+=-Os # Optimize for size https://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html
endif
ifneq ($(filter O3,$(OPT)),)
CFLAGS+=-ffunction-sections -fdata-sections # Place each function or data item into its own section in the output file
CXXFLAGS+=-ffunction-sections -fdata-sections # -||-
LDFLAGS+=-Wl,-gc-sections # Remove isolated unused sections
endif
ifneq ($(filter O4,$(OPT)),)
CFLAGS+=-fno-builtin # Disable C++ exception handling
CXXFLAGS+=-fno-builtin # Disable C++ exception handling
endif
ifneq ($(filter O5,$(OPT)),)
CFLAGS+=-flto # Enable link time optimization
CXXFLAGS+=-flto # Enable link time optimization
LDFLAGS+=-flto # Enable link time optimization
endif
ifneq ($(filter O6,$(OPT)),)
CXXFLAGS+=-fno-rtti # Disable type introspection
endif
ifneq ($(findstring O7,$(OPT)),)
LDFLAGS+=--specs=nano.specs # Use size optimized newlib
endif
###
# Build Rules
.PHONY: all release debug clean
all: release
release: $(BINDIR)/$(BINHEX)
debug: CFLAGS+=-g
debug: LDFLAGS+=-g
debug: release
$(BINDIR)/$(BINHEX): $(BINDIR)/$(BINELF)
$(CP) -O ihex $< $@
$(BINDIR)/$(BINELF): vc.h $(OBJECTS)
$(CC) $(LDFLAGS) $(OBJECTS) -o $@
$(SIZE) $(BINDIR)/$(BINELF)
dir_guard=@mkdir -p $(@D)
obj/%.o: %.c $(HEADERS)
$(dir_guard)
@echo [CC] $<
@$(CC) $(CFLAGS) $< -o $@
obj/%.o: %.s $(HEADERS)
$(dir_guard)
@echo [AS] $<
@$(CC) $(CFLAGS) $< -o $@
vc.h: ../../.git/logs/HEAD
echo "// This file is generated by Makefile." > vc.h
echo "// Do not edit this file!" >> vc.h
git log -1 --format="format:#define GIT_VERSION \"%h\"" >> vc.h
echo >> vc.h
echo >> vc.h
clean:
rm -f $(OBJECTS) $(BINDIR)/$(BINELF) $(BINDIR)/$(BINHEX)
# Connect to openocd's gdb server on port 3333
deploy: $(BINDIR)/$(BINELF)
ifeq ($(wildcard /opt/openocd/bin/openocd),)
/usr/bin/openocd -f /usr/share/openocd/scripts/board/stm32f4discovery.cfg -c "program bin/"$(BINELF)" verify reset" -c "init" -c "reset" -c "exit"
else
/opt/openocd/bin/openocd -f /opt/openocd/share/openocd/scripts/board/stm32f4discovery.cfg -c "program bin/"$(BINELF)" verify reset" -c "init" -c "reset" -c "exit"
endif
|