文件过多,工程复杂
    将文件分开存放,结构清晰
    image.png 【Linux】BSP工程管理 - 图2注:imu6ul.h仅起到包含imx6ul其它库函数的作用,而被各个bsp的头文件调用
    obj用来存放编译后生成的.o中间文件

    Makefile

    1. #编译器名
    2. CROSS_COMPILE ?= arm-linux-gnueabihf-
    3. #目标名
    4. TARGET ?= bsp
    5. #编译流程名
    6. CC := $(CROSS_COMPILE)gcc
    7. LD := $(CROSS_COMPILE)ld
    8. OBJCOPY := $(CROSS_COMPILE)objcopy
    9. OBJDUMP := $(CROSS_COMPILE)objdump
    10. #头文件路径集合 “\”换行
    11. INCDIRS := imx6ul \
    12. bsp/clk \
    13. bsp/led \
    14. bsp/delay
    15. #源文件路径集合(.c/.S)
    16. SRCDIRS := project \
    17. bsp/clk \
    18. bsp/led \
    19. bsp/delay
    20. #使用patsubst函数,给变量INCDIRS添加一个"-I"
    21. #加“I”是因为Makefile语法要求指明头文件目录的时候需要加上“-I”
    22. INCLUDE := $(patsubst %, -I %, $(INCDIRS))
    23. #SFILES保存工程中所有.S汇编文件(包含绝对路径)
    24. #变量SRCDIRS已经存放了工程中所有的.S和.c文件,仅需要挑出.S即可
    25. #借助了函数foreach和wildcard
    26. #最终SFILES := project/start.S
    27. SFILES := $(foreach dir, $(SRCDIRS), $(wildcard $(dir)/*.S))
    28. #CFILES保存工程中所有.c汇编文件(包含绝对路径)
    29. #变量SRCDIRS已经存放了工程中所有的.S和.c文件,仅需要挑出.c即可
    30. #借助了函数foreach和wildcard
    31. #最终CFILES := project/main.c bsp/clk/bsp_clk.c bsp/led/bsp_led.c bsp/delay/bsp_delay.c
    32. CFILES := $(foreach dir, $(SRCDIRS), $(wildcard $(dir)/*.c))
    33. #去掉了SFILES和CFILES的路径部分,仅保留了文件名
    34. SFILENDIR := $(notdir $(SFILES))
    35. CFILENDIR := $(notdir $(CFILES))
    36. #变量SOBJS和COBJS是.S和.c文件编译以后对应的.o文件目录
    37. #SOBJS = obj/start.o
    38. #COBJS = obj/main.o obj/bsp_clk.o obj/bsp_led.o obj/bsp_delay.o
    39. SOBJS := $(patsubst %, obj/%, $(SFILENDIR:.S=.o))
    40. COBJS := $(patsubst %, obj/%, $(CFILENDIR:.c=.o))
    41. OBJS := $(SOBJS) $(COBJS)
    42. #VPATH 指定搜索目录,当编译的时候所需的.S和.c文件会在SRCDIRS中指定的目录中查找
    43. VPATH := $(SRCDIRS)
    44. .PHONY: clean
    45. $(TARGET).bin : $(OBJS)
    46. $(LD) -Timx6ul.lds -o $(TARGET).elf $^
    47. #$^ 所有依赖文件的集合
    48. $(OBJCOPY) -O binary -S $(TARGET).elf $@
    49. #$@ 所有目标的集合
    50. $(OBJDUMP) -D -m arm $(TARGET).elf > $(TARGET).dis
    51. $(SOBJS) : obj/%.o : %.S
    52. $(CC) -Wall -nostdlib -c -O2 $(INCLUDE) -o $@ $<
    53. #$< 依赖文件集合中的第一个文件,如果依赖文件是以模式%定义的,那么$<就是一系列符合模式的文件集合
    54. #-Wall 使GCC产生尽可能多的警告信息
    55. #-c 只编译,不链接成可执行文件,通常用于编译不含主程序的子程序
    56. #-O2 比-O更好的优化编译、链接
    57. $(COBJS) : obj/%.o : %.c
    58. $(CC) -Wall -nostdlib -c -O2 $(INCLUDE) -o $@ $<
    59. clean:
    60. rm -rf $(TARGET).elf $(TARGET).dis $(TARGET).bin $(COBJS) $(SOBJS)

    image.png
    image.png
    image.png
    image.png
    image.png
    编译烧录流程同之前一样