Tak, bo docelowy uC ma 16kB (lub 32kB) flashu, a mam dopiero "zarys" funkcjonalny tego co będzie robić. 256kB mam na płytce ewaluacyjnej. Nie to, żeby mnie te 1,8kB jakoś bardzo przerażało nawet przy 16kB, ale chciałem wiedzieć skąd ono się bierze, żeby ewentualnie potem mieć z czego uszczknąć.
Dodano po 5 [godziny] 10 [minuty]: Mam jeszcze jeden problem, który zauważyłem. Opcja: -Wl,--gc-sections nie działa prawidłowo. Gdy pojawi się ona jako opcja linkera, plik *.hex staje się pusty (prawie pusty, jest tylko coś takiego :00000001FF). Zauważyłem to, gdy testowałem funkcję. Po jej wykomentowaniu z main'a rozmiar kodu wynikowego się nie zmienił. Miałem błąd w opcji linkera (źle wpisałem --gc-sections). Teraz chyba jest dobrze, ale dzieje się właśnie to to napisałem powyżej.
Makefile:
# Automatic makefile for GNUARM (C/C++)
#tutaj wpisz nazwe pliku hex
TARGET = AWS_InterfaceTest
#Format wyjsciowy (moze byc srec,ihex,binary)
FORMAT = ihex
#Optymalizacja [0,1,2,3,s]
# 0 - brak optymalizacji, s -optymalizacja rozmiaru
OPT = s
#Debug format
#DEBUG = stabs
#DEBUG = dwarf-2
DEBUG =
#Typ procesora
MCU = arm7tdmi
#Skrypt linkera
SCRIPTLINK = LPC2129-ROM
#Opcje kompilatora C
CFLAGS += -Wall
CFLAGS += -std=gnu99
#Opcje kompilatora C++
CXXFLAGS += -Wall
#Port szeregowy programatora ISP
ISPPORT = com1
#Predkosc portu szeregowego programatora
ISPBAUD = 19200
#Czestotliwosc rezonatora kwarcowego mikrokontrolera (kHz)
ISPXTAL = 12000
#Definicje programow
CC = arm-none-eabi-gcc
CXX = arm-none-eabi-g++
AR = arm-none-eabi-ar
CP = arm-none-eabi-objcopy
OBJDUMP = arm-none-eabi-objdump
SIZE = arm-none-eabi-size
ISPPROG = lpc21isp
#Pozostale ustawienia kompilatora
ASFLAGS += -Wa,-mapcs-32 -mcpu=$(MCU) -g$(DEBUG)
LDFLAGS += -nostartfiles -T$(SCRIPTLINK).ld -Wl,-Map=$(TARGET).map,--cref,--gc-sections -mthumb-interwork
CFLAGS += -O$(OPT) -mcpu=$(MCU) -g$(DEBUG) -ffunction-sections -fdata-sections -mthumb-interwork -mthumb
CXXFLAGS += -O$(OPT) -mcpu=$(MCU) -g$(DEBUG)
CPFLAGS = -O $(FORMAT) -S
ASLST = -Wa,-adhlns=$(<:.S=.lst)
CLST = -Wa,-adhlns=$(<:.c=.lst)
CPPLST = -Wa,-adhlns=$(<:.cpp=.lst)
all: clean build
install: build program
clean:
rm -f $(TARGET).hex
rm -f $(TARGET).elf
rm -f $(TARGET).map
rm -f $(TARGET).lss
rm -f $(OBJ)
rm -f $(ASRC:.S=.lst) $(SRC:.c=.lst) $(CPPSRC:.cpp=.lst)
rm -f $(SRC:.c=.dep) $(CPPSRC:.cpp=.dep) $(ASRC:.S=.dep)
program:
$(ISPPROG) -control $(TARGET).hex $(ISPPORT) $(ISPBAUD) $(ISPXTAL)
build: $(TARGET).elf $(TARGET).hex $(TARGET).lss
#pliki zrodlowe C
SRC = $(wildcard *.c)
#pliki zrodlowe C++
CPPSRC = $(wildcard *.cpp)
#pliki assemblerowe
ASRC = $(wildcard *.S)
#wszystkie zaleznosci
$(TARGET).elf: $(OBJ) $(SCRIPTLINK).ld
-include $(SRC:.c=.dep)
-include $(CPPSRC:.cpp=.dep)
-include $(ASRC:.S=.dep)
#Objects files
OBJ = $(SRC:.c=.o) $(CPPSRC:.cpp=.o) $(ASRC:.S=.o)
# Define all listing files.
LST = $(SRC:.c=.lst) $(CPPSRC:.cpp=.lst) $(ASRC:.S=.lst)
%.dep: %.c
$(CC) -M $(CFLAGS) $< > $@.$$$$; \
sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' < $@.$$$$ > $@; \
rm -f $@.$$$$
%.dep: %.cpp
$(CXX) -M $(CXXFLAGS) $< > $@.$$$$; \
sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' < $@.$$$$ > $@; \
rm -f $@.$$$$
%.dep: %.S
$(CC) -M $(ASFLAGS) $< > $@.$$$$; \
sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' < $@.$$$$ > $@; \
rm -f $@.$$$$
%.lss: %.elf
@echo "Create extended listing..."
$(OBJDUMP) -h -S $< > $@
#$(SIZE) -d -A $(TARGET).elf
$(SIZE) -d $(TARGET).hex
%.hex: %.elf
@echo "Converting to hex..."
$(CP) $(CPFLAGS) $< $@
%.elf: $(OBJ)
@echo "Linking..."
$(CXX) $(CXXFLAGS) $(OBJ) -o $@ $(LDFLAGS)
%.o : %.S
@echo "Assembling..."
$(CC) -c $(ASFLAGS) $(ASLST) $< -o $@
%.o : %.c
@echo "Compiling C..."
$(CC) -c $(CFLAGS) $(CLST) $< -o $@
%.o : %.cpp
@echo "Compiling C++..."
$(CXX) -c $(CXXFLAGS) $(CPPLST) $< -o $@
Fragment skryptu linkera dotyczący kodu:
/* Sekcja .text zawiera kod programu */
. = 0;
.text :
{
*boot.o (.text) /* Startup code */
*(.text) /* remaining code */
*(.text.*)
*(.glue_7t)
*(.glue_7)
*(.gnu.linkonce.t.*)
*(.gcc_except_table)
} >CODE
. = ALIGN(4);