一、模块化工程管理
即模块化编程,将同属性文件分存管理机制。使得杂乱无章的工程变得有条有序,干净整洁的目录界面,分工有序。不同的目录下存放同一类
创建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文件下找添加要找的索引。
二、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的过程:
链接器会寻找函数的实现,如果找不到就会报错。