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

2023-05-16

目录

    • 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 依赖下面的规则编译:
编译 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 可执行文件
(叮咚叮咚~,恭喜你,发现编译生成 .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 的规则
命令简化如下:

	#由 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 board

print_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
	@pwd
	
dirtest1:
	@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)))
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • git分支从master切换到main

    git分支从master切换到main 背景 本地当前分支为master xff0c 远程仓库为main xff0c 且远程仓库与本地仓库有 unrelated histories这样的问题 xff0c 如远程仓库有README md但本地
  • Docker学习第三天——Docker网络

    文章目录 摘要Linux 网络命名空间Docker bridge网络容器之间的Link容器的端口映射容器网络之host和none多容器复杂应用的部署多机器通信 摘要 Docker学习之旅第三天 Docker 网络 看完这篇文章将收获dock
  • 大津阈值法(OTSU)功能实现

    具体的公式推导参见冈萨雷斯 数字图像处理 Otsu方法又称最大类间方差法 xff0c 通过把像素分配为两类或多类 xff0c 计算类间方差 xff0c 当方差达到最大值时 xff0c 类分割线 xff08 即灰度值 xff09 就作为图像分
  • cas-server服务端搭建

    1 下载cas服务代码 xff0c https github com apereo cas overlay template tree 5 3 2 使用idea工具打开cas overlay template 5 3包 xff0c 使用ma
  • 自适应阈值canny边缘检测(功能实现)

    学习记录 1 概述 canny边缘检测是一种特别常用且性能优秀的边缘检测算法 xff0c 相比于普通的边缘检测算法 xff0c canny获得的边缘较细且具有连续的边缘轮廓 xff0c 为之后的一系列图像处理带来极大的便利 canny边缘检
  • OpenCV实现图像基础频率域滤波

    写在前面 xff1a 刚开始接触数字图像处理频率域滤波时 xff0c 很是陌生 xff0c 感觉这个技术使用范围很窄 xff0c 不如空域直接处理来的实在 xff0c 最近看书发现有些情况又不得不在频率域中进行操作 xff0c 个人感觉图像
  • OpenCV实现同态滤波

    同态滤波是属于图像增强的一个小算法 xff0c 其原理和代码实现在众多博客中均有提及 xff0c 再此 xff0c 只对学习中一些自认为有用的知识点进行总结 实现和学习过程中的一些总结 xff1a 同态滤波类似于灰度变换 xff0c 都是对
  • OpenCV实现击中击不中变换和形态学细化

    1 击中击不中变换 1 1 HMT概述 形态学Hit or Miss是形状检测基本工具 xff0c 只要结构元设置得当 xff0c 就可以检测一些基本的形状图案 xff0c HMT变换只能作用于二值图像 xff0c 结构元 xff08 核
  • OpenCV综合练习1——水瓶水位线合格检测

    数字图像处理综合练习 水瓶水位线合格检测 马上就要转到学习深度学习的主干线了 xff0c 这也是大势所趋 xff0c 但不能忘本 xff0c 传统图像处理的知识也是非常重要的 xff0c 特此记录一下之前学习时做过的小练习 整个项目的资源放
  • 目标检测学习1——iou计算与非极大值抑制NMS

    刚开始学习目标检测 xff0c 都是在学习一些经典的目标检测框架 xff0c 个人认为在大量阅读和理解别人现成的代码时 xff0c 也要懂得去动手模仿 xff0c 尝试着去修改别人的代码 xff0c 即使是自己抄一遍别人的代码 xff0c
  • OpenCV实现按指定间隔抽取视频中的图像帧

    习惯了C 43 43 语言的OpenCV突然用Python语言OpenCV还是感觉有点不适应 xff0c 但是慢慢在写的过程中 xff0c 觉得Python语言的风格也挺美的 但自己的写的还是很丑 xff0c 晚上回宿舍的剩余时间 xff0
  • 深度估计berHu损失函数和语义分割带权值交叉熵损失函数

    深度估计berHu损失函数和语义分割带权值交叉熵损失函数 最近在做联合深度估计和语义分割的深度学习算法 xff0c 深度估计默认使用的是L1 loss xff0c 语义分割使用的是普通的交叉熵损失函数 xff0c 继续改进模型对于指标的提升
  • 游览器是如何工作的

    游览器是如何工作的 浏览器的主要功能浏览器的主要构成一次网络请求浏览器发生了什么 xff1a 如果请求使用了HTTPS那么流程会有什么不同 xff1f 总结 浏览器的主要功能 浏览器的主要功能是将用户选择得web资源呈现出来 xff0c 它
  • OSG QT 完整附加依赖项(.lib)

    OSG QT 完整附加依赖项 lib 可在VS等需要添加附加依赖项的环境使用 注 xff1a OSG版本 xff1a 3 6 4 xff1b QT版本 xff1a 5 9 8 带d的为debug xff0c 不带d的release省掉了Qt
  • Ubuntu登陆账户后自动运行VNCserver

    问题 xff1a 远程桌面时 xff0c 如果重启远程Ubuntu xff0c 则VNC会话失效 解决 xff1a 一个解决的方法就是用putty将重启的Ubuntu登陆入账户后 xff0c 再开启VNC会话 为了方便 xff0c 可以设置
  • RAP与RARP原理

    ARP与RARP都属于网络层协议 xff0c 但是他们是为了解决链路层的帧转发问题 xff0c ARP的功能是将IP解析成MAC地址 xff0c 而RARP则相反 ARP 地址解析协议 xff08 Address Resolution Pr
  • eyeshot官方样例说明

    Eyeshot 12 例子 1 wings拖动按钮改变机翼的尺寸参数 xff0c 并导出到step文件 2 snaptogrid鼠标画平面 xff0c 类似于CATIA的多段线功能 3 sceneeditor控制灯光点和变换位置 xff0c
  • Python爬虫实现获取股票信息并保存到文件(亲测可运行)

    主要参考了北京理工大学嵩天老师的视频 xff0c 因老师所讲的网址已做更改 xff0c 将获取股票列表信息和股票价格的网站做了更改 xff0c 用到了beautiful soup库 xff0c re库 xff0c requests库 xff
  • 为什么要内存对齐?

    CPU访问非对齐的内存时为何需要多次读取再拼接 xff1f 首先简单说一下何为内存对齐 例如 xff0c 当cpu需要取4个连续的字节时 xff0c 若内存起始位置的地址可以被4整除 xff0c 那么我们称其对齐访问 反之 xff0c 则为
  • 读AQS源码-关于shouldParkAfterFailedAcquire函数的返回值

    先上源码 final boolean acquireQueued final Node node int arg boolean failed 61 true try boolean interrupted 61 false for fin

