目录

  • 0. TDA4VM 8.4 RTOS SDK 中 SBL 的编译流程解析
    • TI SDK 的可执行文件后缀名是 .xer5f 的原因
    • sbl_ospi_img 的 .xer5f 可执行文件的生成过程
      • 编译依赖的静态库
      • 编译可执行文件命令
    • .xer5f 文件生成 .tiimage 文件
  • 1. makefile 中,如果一个变量存在多个值,如何让变量的值换行输出
  • 2.如果想让上一个的命令作用到下一个命令中,那么两个命令需要写在同一行
  • 3. make -C 选项可以重新指定当前工作目录
  • 4.makefile 中命令包的定义
  • 5. makefile 中 call 函数与 eval 函数以及命令包

0. TDA4VM 8.4 RTOS SDK 中 SBL 的编译流程解析

当我们在PDK_INSTALL_DIR/packages/ti/build目录下执行下述命令,可以编译 ospi sbl:

make -j BOARD=j721e_evm CORE=mcu1_0 BUILD_PROFILE=release sbl_ospi_img

接下来我会以上述编译命令来详细讲述 SBL 编译过程,其他目标同样适用。
根据分析当前目录下的 makefile 文件,发现 sbl_ospi_img 依赖下面的规则编译:

除了生成 .xer5f 文件与生成 .tiimage 文件这步外,其余命令都未执行,上述图片中的命令可简化如下:

$(FINAL_PKG_LIST_ALL) $(FINAL_DUP_EXAMPLE_LIST):#编译生成 sbl_ospi_img_mcu1_0_release.xer5f 文件$(MAKE) -C $($@_PATH) $($@_MAKEFILE)#由 sbl_ospi_img_mcu1_0_release.xer5f 转换为 .bin 文件与 .tiimage 文件$(MAKE) -C $($@_PATH) $($@_MAKEFILE) sbl_imagegen

其中,$($@_MAKEFILE) 变量在 sbl_component.mk 文件中赋值,展开为-f$(PDK_SBL_COMP_PATH)/build/sbl_img.mk BOOTMODE=ospi SBL_USE_DMA=yes BUILD_HS=no , 如下图所示:

所以,.xer5f 可执行文件的生成,是通过 sbl_img.mk 文件生成的。

TI SDK 的可执行文件后缀名是 .xer5f 的原因

$(MAKERULEDIR)/platform.mk 文件中,定义了生成的目标文件,静态库文件,可执行文件,反汇编文件的通用后缀名,如下:

sbl_ospi_img 的 .xer5f 可执行文件的生成过程

根据上述知识,我们需要执行 sbl_img.mk 来生成 .xer5f 文件。
分析 sbl_img.mk, 发现 sbl_img.mk 包含了 $(MAKERULEDIR)/common.mk 来包含编译规则,如下:

而在 $(MAKERULEDIR)/common.mk 文件中,第一条规则(默认规则)如下:

(.xerf 文件就是通过默认规则实现的,别急,往下看)
我们发现默认规则 all 的依赖是 $(CORE)
那么继续,我们查找目标为 $(CORE) 的规则,同样在 $(MAKERULEDIR)/common.mk 存在如下规则:

(叮咚叮咚~,恭喜你,发现编译生成 .xer5f 文件的最终规则)
对规则的说明如下:

# Create dependencies list to ultimately create application executable binary
$(CORE) : $(OBJDIR) $(BINDIR) $(DEPDIR) $(CONFIGURO_DIR)
ifneq ($(words $(PKG_LIST)), 0)#编译生成依赖的静态库,但好像什么都做不了,所有依赖的库名字都在 $(PKG_LIST) 变量中$(MAKE) $($(APP_NAME)_MAKEFILE) $(PKG_LIST)
endif#编译生成 .xer5f 可执行文件,这个过程会链接依赖的静态库$(MAKE) $($(APP_NAME)_MAKEFILE) $(EXE_NAME)

编译依赖的静态库

编译依赖的静态库命令:

 #编译生成依赖的静态库,但好像什么都做不了,所有依赖的库名字都在 $(PKG_LIST) 变量中$(MAKE) $($(APP_NAME)_MAKEFILE) $(PKG_LIST)

(虽然 makefile 是这么写了,但是,经过实际测试,就算我改了库的源代码,好像不会重新编译库)
sbl_img.mk中,会对 APP_NAME 变量赋值,如下:

