一、bsp工程管理原理
为了模块化管理代码,同一属性的文件存放在同一目录中
1、新建所需的文件夹,将同一属性的文件放到相应的文件夹中
2、修改clk、led、delay驱动,创建对应的驱动文件,然后放到对应的目录中
3、根据编写的新驱动文件,修改main.c文件内容
—
设置vscode头文件路径,先创建.vscode 目录,ctrl + shift + p 。然后打开 c/c++:ED,会在.vscode目录下生成 c_cpp_properties.json
再添加目录
{
"configurations": [
{
"name": "Linux",
"includePath": [
"${workspaceFolder}/**",
"${workspaceFolder}/bsp/clk", //<-------------------
"${workspaceFolder}/bsp/delay", //<-------------------
"${workspaceFolder}/bsp/led", //<-------------------
"${workspaceFolder}/imx6u", //<-------------------
"${workspaceFolder}/project" //<-------------------
],
"defines": [],
"compilerPath": "/usr/bin/gcc",
"cStandard": "gnu11",
"cppStandard": "gnu++14",
"intelliSenseMode": "clang-x64"
}
],
"version": 4
}
二、Makefile编写
Makefile指定头文件路径,需要 -I。
编译源码的时候,需要指定头文件路径
比如:bsp/clk/bsp_clk.h 变为 -Ibsp/clk/bsp_clk.h
wildcard 让通配符在变量里面展开
objects := $(wildcard *.o)
让 objects 的值是所有[.o]的文件名的集合,
这种用法由关键字“wildcard”指出
CROSS_COMPILE ?= arm-linux-gnueabihf-
TARGET ?= ledc
CC := $(CROSS_COMPILE)gcc
OBJCPOY := $(CROSS_COMPILE)objcopy
OBJDUMP := $(CROSS_COMPILE)objdump
LD := $(CROSS_COMPILE)ld
INCDIRS := imx6u \ //行连接符后面不能接空格!!必须要立即换行
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)
$(TARGET).bin : $(OBJS)
$(LD) -Timx6u.lds -o $(TARGET).elf $^
$(OBJCPOY) -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 $@ $<
.PHONY:clean
clean:
rm -rf $(TARGET).elf $(TARGET).bin $(TARGET).dis $(OBJS)
print:
@echo INCLUDE = $(INCLUDE)
@echo SFILES = $(SFILES)
@echo CFILES = $(CFILES)
@echo SFILENDIR = $(SFILENDIR)
@echo CFILENDIR = $(CFILENDIR)
@echo SOBJS = $(SOBJS)
@echo COBJS = $(COBJS)
@echo OBJS = $(OBJS)
执行make print
INCLUDE = -I imx6u -I bsp/clk -I bsp/led -I bsp/delay
SFILES = project/start.s
CFILES = project/main.c bsp/clk/bsp_clk.c bsp/led/bsp_led.c bsp/delay/bsp_delay.c
SFILENDIR = start.s
CFILENDIR = main.c bsp_clk.c bsp_led.c bsp_delay.c
SOBJS = obj/start.o
COBJS = obj/main.o obj/bsp_clk.o obj/bsp_led.o obj/bsp_delay.o
OBJS = obj/start.o obj/main.o obj/bsp_clk.o obj/bsp_led.o obj/bsp_delay.o
imx6u.lds
SECTIONS{
. = 0x87800000;
.text :
{ <----------------------- 每个冒号前面一定要有空格
obj/start.o <----------------------- 一定要加路径
*(.text)
}
.data ALIGN(4): {*(.data)}
.rodata ALIGN(4) : {*(.rodata)}
__bss_start = .;
.bss ALIGN(4) : {*(.bss) *(COMMON)}
__bss_end= .;
}
使用 -O2 ,要用delay(volatile),不然延时函数就会失效。或者不用-O2优化编译
行连接符 \ ,后面要立即换行,不能接空格再换行
重复包含头文件似乎没有报错,最好共同要包含的头文件(可能会造成重复的.h)放到同一个 .h 文件里。或者每个头文件都用ifndef 。。。
touch 已存在的目录/文件名,直接在这个目录下创建文件
VPATH关键字 指定源文件的路径( .s .c)
gcc编译时一定要-I加头文件路径