OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4635|回复: 3

<新手向>第二期 裸机开发 P21 第11.2讲 BSP 工程文件管理 随堂笔记

[复制链接]

5

主题

17

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
254
金钱
254
注册时间
2020-3-22
在线时间
35 小时
发表于 2020-3-22 13:54:13 | 显示全部楼层 |阅读模式
本帖最后由 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 开发板
/*********************************************************************************************/

5_led_bsp.rar

259.34 KB, 下载次数: 4

工程文件包

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

88

主题

7377

帖子

5

精华

资深版主

Rank: 8Rank: 8

积分
14980
金钱
14980
注册时间
2013-11-13
在线时间
1823 小时
发表于 2020-3-23 12:10:08 | 显示全部楼层
我去,厉害了!这个注释真的是详细啊。必须赞一个
回复 支持 反对

使用道具 举报

5

主题

17

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
254
金钱
254
注册时间
2020-3-22
在线时间
35 小时
 楼主| 发表于 2020-3-23 16:34:20 | 显示全部楼层
唉,有人回我唉,开心
回复 支持 反对

使用道具 举报

5

主题

17

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
254
金钱
254
注册时间
2020-3-22
在线时间
35 小时
 楼主| 发表于 2020-3-24 08:30:08 | 显示全部楼层
zuozhongkai 发表于 2020-3-23 12:10
我去,厉害了!这个注释真的是详细啊。必须赞一个

刚刚才发现是居然是 左萌主亲自回复,突然有点受宠若惊!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-25 21:48

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表