所以 $($(APP_NAME)_MAKEFILE) 变量展开依旧是 -f$(PDK_SBL_COMP_PATH)/build/sbl_img.mk BOOTMODE=ospi SBL_USE_DMA=yes BUILD_HS=no
即再次执行 sbl_img.mk,不过这一次会指定目标为$(PKG_LIST)
$(MAKERULEDIR)/common.mk 中, $(PKG_LIST) 编译规则如下:

变量 $@_MAKEFILE 即为具体模块对应的 makefile 文件,比如 board 模块对应的 makefile 文件如下:

即规则可以写作如下(已 board 模块为例):

board :
$(MAKE) -C $(PDK_BOARD_COMP_PATH) -f build/makefile.mk

通过编译上述规则,可以编译 board 模块。
但是经过实际测试,我改了 board 模块源代码,好像并没有重新编译 board 模块???

编译可执行文件命令

编译可执行文件命令:

 #编译生成 .xer5f 可执行文件,这个过程会链接依赖的静态库$(MAKE) $($(APP_NAME)_MAKEFILE) $(EXE_NAME)

sbl_img.mk中,对 APP_NAME 变量赋值 sbl_ospi_image, 所以 $($(APP_NAME)_MAKEFILE) 变量展开依旧是 -f$(PDK_SBL_COMP_PATH)/build/sbl_img.mk BOOTMODE=ospi SBL_USE_DMA=yes BUILD_HS=no
而对于 $(EXE_NAME) 的值,该变量在 rules_ti_cgt_arm.mk 中赋值:
该文件会以如下方式被 $(MAKERULEDIR)/common.mk 文件包含:

所以,在最后的源文件生成二进制目标文件以及二进制目标文件链接生成可执行文件都是在rules_ti_cgt_arm.mk 文件中执行的。
.xer5f可执行文件生成的规则如下:

.oer5f 二进制目标文件生成的规则如下:

所以,编译生成可执行文件主要是通过 rules_ti_cgt_arm.mk 的规则实现的,但源文件以及依赖的库文件都需要在上层 mk 文件中赋值。

.xer5f 文件生成 .tiimage 文件

回顾开头,也许你有些忘记了,通过如下命令,我们还需要将 .xer5f转换为.tiimage文件,如下:

命令简化如下:

 #由 sbl_ospi_img_mcu1_0_release.xer5f 转换为 .bin 文件与 .tiimage 文件$(MAKE) -C $($@_PATH) $($@_MAKEFILE) sbl_imagegen

参考 sbl_component.mk 文件,将变量展开,这条命令如下:

$(MAKE) -C $(PDK_SBL_COMP_PATH)/board/k3 -f$(PDK_SBL_COMP_PATH)/build/sbl_img.mk BOOTMODE=ospi SBL_USE_DMA=yes BUILD_HS=no sbl_imagegen

即,对 sbl_img.mk 执行 make, 目标为 sbl_imagegen
查看 sbl_img.mk 文件,在它包含的 $(MAKERULEDIR)/common.mk 文件中,sbl_imagegen 目标对应的规则如下:

该规则依赖 $(SBL_IMAGE_PATH), 该依赖对应的一个新的规则,如下:

同样, $(SBL_IMAGE_PATH) 依赖 $(SBL_BIN_FILE),该依赖同样对应一个新的规则,如下:

.xer5f 文件转换为 .bin 文件后,回到 $(SBL_IMAGE_PATH) 目标中,执行下列步骤生成 .tiimage 文件:

至此,大功告成(*^_^*)。
恭喜你看到了这里,这就是 sbl_ospi_img 整个的编译流程,TI RTOS SDK 的其余目标基本也基此流程。
我们可以在 /ti/boot/sbl/binary/j721e_evm/ospi/bin目录下查看生成的文件。

( •̀ ω •́ )y,撒花撒花~

1. makefile 中,如果一个变量存在多个值,如何让变量的值换行输出

makefile 可以使用命令

FINAL_LIB_LIST = csl_init csl_intc csl csl_utils_common csl_uart_console boardprint_test :@$(ECHO) lib = $(foreach LIB,$(FINAL_LIB_LIST),""; echo "$(LIB)")

该命令可以让变量的值换行输出,结果如下:

root@ftcd-010:/mnt/d/ADC30/ti-processor-sdk-rtos-j784s4-evm-08_02_02_02/pdk_j784s4_08_02_02_04/packages/ti/build# make -s print_test
lib =
csl_init
csl_intc
csl
csl_utils_common
csl_uart_console
board

