Atmega8 - 使用一个Makefile编译和链接C和Assembly文件

时间:2017-01-23 16:16:15

标签: assembly makefile embedded avr avr-gcc

我正在玩Atmega8和Assembly。 因此,我找到了一个很好的方法,有一个Makefile,通过文件夹查看,抓取每个* .S,* .c和* .cpp文件,链接并将它们编译为可闪存的二进制文件。 我使用avr-toolchain和BootHID来刷二进制文件,但我认为最后一个并不重要。

这就是我到目前为止所得到的:

CROSS   ?=/home/nico/Dokumente/avr8-gnu-toolchain/bin/avr-
CC      :=$(CROSS)gcc
CXX     :=$(CROSS)g++
LD      :=$(CROSS)g++
SIZE    :=$(CROSS)size
OBJCOPY :=$(CROSS)objcopy
OBJDUMP :=$(CROSS)objdump

BOOTHID = /home/nico/Dokumente/bootloadHID/commandline/bootloadHID

RM=rm -f

TARGET=a
MMCU?=atmega8
AVRDUDE_FLAGS?=

SOURCES=$(wildcard *.cpp) $(wildcard *.c) $(wildcard *.S)
INCLUDES=

#SETTINGS=settings.h

OBJECTS = $(patsubst %.cpp,%.o,$(patsubst %.c,%.o,$(patsubst %.S,%.o,$(SOURCES))))

CSTD?=c99
COPT=-O2 -fdata-sections -ffunction-sections
CFLAGS=-mmcu=$(MMCU) -std=$(CSTD) $(COPT) -Wall
CFLAGS+=$(addprefix -I,$(INCLUDES))
CFLAGS+=-include

CXXSTD?=c++98
CXXOPT=$(COPT) -fno-exceptions -fno-rtti
CXXFLAGS=-mmcu=$(MMCU) -std=$(CXXSTD) $(CXXOPT) -Wall
CXXFLAGS+=$(addprefix -I,$(INCLUDES))
CXXFLAGS+=-include

LDFLAGS=-mmcu=$(MMCU) -Wl,--gc-sections -Wl,-Map=$(TARGET).map,--cref

.PHONY: all avrdude flash
all: $(TARGET).hex $(TARGET).lst

$(TARGET).elf: $(OBJECTS)
    $
    $(LD) $(LDFLAGS) $^ -lm -o $@

$(TARGET).hex: $(TARGET).elf
    $(OBJCOPY) -O ihex -R .eeprom -R .fuse -R .lock -R .signature $< $@

$(TARGET).bin: $(TARGET).elf
    $(OBJCOPY) -O binary -R .eeprom -R .fuse -R .lock -R .signature $< $@

%.o: %.cpp
    $(CXX) -o $@ $(CXXFLAGS) -MMD -MP -MF $(@:%.o=%.d) $< -c

%.o: %.c
    $(CC) -o $@ $(CFLAGS) -MMD -MP -MF $(@:%.o=%.d) $< -c

%.o: %.S
    $(CC) -mmcu=$(MMCU) -c -o timing.o timing.S

$(TARGET).lst: $(TARGET).elf
    $(OBJDUMP) -h -S $< > $@

avrdude: $(TARGET).hex
    avrdude $(AVRDUDE_FLAGS) -e -m flash -i $<

flash: $(TARGET).hex
    $(BOOTHID) $<

clean:
    $(RM) $(OBJECTS) *.elf *.hex *.lst *.map *.d

如果我在文件夹中没有任何* .S文件,它就像魅力一样。

这条线路只是为了调整而硬编码。

 %.o: %.S
        $(CC) -mmcu=$(MMCU) -c -o timing.o timing.S

但是一旦我将我的Assemblyfile与c文件一起放在dir中,我就会收到此错误:

$ make
/home/nico/Dokumente/avr8-gnu-toolchain/bin/avr-gcc -o lcd.o -mmcu=atmega8 -std=c99 -O2 -fdata-sections -ffunction-sections -Wall  -include -MMD -MP -MF lcd.d lcd.c -c
cc1: error: to generate dependencies you must specify either -M or -MM

