imx6ull 5 之BSP工程管理

一、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
dad
在这里插入图片描述
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加头文件路径

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值