随机推荐

  • 读AQS源码-关于同步队列与锁的公平性

    先上部分源码 xff1a public final void acquire span class token punctuation span int arg span class token punctuation span span
  • FreeRTOS 正点原子教程学习笔记

    正点原子视频教程 FreeRTOS 教程非常详细 xff09 小知识 如果创建了任务却完全空着 xff0c 没有while xff08 1 xff09 延时 的话 xff0c 整个程序会卡住 xff0c 其他正常的任务无法运行 如果任务里单
  • 数据分析之Matplotlib(一)简介

    Matplotlib简介 Matplotlib是一个Python 2D绘图库 xff0c 可以生成各种硬拷贝格式和跨平台的交互式环境的出版物质量数据 Matplotlib可用于Python脚本 xff0c Python和IPython sh
  • 【2018-AAAI】Spatial As Deep: Spatial CNN for Traffic Scene Understanding

    概述 提出了SCNN语义分割网络 xff0c 将传统的深度逐层卷积推广到特征图中的逐片卷积 xff0c 在同一特征图的行和列上做信息传递 xff0c 可有效识别强先验结构的目标 此外论文还发布了一个大型的车道线检测数据集CULane Dat
  • 安装Code Blocks时出现can‘t find compiler的解决方法

    安装Code Blocks时出现can t find compiler的解决方法 1 首先我们要下载Code Blocks xff0c 我们可以去官方网站下载https www codeblocks org xff0c 或者直接点击该链接跳
  • OSPF网路拓扑结构(rfc2328)

    OSPF网路拓扑结构 xff08 rfc2328 xff09 OSPF rfc文档 xff08 rfc2328 xff09 中的拓扑结构对理解OSPF分区 区域内路由 区域边界路由 自治系统边界路由等基本概念很有帮助 并且整个文档打大部分内
  • Win10下使用WinSCP+PuTTY实现远程文件操作和终端访问

    Win10下使用WinSCP 43 PuTTY实现远程文件操作和终端访问 0 软件安装 安装WinSCP xff0c 参考官网安装PuTTY xff0c 从这个页面下载 1 WinSCP使用技巧 1 1 连接到远程主机 如下图所示 xff0
  • KVM创建的虚拟机创建快照、查看以及恢复

    KVM虚拟机要使用快照功能 xff0c 磁盘格式必须为qcw2如果不满足qcw2 xff0c 可以参考下面的链接进行修改 xff1a https www jianshu com p f6cc295a2108 创建快照方法 xff1a 创建快
  • KTT条件

    以下都是个人理解 xff0c 刚刚有点理解 xff0c 所以可能表达不清楚 但是又想把一些理解表达出来 xff0c 故写了这篇 上篇文章说了 xff0c 拉格朗日乘子法 xff0c 可以在等式约数的条件下 xff0c 求得某函数f的极大或极
  • github.com 拒绝了我们的连接请求。

    github com 拒绝了我们的连接请求 1 解决方法 1 解决方法 打开Dns检测 Dns查询 站长工具 在检测输入栏中输入GitHub官网 把检测列表里某个IP xff08 我选择最大的IP试了可以 xff09 输入到hosts里 x
  • Git操作详解以及在VScode中的使用

    我们先理清Git和Github的区别 xff0c Git是个版本控制的工具 xff0c 用来管理本地的代码工程 xff0c 它可以记录代码内容的变更 xff1b 而Github是一个代码托管平台 xff0c 我们可以使用Git将本地代码上传
  • 前端性能优化的指标和工具

    目录 一 xff1a 性能指标和优化目标 1 1 网络加载性能 1 2 用户交互体验 二 xff1a RAIL测量模型 2 1 Response xff08 响应 xff09 处理事件应在在50ms内完成 2 2 Animation xff
  • Windows下nvm的安装配置及使用

    目录 一 xff1a nvm简介 二 xff1a nvm下载及安装 三 xff1a nvm配置镜像 四 xff1a nvm的基本使用 五 xff1a nvm的一些常用命令 一 xff1a nvm简介 nvm 全名叫做 nodejs vers
  • SQLyog 链接MYSQL 8.0错误代码1251

    错误代码1251 2018 08 20 15 51 48 打开Navicat 的时候发现报错 xff0c 无法连接mySql数据库 感觉莫名奇妙 xff0c 报错 xff1a 1251 解决方法 xff1a 第一种方式 xff1a 打开Co
  • 关于Mysql数据库连接Navicat时出现1251报错问题的解决方法

    在Mysql数据库出问题后 xff0c 如果按照方法去解决 xff0c 还不如直接删除重装 xff0c 当然这里就要看自己的彻底删除MySQL数据库的方法对不对 xff0c 后面成功彻底删除了MySQL数据库 xff0c 配置好了MySQL
  • ROS初学订阅subscriber

    官方示例 include span class token string 34 ros ros h 34 span include span class token string 34 std msgs String h 34 span s
  • 解决andriod studio每次新建项目都要重新配置gradle的问题

    xff08 知道解决项目的gradle问题 xff0c 想要解决andriod studio每次新建项目都要重新配置gradle的问题的直接看最后一段 xff09 使用andriod studio出现Error Unknown host 3
  • 云原生:未来云计算的新趋势

    云原生 xff1a 未来云计算的新趋势 随着云计算技术的迅速发展 xff0c 云原生已成为最新的趋势 它不仅是云计算的新技术 xff0c 也是未来云计算的新趋势 什么是云原生 xff1f 云原生是指将应用程序设计为在云环境中运行的方式 它强
  • 打包造成The packaging for this project did not assign a file to the build artifact -> [Help 1]

    今天在家打包遇见The packaging for this project did not assign a file to the build artifact 仔细看了一下发现今天脑抽了在Plugins下打包 打包应该在Lifecyc
  • TDA4VM 8.4 RTOS SDK 中 SBL 的编译流程解析与makefile 分析笔记

    目录 0 TDA4VM 8 4 RTOS SDK 中 SBL 的编译流程解析TI SDK 的可执行文件后缀名是 xer5f 的原因sbl ospi img 的 xer5f 可执行文件的生成过程编译依赖的静态库编译可执行文件命令 xer5f