1.源码结构
dir目录: --------- bin:可执行文件生成目录
--------- src:源文件目录------main.c 主程序文件
------start.s 汇编启动文件
-------- Makefile 编译脚本
-------- raspi.lds 链接文件
2.Makefile文件
ARCH = arm-none-eabi #声明交叉编译工具链
CC = ${ARCH}-gcc #交叉编译c文件
CPP = ${ARCH}-g++ #交叉编译c++文件
AS = ${ARCH}-as #交叉编译汇编文件
LD = ${ARCH}-ld #链接工具
AR = ${ARCH}-ar
OBJCOPY = ${ARCH}-objcopy #格式转化工具
PLATFORM = raspi
CFLAGS = -O0 -g -std=gnu99 -Werror -D__$(PLATFORM)__ -DRASPBERRY_PI -fno-builtin
ASFLAGS = -g
CFLAGS_FOR_TARGET = -mcpu=arm1176jzf-s #内核参数
ASFLAGS_FOR_TARGET = -mcpu=arm1176jzf-s
LDFLAGS = -nostdlib -static --error-unresolved-symbols #链接参数
SRC_DIR := src #源文件
INC_DIR := $(addsuffix /include,$(SRC_DIR)) #头文件
BUILD_DIR := $(addsuffix /build,$(SRC_DIR))
ASRC := $(foreach sdir,$(SRC_DIR),$(wildcard $(sdir)/*.s))
AOBJ := $(ASRC:.s=.o)
CSRC := $(foreach sdir,$(SRC_DIR),$(wildcard $(sdir)/*.c))
COBJ := $(CSRC:.c=.o)
INCLUDES := -Isrc $(addprefix -I,$(SRC_DIR) $(INC_DIR))
vpath %.c $(SRC_DIR) #获取所有c文件列表
vpath %.cpp $(SRC_DIR) #获取所有c++文件列表
vpath %.s $(SRC_DIR) #获取所有汇编文件列表
%.o: %.c
$(CC) $(CFLAGS_FOR_TARGET) $(INCLUDES) $(CFLAGS) -c -o $*.o $<
%.o: %.s
$(AS) $(ASFLAGS_FOR_TARGET) $(INCLUDES) $(ASFLAGS) -o $*.o $<
OBJ = $(AOBJ) $(COBJ)
bin/kernel.img: bin/kernel.elf #转化kernel.img
${OBJCOPY} -O binary $< $@
bin/kernel.elf: raspi.ld $(OBJ)
${LD} ${LDFLAGS} $(OBJ) -Map bin/kernel.map -o $@ -T raspi.ld #链接kernel.elf
clean:
rm -f bin/*.elf bin/*.img bin/*.map $(OBJ) #make clean
上面是裸核驱动开发工程进行管理的Makefile模板,
可以向src目录下添加新的驱动c文件,汇编s文件,Makefile不用做修改