imx6ull 5 之BSP工程管理

tech2022-08-05  161

一、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加头文件路径

最新回复(0)