博客介绍
硬件:正点原子linux开发板IM6ULL
开发环境:Ubuntu下的VSCode
功能:使用VSCode对文件使用工程管理方式
参考:正点原子linux
声明:以下仅为个人学习认知。如有错误,希望提出建议。
为何使用工程管理模式
对于较大的项目,如果所有文件都放在一个目录下,那么工程的可读性就会很差。为了提高项目的管理和文件的处理可以使用将相同文件属性放在同一个文件夹下。
BSP工程管理的目的就是将相同属性的文件放置在同一文件内,这样可以通过文件夹知道文件属性。
使用VSCode代码管理工具
本例程使用的是VSCod代码管理工具,VSCode代码管理工具默认是将工程所在文件夹下的所有文件添加到本项目,对于使用多文件夹存放项目的方式,在VSCode代码管理工具是不会进行添加其他文件的,对于VSCode如何为项目添加其他文件夹步骤如下:
1. 创建工作区
打开文件夹
选择需要创建的文件夹
将工作区另存为
项目创建成功后自动会在工作区下创建一个 xxxx.code-workspace 文件
2. 添加项目文件夹
打开c_cpp_properties.jsib 文件
1)使用快捷键:Ctrl+Shift+P
2)在搜索栏输入:C/C++:Edit
3)点击 C/C++:编辑配置(U)
添加项目文件夹,在"includePath": ["${workspaceFolder}/**" ] 中添加相对于与当前工作区的文件夹目录。
Makefile 文件的编写
Makefile是一个逆向编写步骤,首先需要考虑的是你最终需要什么文件,那不这个文件又是什么文件派生出来的呢,实际上Makefile文件就只这样一个反向推导的过程。
就以下面的一个历程为例:
需求:生成目标文件 ledc.bin
现有文件:当前工作目录下的所有.S、.c、.h
多文件夹 Makefile文件编写步骤:
- 获取所有头文件所在文件夹路径;
获取所有源码文件所在问价夹路径 - 依据所头文件所在文件夹路径, 向头文件所有路径前面添加 -I
- 依据所有源码文件的文件夹路径进行获取所有源码文件路径加源码源码文件名;
- 依据第3进行将 所有源码文件转换为所要生成的目标文件名;
- 依据所有目标文件名进行进行对依赖文件编译;
- 将所有目标文件链接为一个最终目标文件。
项目工作目录
Makefile文件
CROSS_COMPILE ?= arm-linux-gnueabihf- #定义交叉编译链
TARGET ?= ledc #创建目标文件名变量
CC := $(CROSS_COMPILE)gcc #LD 简写交叉编译变量
LD := $(CROSS_COMPILE)ld #LD 简写链接变量
OBJCOPY := $(CROSS_COMPILE)objcopy #OBJCOPY 简写格式转换编译链
OBJDUMP := $(CROSS_COMPILE)objdump #OBJcopy 简写格式反汇编变量
INCDIRS := project \ #定义包含所有 头文件(.h) 文件夹路径 变量
imx6u \
bsp/clk \
bsp/led \
bsp/delay
SRCDIRS := project \ #定义包含所有 源码文件(.S、.c) 文件夹路径 变量
bsp/clk \
bsp/led \
bsp/delay
INCLUDE := $(patsubst %, -I %, $(INCDIRS)) #在所有 头文件(.h) 文件路径前 添加 -I 作用,在使用在使用gcc编译的时候作为连接文件伦将
SFILES := $(foreach dir, $(SRCDIRS), $(wildcard $(dir)/*.S)) #获取所有源码文件夹路径下的 .S 文件名 并包含问价夹路径
CFILES := $(foreach dir, $(SRCDIRS), $(wildcard $(dir)/*.c)) #获取所有源码文件夹路径下的 .c 文件名 并包含问价夹路径
SFILENDIR := $(notdir $(SFILES)) # 将变量名 SFILES 中所有的文件夹路径去掉, 只保留文件名 .S
CFILENDIR := $(notdir $(CFILES)) # 将变量名 CFILES 中所有的文件夹路径去掉, 只保留文件名 .c
SOBJS := $(patsubst %, obj/%, $(SFILENDIR:.S=.o)) #将变量 SFILENDIR 中所有包含 .S 的字符串转换为 .o
COBJS := $(patsubst %, obj/%, $(CFILENDIR:.c=.o)) #将变量 SFILENDIR 中所有包含 .c 的字符串转换为 .o
OBJS := $(SOBJS) $(COBJS) #获取所有 .o文件名
VPATH := $(SRCDIRS) #将Makefile文件执行所有源码文件路径
.PHONY: clean #清楚文件
$(TARGET).bin : $(OBJS)
$(LD) -Timx6u.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 $@ #将所有.S文件编译为.o文件
$(COBJS) : obj/%.o : %.c
$(CC) -Wall -nostdlib -c -O2 $(INCLUDE) $< -o $@ #将所有.S文件编译为.o文件
clean:
rm -rf $(TARGET).elf $(TARGET).dis $(TARGET).bin $(COBJS) $(SOBJS) #清除项目编译文件