2.如果想让上一个的命令作用到下一个命令中,那么两个命令需要写在同一行

makefile 文件如下:

dirtest0:@cd /proc@pwddirtest1:@cd /proc; @pwd

只有 dirtest1 会正常输出路径名为:/proc

3. make -C 选项可以重新指定当前工作目录

makefile 文件中 -C 选项使用方式如下:

$(MAKE) -C $($@_PATH) $($@_MAKEFILE)

4.makefile 中命令包的定义

查询资料,makefile 中命令包都以 define 开始,以 endef 结束。
命令包可以用来创建规则。
下面创建了一个 CREATE_DEP_TARGETS 的命令包:

# 定义 CREATE_DEP_TARGETS 宏包,用于创建 _has_dep 目标的编译规则,define 开始的语句是 makefile 的命令包
# 所以这个命令包是根据 (target)_DEPENDS_ON 变量来执行的
define CREATE_DEP_TARGETS
ifneq ($($(1)_DEPENDS_ON),) # 判断 (target)_DEPENDS_ON 变量是否存在,存在则执行
ifeq ($($(1)_DEPENDS_ON),$(filter $($(1)_DEPENDS_ON), $($(2)))) # 判断 (target)_DEPENDS_ON 是否也是一个单独目标,是则创建下面的规则
$(1)_has_dep: $($(1)_DEPENDS_ON)_has_dep+$(MAKE) -f $(PDK_INSTALL_PATH)/ti/build/makefile $(1)$(2)_DEP_LIST += $($(1)_DEPENDS_ON) # 将 (target)_DEPENDS_ON 变量加入 _DEP_LIST 列表
else
#依赖的不是一个单独的目标,即 (target)_DEPENDS_ON 不是一个单独的模块,无依赖
$(1)_has_dep:   +$(MAKE) -f $(PDK_INSTALL_PATH)/ti/build/makefile $(1)
endif
else
# (target)_DEPENDS_ON 不存在
$(1)_has_dep:+$(MAKE) -f $(PDK_INSTALL_PATH)/ti/build/makefile $(1)
endif
endef

5. makefile 中 call 函数与 eval 函数以及命令包

下面这篇文章讲得非常好,请仔细阅读:
makefile 中 call 函数与 eval 函数的讲解

函数“eval”是一个比较特殊的函数。使用它可以在Makefile中构造一个可变的规则结构关系(依赖关系链),其中可以使用其它变量和函数

结合第 4 点,示例如下:

# 对于所有可编译的目标,根据 <module>_component.mk 创建目标的依赖规则
$(foreach LIB,$(FINAL_LIB_LIST),$(eval $(call CREATE_DEP_TARGETS,$(LIB),FINAL_LIB_LIST)))
$(foreach APP_LIB,$(FINAL_APP_LIB_LIST),$(eval $(call CREATE_DEP_TARGETS,$(APP_LIB),FINAL_APP_LIB_LIST)))
$(foreach EXAMPLE,$(FINAL_EXAMPLE_LIST),$(eval $(call CREATE_DEP_TARGETS,$(EXAMPLE),FINAL_EXAMPLE_LIST)))
$(foreach DUP_EXAMPLE,$(FINAL_DUP_EXAMPLE_LIST),$(eval $(call CREATE_DEP_TARGETS,$(DUP_EXAMPLE),FINAL_DUP_EXAMPLE_LIST)))
$(foreach FIRM,$(FINAL_FIRM_LIST),$(eval $(call CREATE_DEP_TARGETS,$(FIRM),FINAL_FIRM_LIST)))
$(foreach UTIL,$(FINAL_UTILS_LIST_ALL),$(eval $(call CREATE_DEP_TARGETS,$(UTIL),FINAL_UTILS_LIST_ALL)))

