BSP管理
所有完成同一个功能的代码提取出来放到一个单独的文件中,也就是对程序分功能管理。
所谓bsp管理就是按照各个功能函数模块化放入各自文件夹进行保存管理,使用时到各自的路径中进行调用。
类似于stm32的工程管理格式来存储。

首先以led实验为例子,其中 bsp 用来存放驱动文件;imx6ul 用来存放跟芯片有关的文件,比如 SDK库文件;obj 用来存放编译生成的.o 文件;project 存放 start.S 和 main.c 文件,cc.h、fsl_common.h、fsl_iomuxc.h 和 MCIMX6Y2.h 这四个文件拷贝到文件夹 imx6ul 中;将 start.S 和 main.c 这两个文件拷贝到文件夹 project 中。前面的实验中所有的驱动相关的函数都写到了 main.c 文件中,比如函数 clk_enable、led_init 和 delay,这三个函数可以分为三类:时钟驱动、LED 驱动和延时驱动。因此我们可以在 bsp 文件夹下创建三个子文件夹:clk、delay 和 led,分别用来存放时钟驱动文件、延时驱动文件和 LED 驱动文件,这样main.c 函数就会清爽很多,程序功能模块清晰。工程文件夹都创建好了,接下来就是编写代码了,其实就是将时钟驱动、LED 驱动和延时驱动相关的函数从 main.c 中提取出来做成一个独立的驱动文件 。
代码部分就是将各部分的驱动函数打包成各自的驱动文件,剩余的不变。最主要的是makefile的编写和之前有很大的区别。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
| 1 CROSS_COMPILE ?= arm-linux-gnueabihf 2 TARGET ?= bsp 3 4 CC := $(CROSS_COMPILE)gcc 5 LD := $(CROSS_COMPILE)ld 6 OBJCOPY := $(CROSS_COMPILE)objcopy 7 OBJDUMP := $(CROSS_COMPILE)objdump 8 9 INCDIRS := imx6ul \ //包含整个工程的.h 头文件目录 10 bsp/clk \ 11 bsp/led \ 12 bsp/delay 13 14 SRCDIRS := project \ //包含的是整个工程的所有.c 和.S 文件目录。 15 bsp/clk \ 16 bsp/led \ 17 bsp/delay 18 19 INCLUDE := $(patsubst %, -I %, $(INCDIRS))//使用patsubst函数给INCDIRS后面加上-I 20 21 SFILES := $(foreach dir, $(SRCDIRS), $(wildcard $(dir)/*.S))//使用foreach和dir挑出所有的.S 汇编文件即可 22 CFILES := $(foreach dir, $(SRCDIRS), $(wildcard $(dir)/*.c))//挑出所有的.c文件 等同CFILES = project/main.c bsp/clk/bsp_clk.c bsp/led/bsp_led.c bsp/delay/bsp_delay.c 23 24 SFILENDIR := $(notdir $(SFILES))//使用函数 notdir 将 SFILES 和 CFILES 中的路径去掉 25 CFILENDIR := $(notdir $(CFILES)) 等同 SFILENDIR = start.S CFILENDIR = main.c bsp_clk.c bsp_led.c bsp_delay.c 26 27 SOBJS := $(patsubst %, obj/%, $(SFILENDIR:.S=.o)) 28 COBJS := $(patsubst %, obj/%, $(CFILENDIR:.c=.o)) 29 OBJS := $(SOBJS) $(COBJS) 30 31 VPATH := $(SRCDIRS) //VPATH 是指定搜索目录 32 33 .PHONY: clean 34 35 $(TARGET).bin : $(OBJS) 36 $(LD) -Timx6ul.lds -o $(TARGET).elf $^ 37 $(OBJCOPY) -O binary -S $(TARGET).elf $@ 38 $(OBJDUMP) -D -m arm $(TARGET).elf > $(TARGET).dis 39 40 $(SOBJS) : obj/%.o : %.S 41 $(CC) -Wall -nostdlib -c -O2 $(INCLUDE) -o $@ $< 42 43 $(COBJS) : obj/%.o : %.c 44 $(CC) -Wall -nostdlib -c -O2 $(INCLUDE) -o $@ $< 45 46 clean: 47 rm -rf $(TARGET).elf $(TARGET).dis $(TARGET).bin $(COBJS) $(SOBJS)
|