6.IMX6ULL裸机开发之BSP工程管理

190 阅读2分钟

一、模块化工程管理

即模块化编程,将同属性文件分存管理机制。使得杂乱无章的工程变得有条有序,干净整洁的目录界面,分工有序。不同的目录下存放同一类

5_BSP管理.png 创建project , bsp , include, obj目录。bsp下设各个外设的子目录。

将project目录下存放main.c 与start.s等主要文件;bsp目录存放外设程序;include目录下存放芯片寄存器的头文件;obj存放编译后升成的.o文件。

整理好工程以后,需要配置头文件。利用vscode的c/c++:ed插件,可以帮助我们快速定位头文件设置文件,会升成一个c_cpp_properties.json文件。

并且在c_cpp_properties.json文件下找添加要找的索引。

5_BSP管理.png

二、Makefile

Makefile指定头文件路径需要-I。

准备原材料变量----所有的头文件路径,C,S程序路径,.S文件,所有的.o文件。

CROSS_COMPILE       ?= arm-linux-gnueabihf-
TARGET              ?= led
​
CC              := $(CROSS_COMPILE)gcc
LD              := $(CROSS_COMPILE)ld
OBJDUMP          := $(CROSS_COMPILE)objdump
OBJCOPY         :=  $(CROSS_COMPILE)objcopy
​
INCLUDIRS       := imx6ull bsp/clk bsp/delay bsp/led
SRCDIRS         := project bsp/clk bsp/delay bsp/led
​
INCLUDE         := $(patsubst %, -I %, $(INCLUDIRS))
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)$(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 *.o *.bin *.dis *.elf

从Makefile中要了解的知识

一个工程首先会将源文件编译为.o文件,然后将这些目标文件进行链接生成可执行的文件elf,elf文件是一个二进制文件,但是它还包含一些非程序的信息,因此还要进行转成.bin的二进制文件。

转换为.o的过程:

在转换成中间的目标文件时,编译器所做的是检查程序的语法错误,已经该源文件中所调用的函数,变量是否被声明。未声明只会给warning,依然可以生成.o

转换为.elf的过程:

链接器会寻找函数的实现,如果找不到就会报错。