für ein embedded Projekt mit dem Arm GCC aus Launchpad habe ich mir ein File für
GNU-Make erstellt. Es funktioniert, aber ich habe ich kräftig abgeschrieben weshalb
ich nicht genau weis warum und wie es funktioniert.
Code:
COPTS = -Wall -Os -funsigned-char -xc -mlittle-endian -mthumb -mno-thumb-interwork
COPTS += -c -mcpu=cortex-m3 -mno-tpcs-frame -gdwarf-2 --function-sections
SOPTS = -mcpu=cortex-m3 -gdwarf-2 -mthumb
LOPTS := -T linkfile.ld -Map=file.map --cref -gc-sections -o out.axf
cpuinit.o: COPTS += -O1 -save-temps
SSOURCES := startup_stm32f10x_ld.s
CSOURCES := cpuinit.c main.c flop.c misc.c
CSOURCES += stm32f10x_adc.c stm32f10x_dma.c stm32f10x_flash.c stm32f10x_gpio.c
CSOURCES += stm32f10x_rcc.c stm32f10x_tim.c stm32f10x_it.c
OBJS = $(CSOURCES:.c=.o)
OBJS += $(SSOURCES:.s=.o)
out.axf: $(OBJS)
arm-none-eabi-ld $(LOPTS) $(OBJS)
arm-none-eabi-objcopy -O ihex out.axf out.hex
arm-none-eabi-objcopy -O binary out.axf out.bin
%.o: %.c
arm-none-eabi-gcc $(COPTS) -c $? -o $@
%.o: %.s
arm-none-eabi-as $(SOPTS) -o $@ $?
clean:
rm *.o
rm out.*
cpuinit.o modifiziert die Compilerschalter für eine einzelne Datei in welcher gerade gedebuggt wird.
Frage 1:
%.o: %.c gibt die zu compilierenden Dateien an. GCC wird pro Quelldatei
zum übersetzen genau einmal gestartet. Zuvor hatte ich dafür sinngemäs
$(COBJS): $(CSOURCES) gehabt. Damit startet GCC nur einmal,
wobei eine Liste von Dateien zum Compilieren übergeben wird.
1a- was ist %.o: %.c - (implizite? Pattern Regel ?)
1b- was nimmt %.o: %.c als Datenquelle ? (Verzeichnis wird nicht durchsucht)
1c- wie ist der Unterschied in der Aufrufzahl des Compilers erklärbar?
Frage 2:
Das Projekt nutzt bislang keine Laufzeitbibliothek. Der ARM GCC beinhaltet aber eine
Multilib (mit/ohne HW Floating Point, mit /ohne Arm-Thumb interwork usw) welche ich
testen möchte. In den mitgelieferten makefiles wird diese über mir nicht verständliche
Verschachtelungen verschiedener includierter .specs Dateien gesteuert. Ist die
Zielarchitektur über eine (vordefinierte) Variable eingetragen, wählt der Linker die
passende Lib automatisch aus. Dies funktioniert aber nur wenn ld nicht direkt,
sondern über gcc aufgerufen wird. Wie muß dazu arm-none-eabi-ld $(LOPTS) $(OBJS)
modifiziert werden ?
Lesezeichen