TDA4VM 8.4 RTOS SDK 中 SBL 的编译流程解析与makefile 分析笔记相关推荐

  1. c2061 dword 语法错误_SDK中sample的编译错误.doc

    SDK中sample的编译错误 SDK中sample的编译错误(2009-04-08 10:47:02) 杂谈? 转自:/bestfighter_210@126/blog/ ? 编译BaseClass ...

  2. vue3中使用lulu-UI和源码解析

    vue3中使用lulu-UI和源码解析 前言 本文分析的是LuLu UI的Edge主题,这是张鑫旭开发的一套UI组件,使用原生JavaScript编写,使用了JavaScript和CSS前沿的新语法和 ...

  3. IoT开发——WIFI模块ESP8266 RTOS SDK V3.0.0环境搭建

    目录 1. 环境概览 2. 安装Ubuntu操作系统 3.搭建编译环境 3.2 环境准备 3.3 环境配置 3.4 设置串口,进行编译 3.5 配置elipse编译器 (1)安装eclipse (2) ...

  4. 安信可1.5---编译下载乐鑫ESP8266 RTOS SDK库

    一.安装安信可一体化工具 参考安信可官方博客:安信可IDE1.5 二.下载乐鑫ESP8266 RTOS SDK库 因为github下载太慢,经常下载不下来,这里使用gitee进行下载,请自行安装git ...

  5. 5. ESP8266固件的编译(RTOS SDK固件)

    在RTOS SDK下,除了用户程序入口函数名字是user_init()以外, 整个的编程感觉很像linux(当然具体是非常不一样的)下编程,也有tcp/ip协议栈,就像传统的C开发. 1)固件代码准备 ...

  6. ESP8266 RTOS SDK 开发环境搭建

    一.工具链的设置 参考乐鑫官网文档 Get Started - ESP8266 RTOS SDK Programming Guide documentation 二.获取ESP8266_RTOS_SD ...

  7. HTC VIVE SDK 中的例子 hellovr_opengl 程序流程分析

    最近Vive的VR头盔设备很火,恰逢项目需求,所以对 SDK 中的例子 hellovr_opengl 做了比较细致的代码分析,先将流程图绘制如下,便于大家理解. 在ViVe头盔中实现立体效果的技术核心 ...

  8. android java包_android SDk中常用的java包介绍

    下面是android SDK中API中的主要java包的功能简介: android.app :提供高层的程序模型.提供基本的运行环境 android.content :包含各种的对设备上的数据进行访问 ...

  9. 在sdk中添加源文件_实用干货 | 一步一步教你在SpringBoot中集成微信刷卡支付

    一:准备工作 使用微信支付需要先开通服务号,然后还要开通微信支付,最后还要配置一些开发参数,过程比较多. 申请服务号(企业) 开通微信支付 开发配置 具体准备工作请参考Spring Boot入门教程( ...

最新文章

  1. hadoop 1.0.1集群安装及配置
  2. iPhone 越狱开发相关
  3. datatables[columns] 中的详细参数
  4. 3部世界顶级宇宙纪录片,献给对宇宙万物充满好奇的大人孩子~
  5. 转:c# 安装包制作
  6. 驱动设计ARM(6410)-按键驱动0基础知识点
  7. 将集合类转换成DataTable
  8. aggregate()函数--R语言
  9. 思科 ASA5505 防火墙放行流量简单配置案例
  10. 数据分析项目实战:电影数据分析
  11. python数字类型中包含了哪三种类型_Python数字类型中包含了________、________和_________三种类型。...
  12. GymBase英文版主题-健身主题-WordPress响应式
  13. 华为桌面小程序在哪里_微信Windows版更新至3.0:批量管理联系人,小程序可添加至桌面...
  14. 冒泡排序(Bubble Sort)
  15. 红米有android,超23款小米、红米升Android O以上系统,日前又一款尝鲜Andro
  16. 计算机毕业设计php公文审批系统-办公系统
  17. 利用C#写1000以内完数
  18. 129.Oracle数据库SQL开发之 数据库对象——其他有用的对象函数
  19. unity3D 鼠标控制物体旋转带阻尼效果
  20. SOLIDWORKS-D:\SW\SolidWorks_Flexnet_Server/启动server_install

热门文章

  1. Unity3D编辑器扩展1——批量处理资源
  2. 大气复折射率matlab,Matlab 计算DBR折射率 - 计算模拟 - 小木虫 - 学术 科研 互动社区...
  3. 串口服务器网页显示iis,生命在等待中延续:汉枫Wi-Fi串口服务器HF2211S应用案例...
  4. windows安装xpm
  5. java内部枚举类_内部类和枚举类
  6. 2. Polyspace工程Configuaration配置
  7. parasolid 原因 效率_PARASOLID 25.0提供众多用户驱动型增强特性 助力提升工作效率...
  8. 绘制 Logistic 映射分叉图
  9. 科学管理原理读书笔记
  10. 190410-4步利用EndNote批量下载参考文献及施引文献