中级会员
- 积分
- 254
- 金钱
- 254
- 注册时间
- 2020-3-22
- 在线时间
- 35 小时
|
本帖最后由 YOKI 于 2020-3-22 14:09 编辑
/********************************************/
时间 :2020/03/21/
作者 :YOKI
导师 :正点原子 左忠凯
硬件 :正点原子 ALPHA I.MX LINUX 开发板
/*******************************************/
本例程通过编写 Makefile 文件将 LED实验 工程中的文件进行结构化管理(bsp),使得文件的组织构架更为合理,
在编写Makefile 文件过程中使用到了很多新的 Makefile 函数。
INCLUDE := $(patsubst %, -I %, $(inclu_dirs))
#这里使用了一个函数 (模式字符串替换函数): (patsubst < 模式条件 A >,< 替换结果 B >,< 被替换字符串 C >)
#Makefile 中函数调用 使用 $(函数名 参数1,参数2, ... )
# (模式字符串替换函数): (patsubst < A >,< B >,< C >)
#若 字符串C 满足 A的模式 则用 B 替换 C
# A 和 B 可以使用通配符 % (Makefile 文件变量 通配符为 % )
# INCLUDE := $(patsubst %, -I %, $(inclu_dirs)) 含义是
# 在 inclu_dirs 所表示的文件夹前面 加上 "-I" 字符
S_file := $(foreach dir, $(SCODE_DIRS), $(wildcard $(dir)*.s))
C_file := $(foreach dir, $(SCODE_DIRS), $(wildcard $(dir)*.c))
#使用了两个函数:1 $(wildcard 参数 ) 2 $(foreach 参数A,参数B,参数C)
# 1 $(wildcard 参数 ) 这个函数的作用是在变量中 允许使用 命令通配符 如: *.c 或 *.s
# $(wildcard $(dir)/*.s) 的含义是 dir 下全部的 xxx.s 文件 ,同理
# $(wildcard $(dir)/*.c) 的含义是 dir 下全部的 xxx.c 文件 。
# 2 $(foreach 参数A,参数B,参数C)
# $(foreach 参数A,参数B,参数C) 的功能是 将 参数B 对应的 文件逐个取出 存入 参数A ,然后执行 参数C 对应的命令
# 所以这是一个 遍历函数 对 参数B(通常是一个集合)的成员全部执行一次 参数C(通常是一条/多条命令语句)
# 本例中 参数A = 变量 dir ;
# 参数B = 变量 SCODE_DIRS 的值 ;
# 参数C = $(wildcard $(dir)/*.s) 即 dir 下全部的 xxx.s 文件
# 所以,S_file := $(foreach dir,$(SCODE_DIRS),$(wildcard $(dir)/*.s)) 的含义是:
# 查找 $(SCODE_DIRS) 中(即 project 、bsp/clk、bsp/delay、bsp/led 文件夹下)全部的 xxx.s 文件,并将其存入变量 S_file
# 同理,C_file := $(foreach dir,$(SCODE_DIRS),$(wildcard $(dir)/*.c)) 的含义是:
# 查找 $(SCODE_DIRS) 中(即 project 、bsp/clk、bsp/delay、bsp/led 文件夹下)全部的 xxx.c 文件,并将其存入变量 C_file
Ndir_C_file := $(notdir $(C_file))
Ndir_S_file := $(notdir $(S_file))
# 函数 $(notdir 参数1 ):去除 参数1 所带的路径部分
#所以 Ndir_C_file 表示的是没有路径的 xxx.c 文件,
#同理 Ndir_S_file 表示的是没有路径的 xxx.s 文件。
S_OBJ := $(patsubst %, obj/%, $(Ndir_S_file:.s=.o))
C_OBJ := $(patsubst %, obj/%, $(Ndir_C_file:.c=.o))
# 再次使用(模式字符串替换函数): (patsubst < 模式条件 A >,< 替换结果 B >,< 被替换字符串 C >)
# S_OBJ := $(patsubst %, obj/%, $(S_file: .s=.o)) 含义:
# 将 变量S_file 文件中的 xxx.s 文件 改名 为 xxx.o 文件,然后在文件前添加路径名 obj/ (即 存入obj/ 文件夹下),C_OBJ 同理。
# xxx.s/xxx.c 文件 改名 为 xxx.o 文件,只是名字进行了更改而不是链接生成了 xxx.o 文件
OBJS := $(S_OBJ) $(C_OBJ)
# 定义变量 OBJS 等于 变量S_OBJ 和 变量C_OBJ 的内容,即所有的 xxx.o 文件
VPATH := $(SCODE_DIRS)
# VPATH 指定搜索路径为 变量SCODE_DIRS 指定的路径
$(TARGET).bin: $(OBJS)
# 生成目标 xxx.bin 文件 依赖: 变量 OBJS 的内容,即所有的 xxx.o 文件
$(ld) -T./project/imx6u.lds -o $(TARGET).elf $^
# 链接 记得在 -T 后面添加上 链接脚本:imx6u.dls 的路径,否则会找不到 imx6u.lds
# imx6u.lds中的 SECTIONS 里添加上 start.o 文件(文件前写上准确的路径:obj/)
$(objcopy) -O binary -S $(TARGET).elf $@
# 生成二进制文件 xxx.bin
$(objdump) -D -m arm $(TARGET).elf > $(TARGET).dis
# 生成反汇编文件 xxx.dis
mv $(TARGET).bin $(TARGET).elf $(TARGET).dis ./output/
# 将编译生成的 xxxx.elf xxx.bin xxx.dis 文件存入output文件夹下
$(S_OBJ) : obj/%.o : %.s
# 静态模式 表示将所有的 xxx.s文件编译为 xxx.o 文件并存放到 obj/ 文件夹下
$(gcc) -Wall -nostdlib -c -O2 $(INCLUDE) -o $@ $<
# 对 xxx.s文件 编译 优化等级 -O2 头文件路径: 变量 INCLUDE 中的文件(并在文件前加上了 "-I空格" 成为了 -I xxx.h)
$(C_OBJ) : obj/%.o : %.c
# 静态模式表示将所有的 xxx.c 文件编译为 xxx.o 文件并存放到 obj/ 文件夹下
$(gcc) -Wall -nostdlib -c -O2 $(INCLUDE) -o $@ $<
# 对 xxx.c文件 编译 优化等级 -O2 头文件路径: 变量 INCLUDE 中的文件(并在文件前加上了 "-I空格" 成为了 -I xxx.h)
clean:
rm -rf $(OBJS) ./output/$(TARGET).bin ./output/$(TARGET).elf \
./output/$(TARGET).dis
# 工程清理 删除 链接生成的文件
sd check:
ls /dev/sd* -l
# SD卡 检测
download : /dev/sdb ./output/$(TARGET).bin ./output/imxdownload \
./output/imxdownload ./output/$(TARGET).bin /dev/sdb
# SD卡烧写 依赖文件: SD卡 目录(每个人的 SD 卡 目录不同需要自己修改,我的是 /dev/sdb )
# 链接生成的 xxx.bin 文件 和 正点原子 提供的烧写软件: imxdownload
# 备注: 如果自己的文件存放路径和我的不一样请大家自己修改,路径不对是不能正常编译的,烧写软件大家可以到正点原子官方下载。
/**********************************************************************************************/
个人总结: 本次的 Makefile 编写是对第一期 ubuntu 视频中 Makefile 学习的一次检验和第二期前20个视频的总结
以上注释和代码都是在学习 《正点原子 linux 第二期 裸机开发视频 P21 第11.2讲 BSP工程管理实验》 过程中
跟着 左萌主(^_*)一行行编写并加入了一点点自己的思考写成的,作为一个厚颜无耻的小菜鸡,我大着胆子发出来跟大家一起
记录学习 如果有帮助请大家自行参考、下载,如果 转载 请注明出处,并在论坛和我联系。如果有错误请大神指正!左萌主赛高!
作者 :YOKI
导师 :正点原子 左忠凯 (请允许我叫你一声导师吧)
硬件 :正点原子 ALPHA I.MX LINUX 开发板
/*********************************************************************************************/
|
|