这是我正在研究的一种小组项目。当我的团队合作伙伴通过Visual Studio编译代码时,一切都很好,所以我认为代码应该没问题。 但是我正在使用linux,所以我在这里......

2 个答案:

答案 0 :(得分:0)

错误消息非常清楚:

cc1: error: to generate dependencies you must specify either -M or -MM

编译器希望您给它一个标志。您目前没有给它任何一个标志,正如我们从错误信息之前打印的命令中看到的那样。

要解决此问题,您可以将其中一个标志添加到Makefile中。有很多地方可以添加一个标志,但是对于这个标志,最有意义的是在任何有-MMD的地方之后添加它。

或者,您可以通过删除-MMD选项完全禁用GCC依赖关系生成。

您也可以参考GCC documentation for these preprocessor options

答案 1 :(得分:0)

好吧,这是一种责任。

必须删除/注释掉这两行

...
#CFLAGS+=-include
...
#CXXFLAGS+=-include
...

我忘了那些因为早先编辑的方式。

我已经编辑了asm规则:

%.o: %.S
    $(CC) -mmcu=$(MMCU) -c -o $@ $<

如果有人需要它,那么这是完整且更正的Makefile:

CROSS   ?=/home/nico/Dokumente/avr8-gnu-toolchain/bin/avr-
CC      :=$(CROSS)gcc
CXX     :=$(CROSS)g++
LD      :=$(CROSS)g++
SIZE    :=$(CROSS)size
OBJCOPY :=$(CROSS)objcopy
OBJDUMP :=$(CROSS)objdump

BOOTHID = /home/nico/Dokumente/bootloadHID/commandline/bootloadHID

RM=rm -f

TARGET=a
MMCU?=atmega8
AVRDUDE_FLAGS?=

SOURCES=$(wildcard *.cpp) $(wildcard *.c) $(wildcard *.S)
INCLUDES=

OBJECTS = $(patsubst %.cpp,%.o,$(patsubst %.c,%.o,$(patsubst %.S,%.o,$(SOURCES))))

CSTD?=c99
COPT=-O2 -fdata-sections -ffunction-sections
CFLAGS=-mmcu=$(MMCU) -std=$(CSTD) $(COPT) -Wall
CFLAGS+=$(addprefix -I,$(INCLUDES))

CXXSTD?=c++98
CXXOPT=$(COPT) -fno-exceptions -fno-rtti
CXXFLAGS=-mmcu=$(MMCU) -std=$(CXXSTD) $(CXXOPT) -Wall
CXXFLAGS+=$(addprefix -I,$(INCLUDES))

LDFLAGS=-mmcu=$(MMCU) -Wl,--gc-sections -Wl,-Map=$(TARGET).map,--cref


.PHONY: all avrdude flash
all: $(TARGET).hex $(TARGET).lst

$(TARGET).elf: $(OBJECTS)

    $(LD) $(LDFLAGS) $^ -lm -o $@

$(TARGET).hex: $(TARGET).elf
    $(OBJCOPY) -O ihex -R .eeprom -R .fuse -R .lock -R .signature $< $@

$(TARGET).bin: $(TARGET).elf
    $(OBJCOPY) -O binary -R .eeprom -R .fuse -R .lock -R .signature $< $@

%.o: %.cpp
    $(CXX) -o $@ $(CXXFLAGS) -MMD -MP -MF $(@:%.o=%.d) $< -c

%.o: %.c
    $(CC) -o $@ $(CFLAGS) -MMD -MP -MF $(@:%.o=%.d) $< -c

%.o: %.S
    $(CC) -mmcu=$(MMCU) -c -o $@ $<

$(TARGET).lst: $(TARGET).elf
    $(OBJDUMP) -h -S $< > $@

avrdude: $(TARGET).hex
    avrdude $(AVRDUDE_FLAGS) -e -m flash -i $<

flash: $(TARGET).hex
    $(BOOTHID) $<

clean:
    $(RM) $(OBJECTS) *.elf *.hex *.lst *.map *.d

感谢您的帮助