baremetal bsp工程管理

 
便于bsp工程管理,将工程进行分类管理,如下图
0
Makefile编译脚本文件
bsp文件夹存所写的bsp驱动
imx6ul文件夹存放imx6ull官方sdk文件
imx6ul.lds是链接脚本
obj文件夹存在生成的.o文件
project存放main.c和start.S
 
Makefile编写:
CROSS_COMPILE   ?= arm-linux-gnueabihf-
TARGET                  ?= bsp

CC                              := $(CROSS_COMPILE)gcc
LD                              := $(CROSS_COMPILE)ld
OBJCOPY                 := $(CROSS_COMPILE)objcopy
OBJDUMP                 := $(CROSS_COMPILE)objdump

INCDIRS                 := imx6ul \
                                   bsp/clk \
                                   bsp/led \
                                   bsp/delay

SRCDIRS                 := project \
                                   bsp/clk \
                                   bsp/led \
                                   bsp/delay


INCLUDE                 := $(patsubst %, -I %, $(INCDIRS))

SFILES                  := $(foreach dir, $(SRCDIRS), $(wildcard $(dir)/*.S))
CFILES                  := $(foreach dir, $(SRCDIRS), $(wildcard $(dir)/*.c))

SFILENDIR               := $(notdir  $(SFILES))
CFILENDIR               := $(notdir  $(CFILES))

SOBJS                   := $(patsubst %, obj/%, $(SFILENDIR:.S=.o))
COBJS                   := $(patsubst %, obj/%, $(CFILENDIR:.c=.o))
OBJS                    := $(SOBJS) $(COBJS)

VPATH                   := $(SRCDIRS)

.PHONY: clean

$(TARGET).bin : $(OBJS)
        $(LD) -Timx6ul.lds -o $(TARGET).elf $^
        $(OBJCOPY) -O binary -S $(TARGET).elf $@
        $(OBJDUMP) -D -m arm $(TARGET).elf > $(TARGET).dis

$(SOBJS) : obj/%.o : %.S
        $(CC) -Wall -nostdlib -c -O2  $(INCLUDE) -o $@ $<

$(COBJS) : obj/%.o : %.c
        $(CC) -Wall -nostdlib -c -O2  $(INCLUDE) -o $@ $<

clean:
        rm -rf $(TARGET).elf $(TARGET).dis $(TARGET).bin $(COBJS) $(SOBJS)
Makefile逐行分析:
  1. CROSS_COMPILE ?= arm-linux-gnueabihf-:定义了交叉编译工具链的前缀,默认使用 arm-linux-gnueabihf-。
  2. TARGET ?= bsp:定义了目标文件名为 bsp。
  3. CC := $(CROSS_COMPILE)gcc:定义了 C 编译器。
  4. LD := $(CROSS_COMPILE)ld:定义了链接器。
  5. OBJCOPY := $(CROSS_COMPILE)objcopy:定义了目标文件复制工具。
  6. OBJDUMP := $(CROSS_COMPILE)objdump:定义了目标文件反汇编工具。
  7. INCDIRS := imx6ul \ bsp/clk \ bsp/led \ bsp/delay:定义了头文件目录。
  8. SRCDIRS := project \ bsp/clk \ bsp/led \ bsp/delay:定义了源文件目录。
  9. INCLUDE := $(patsubst %, -I %, $(INCDIRS)):将头文件目录转换成 -I 参数形式。
  10. SFILES := $(foreach dir, $(SRCDIRS), $(wildcard $(dir)/*.S)):查找所有的汇编文件。
  11. CFILES := $(foreach dir, $(SRCDIRS), $(wildcard $(dir)/*.c)):查找所有的 C 文件。
  12. SFILENDIR := $(notdir $(SFILES)):获取汇编文件的文件名部分。
  13. CFILENDIR := $(notdir $(CFILES)):获取 C 文件的文件名部分。
  14. SOBJS := $(patsubst %, obj/%, $(SFILENDIR:.S=.o)):生成汇编文件对应的目标文件路径。
  15. COBJS := $(patsubst %, obj/%, $(CFILENDIR:.c=.o)):生成 C 文件对应的目标文件路径。
  16. OBJS := $(SOBJS) $(COBJS):所有目标文件列表。
  17. VPATH := $(SRCDIRS):设置源文件搜索路径。
  18. .PHONY: clean:声明 clean 为一个伪目标。
  19. $(TARGET).bin : $(OBJS):生成目标文件 $(TARGET).bin 的规则。
  20. $(LD) -Timx6ul.lds -o $(TARGET).elf $^:链接生成 ELF 可执行文件。
  21. $(OBJCOPY) -O binary -S $(TARGET).elf $@:将 ELF 文件转换成二进制文件。
  22. $(OBJDUMP) -D -m arm $(TARGET).elf > $(TARGET).dis:反汇编生成 dis 文件。
  23. $(SOBJS) : obj/%.o : %.S:汇编文件编译规则。
  24. $(COBJS) : obj/%.o : %.c:C 文件编译规则。
  25. clean: rm -rf $(TARGET).elf $(TARGET).dis $(TARGET).bin $(COBJS) $(SOBJS):清理规则,删除生成的文件。
 
posted @ 2024-03-16 23:15  lethe1203  阅读(5)  评论(0编辑  收藏  举报