bsp工程管理

1. bsp工程管理的目的

模块化项目,使得项目清晰

2. 代码

拷贝原来工程

image

创建文件夹

image

  • bsp就是工程驱动文件
  • imx6ull是和芯片有关的文件
  • obj是生成文件的文件夹
  • project 工程文件 start.s main.c

创建对应的驱动文件

和上一节一样的驱动文件

# ?= 没有赋值的话就赋值

CROSS_COMPILE ?= arm-linux-gnueabihf-

TARGET 		  ?= bsp



# :=覆盖之前的值

GCC    			 := $(CROSS_COMPILE)gcc 

LD 				 := $(CROSS_COMPILE)ld

OBJCOPY 		 := $(CROSS_COMPILE)objcopy

OBJDUMP  		 := $(CROSS_COMPILE)objdump 



# INCDIRS 包含整个工程的.h 头文件目录 \是换行符

INCDIRS          := imx6ull \

					bsp/clk \

					bsp/led \

					bsp/delay 



# SRCDIRS 包含整个工程的.s .c文件目录

SRCDIRS			 := project \

					bsp/clk \

					bsp/led \

					bsp/delay



# patsubst的作用是给INCDIRS中的每个目录前面加一个 -I,指明头文件目录时必须加

# -I imx6ull -I bsp/clk -I bsp/led -I bsp/delay 

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



# foreach dir对每个dir都执行一次,SRCDIRS中dir, 即上面的文件夹

# wildcard 取出文件夹内所有文件

# 比如bsp/clk/bsp_clk.c

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

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



# notdir 上面取出来之后去掉目录

SFILENDIR 		 := $(notdir $(SFILES))

CFILENDIR  		 := $(notdir $(CFILES))



# 把所有的.s和.c都变成点o文件,并在前面加上obj

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



# -Wall 编译后显示所有警告

# -nostdlib 不连接系统标准启动文件和标准库文件,只把指定的文件传递给连接器。

#			这个选项常用于编译内核、bootloader等程序,它们不需要启动文件、标准库文件

# -O2   是比O1更高级的选项,进行更多的优化。

# 		Gcc将执行几乎所有的不包含时间和空间折中的优化。

# 		当设置O2选项时,编译器并不进行循环打开()loop unrolling以及函数内联。

# 		与O1比较而言,O2优化增加了编译时间的基础上,提高了生成代码的执行效率。

# 这样还能带着.h文件一起编译 

$(SOBJS) : obj/%.o : %.S

	$(GCC) -Wall -nostdlib -c -O2 $(INCLUDE) -o $@ $<

$(COBJS) : obj/%.o : %.c

	$(GCC) -Wall -nostdlib -c -O2 $(INCLUDE) -o $@ $<



clean:

	rm -rf $(TARGET).elf $(TARGET).dis $(TARGET).bin $(COBJS) $(SOBJS)

posted @   蘑菇王国大聪明  阅读(151)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示