痞子衡嵌入式:MCUXpresso IDE下高度灵活的FreeMarker链接文件模板机制

news2025/7/11 7:31:12

  大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家分享的是MCUXpresso IDE下高度灵活的FreeMarker链接文件模板机制

  痞子衡之前写过一篇文章 《MCUXpresso IDE下工程链接文件配置管理与自动生成机制》,这篇文章介绍了 MCUXpresso IDE 在链接文件管理设计上跟其它 IDE(IAR/Keil)不一样的地方,与 IAR/Keil 下用户直接改写链接文件去做个性化目标链接(比如把某个源文件里全部代码重定向链接到 RAM 里执行)不同的是, MCUXpresso IDE 下用户都是在图形化配置界面里做对应操作,然后 MCUXpresso IDE 会自动生成相应的链接文件(.ld)。但是图性化操作界面里有时候不能百分百满足用户的个性化链接需求,这时候除了回退到 IAR/Keil 下那种传统方式外,还有没有其它方式呢?答案是有的,这就是今天要聊的 MCUXpresso IDE 下 FreeMarker 链接文件模板机制。

一、准备工作

  首先需要准备好环境,包含必要的软件,痞子衡的环境如下:

  • 集成开发环境: MCUXpresso IDE_11.6.0_8187,点此下载
  • 软件开发包: SDK_2.12.1_EVK-MIMXRT1170(Toolchain需包含MCUXpresso IDE),点此下载

  然后按照 《MCUXpresso IDE下将关键函数重定向到RAM中执行的几种方法》 文章 一、准备工作 小节里改造下 evkmimxrt1170_hello_world_demo_cm7 示例工程选项,并添加 critical_code.c 源文件。在这篇文章的 2.3 针对源文件中全部函数 小节里,痞子衡为了将 critical_code.c 里代码全部链接到 DTCM,使用了回退到 IAR/Keil 那种传统改写链接文件的方式。今天我们就尝试用 FreeMarker 链接文件模板机制这个特性来实现。

二、FreeMarker机制

  FreeMarker 是一个模板引擎(更通俗的说法其实就是链接文本的生成器),它集成在 MCUXpresso IDE 内部,由 MCUXpresso IDE 自动调用。MCUXpresso IDE 下最终的链接文件其实是由这个 FreeMarker 处理生成的。在 MCUXpresso IDE 软件内部有一组默认的系统模板(也叫根模板),它还支持用户提供的模板(这些模板均是用一种专用的语法 FTL 来描述的),所有适用工程的模板最终统一经过 FreeMarker 来处理。

  模板的设计是组件化的,这意味着用户不需要编写整个工程的模板,只需要加入指定的用户模板实现个性化链接需求即可,其它部分仍由 MCUXpresso IDE 图形配置界面完成。默认情况下,用户模板需要被放在指定的 user_project_root/linkscripts 目录下(这个路径不用额外添加进工程选项 C/C++ General \ Paths and Symbols \ Source Location 中)。

  • Note:更多 FreeMarker 细节,可以参见 \MCUXpressoIDE_11.6.0_8187\MCUXpresso_IDE_User_Guide.pdf 文档里的 17.14 FreeMarker Linker Script Templates 小节。

三、新方法解决问题

  现在我们尝试用 FreeMarker 特性来解决 critical_code.o 的链接需求。首先是在 \MCUXpressoIDE_11.6.0_81874\workspace\evkmimxrt1170_hello_world_demo_cm7 下创建一个名为 linkscripts 的文件夹(前面说了,这个新文件夹路径不需要在工程选项里登记),然后在 linkscripts 里面新建如下三个 .ldt 文件(固定文件名,由 FreeMarker 定死的):

bss.ldt
data.ldt          -- 作用是将 critical_code.o 放到指定 RAMx 区域
                  -- 备注:如果 MCU 仅一块 RAM 空间,则此处应为 main_data.ldt
main_text.ldt     -- 作用是将 critical_code.o 从 .text 段(默认链接在 Flash 区域)移出来

  main_text.ldt 内容比较简单,仅仅是用于告诉 FreeMarker 不要将 critical_code.o 里的 text 段放进主 .text 段里一起处理:

// 单目标文件写法
*(EXCLUDE_FILE(*critical_code.o) .text*)

// 如果是多目标文件,写法可以这样
*(EXCLUDE_FILE(*critical_code1.o *critical_code2.o) .text*)

  data.ldt 中内容比较关键,用于重置 critical_code.o 里的 text 段。这里需要注意的是如果是将该 text 放置进主 RAM 区域(即工程选项 MCU settings 里 Alias 名为 RAM 的空间),其写法跟不放进主 RAM 不一样:

// 如果目标文件放进主 RAM        - 正确写法,等效于放进 memory.alias=="RAM" 或者 memory.name=="SRAM_DTC_cm7" 区域
*critical_code.o(.text*)

// 如果目标文件放进主 RAM        - 错误写法,实际不生效,等于没有重置,代码依旧放进 Flash 区域
<#if memory.alias=="RAM">
*critical_code.o(.text*)
</#if>

// 如果目标文件不是放进主 RAM    - 正确写法1
<#if memory.name=="SRAM_ITC_cm7">
*critical_code.o(.text*)
</#if>

// 如果目标文件不是放进主 RAM    - 正确写法2
<#if memory.alias=="RAM2">
*critical_code.o(.text*)
</#if>

// 如果是多目标文件,写法可以这样
<#if memory.name=="SRAM_ITC_cm7">
*critical_code1.o(.text*)
*critical_code2.o(.text*)
</#if>

  现在编译工程查看映射文件,我们会发现 critical_code.c 里全部函数都已经链接在指定的 RAMx 区域了。如果你想更进一步,把 critical_code.c 里全部 RO data 段都放进指定 RAMx 区域,则需要再在 linkscripts 文件夹里增加一个名为 main_rodata.ldt 文件。其内容如下,这里是告诉 FreeMarker 不要将 critical_code.o 里的 RO data 段放进主 RO data 段里一起处理。

*(EXCLUDE_FILE(*critical_code.o) .rodata)
*(EXCLUDE_FILE(*critical_code.o) .rodata.*)
*(EXCLUDE_FILE(*critical_code.o) .constdata)
*(EXCLUDE_FILE(*critical_code.o) .constdata.*)
. = ALIGN(${text_align});

  然后 data.ldt 里改成如下这样就可以了:

<#if memory.alias=="RAM2">
*critical_code.o(.text*)
*critical_code.o(.rodata .rodata.* .constdata .constdata.*)
</#if>

  至此,MCUXpresso IDE下高度灵活的FreeMarker链接文件模板机制痞子衡便介绍完毕了,掌声在哪里~~~

欢迎订阅

文章会同时发布到我的 博客园主页、CSDN主页、知乎主页、微信公众号 平台上。

微信搜索"痞子衡嵌入式"或者扫描下面二维码,就可以在手机上第一时间看了哦。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/38588.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

网页前端知识汇总(三)——网页前端利用二维码插件qrcode生成在线二维码

最近几年二维码的广泛应用&#xff0c;方便了很多行业&#xff0c;如支付宝&#xff0c;微信&#xff0c;小程序扫码之类的&#xff0c;这个在二十年前&#xff0c;想都不敢想这么方便&#xff0c;那时候有书刊编码扫一扫都感觉是高科技了&#xff0c;如今&#xff0c;二维码的…

RNA-seq 详细教程:实验设计(2)

学习目标 了解设置重复对于 RNA-seq 分析的重要性了解生物重复次数、测序深度和鉴定到的差异表达基因之间的关系了解如何设计RNA-seq 实验&#xff0c;以避免批次效应1. 注意事项 了解 RNA 提取和 RNA-seq 文库制备实验过程中的步骤&#xff0c;有助于设计 RNA-seq 实验&#x…

PyTorch学习笔记-常用函数与数据加载

1. PyTorch常用函数 &#xff08;1&#xff09;路径相关的函数 假设我们数据集的目录结构如下&#xff1a; 首先需要 import os&#xff0c;在 os 中常用的路径相关的函数有&#xff1a; os.listdir(path)&#xff1a;将 path 目录下的内容列成一个 list。os.path.join(path1…

cmake入门教程 跨平台项目构建工具cmake介绍

一.初识cmake 在介绍cmake之前&#xff0c;我们先来从工具一个个衍生出来&#xff0c;做过linux c/c编程的时候一般用过gcc指令或者makefile。我们先来介绍下 gcc&#xff08;GNU Compiler Collection&#xff09;将源文件编译&#xff08;Compile&#xff09;成可执行文件或…

若依框架解读(前后端分离版)—— 1.Spring Security相关配置(@Anonymous注解)

有关Spring Security与JWT相关知识可以看我之前写的文章&#xff1a;SpringBoot整合SpringSecurityJWT(三更草堂) 这边需要对RBAC模型有一点了解&#xff0c;比较简单可自行百度。 首先查看Security配置类SecurityConfig&#xff0c;如果我们想要放行自己写的接口是可以在此配置…

数学建模国赛/美赛常见赛题类型及建模方案(纯干货)

目录 一&#xff0c;评价类问题 1&#xff0c;建模步骤如下图所示&#xff1a; 2&#xff0c;主客观评价问题的区别 3&#xff0c;如何选择合适的评价方法 二&#xff0c;预测类赛题 1&#xff0c;预测类赛题的基本解题步骤 2&#xff0c;预测类问题的区别 3&#xff0c;…

什么是Tomcat?如何使用Tomcat?如何部署一个静态页面?

目录 1、Tomcat是什么&#xff1f; 2、下载安装 3、目录结构 4、启动服务器 5、部署静态页面&#xff08;简单举例&#xff09; 1、Tomcat是什么&#xff1f; Tomcat是一个HTTP服务器&#xff0c;Tomcat就是基于Java实现的一个开源免费的HTTP服务器 2、下载安装 下载网…

virtualbox安装openEuler-方案二

下载的讲解在另一篇&#xff1a;VirtualBox安装openEuler 方案一 安装&#xff1a; 1&#xff0c;配置网卡 2&#xff0c;加载光驱设置 选择对应的iso文件即可。 3&#xff0c;启动openEuler 选择第一个即可&#xff0c;第二个选项一般是在生成环境中使用。 经过一段…

std::weak_ptr(分析、仿写)

目录 一、为什么会有weak_ptr? 1、看一个例子 2.weak_ptr 是什么? 3.weak_ ptr 如何使用? 1、如何创建weak_ ptr 实例 2、如何判断weak_ptr指向的对象是否存在 3、weak_ptr的使用 二、仿写std::weak_ptr 1、c参考手册 2、代码 一、为什么会有weak_ptr? 1、看一个例子…

18uec++多人游戏【服务器为两个角色发枪,并能在线开枪】

打开主角类&#xff0c;生成枪的代码逻辑在游戏开始函数里 所以在生成之前&#xff0c;我们需要判断该对象是否在服务器端&#xff08;服务器端视角&#xff09; void ASCharacter::BeginPlay() {Super::BeginPlay();DefaultsFOV CameraComp->FieldOfView;//判断是否在服务…

支付系统 — 支付路由

本文主要介绍下支付中路由系统的主要流程。 支付路由的作用 降低成本&#xff1a;越便宜越好&#xff1b; 提高用户体验&#xff1a;用户支付的越爽越好&#xff1b;越快越好&#xff1b;成功率越高越好。 确保有可用通道&#xff1a;多个选择&#xff0c;确保能完成支付。 …

【JVM】PC程序计数器和PC寄存器

一、JVM体系结构 本文所讲内容主要是 JVM 体系结构图中 运行时数据区 中的 PC寄存器&#xff0c;如下图所示&#xff1a; 二、PC寄存器是什么&#xff1f; 这里引用别人的一句话&#xff1a; 首先这里的PC寄存器并非广义上所指的物理寄存器&#xff0c;或许将其翻译为PC计数…

antd Carousel 重写dot样式

antd的Carousel走马灯组件的dot也就是下面那个滑动的按钮非常的不起眼。 白色背景的时候完全看不到。 但是我们大部分时候又都是白色背景&#xff0c;于是来自己重写一下样式。 在控制台看了一下&#xff0c;应该是这个属性在控制dot的颜色&#xff0c;重写这个属性就可以了。…

Nginx源码解析 --红黑树

预读知识 红黑树是一种自平衡二叉树&#xff0c;不仅可以使用二分法快速查找&#xff0c;而且插入和删除操作的效率也很高&#xff0c;常用于构造关联数组&#xff08;例如C标准库里的set和 map)。 在Nginx里红黑树主要用在事件机制里的定时器&#xff0c;检查连接超时&#…

Debian11之基于kubeadm安装K8S集群

官方安装教程 硬件要求 每台机器的内存要 2GB、CPU2 核心及以上 集群中的所有机器的网络彼此均能相互连接&#xff08;公网和内网都可以&#xff09; 节点之中不可以有重复的主机名、MAC 地址或 product_uuid 开启机器上的某些端口 为了保证 kubelet 正常工作&#xff0c;必须…

FluentCRM 2.6.0:更多功能、集成改进等等!

FluentCRM 2.6.0最新版发布了&#xff0c;它是一个主要的更新版本&#xff0c;为您带来了更多的功能、改进的集成、升级和错误修复&#xff01;让我们来看看 FluentCRM 2.6.0 提供了什么新功能&#xff01; 目录 FluentCRM 2.6的更高级过滤条件 电子邮件活动条件 基于自动化…

STC32G 单片机EEPROM 操作实例

一 STC32G 单片机EEPROM简介 STC32G系列单片机内部集成了大量的EEPROM&#xff0c;特别是STC32G12K128集成多达128K EEPROM。 STC32G内部EEPROM可擦写10万次&#xff0c;分若干扇区&#xff0c;每个扇区512字节。EEPROM的写操作只能将1写为0。要将0写为1&#xff0c;必须擦除…

Hive之函数

Hive之函数 第九章 函数 9.1 系统内置函数 9.1.1 理论 查看内置函数&#xff1a; show functions; 显示函数的详细信息&#xff1a; desc function abs; 显示函数的扩展信息&#xff1a; desc function extended concat; 一、关系运算&#xff1a; 1. 等值比较: 2. 等值…

VSCode:使用CMakeLists.txt构建C++项目

vscode配置 插件&#xff1a; CMake插件主要功能是CMake语法高亮、自动补全CMake Tools的功能主要是结合VSCode IDE使用CMake这个工具&#xff0c;比如生成CMake项目、构建CMake项目等CMake Tools Helper CMake工具本身还是要下载到本地&#xff0c;并且配置环境变量。 项目…

足球二三事 - 世界杯征文

征文活动链接&#xff1a; https://bbs.csdn.net/topics/609601920 从报纸上时候看 1982 年的世界杯&#xff0c;当时我们家里没有电视&#xff0c;晚上的时候听到马路对面的房子里传来惊呼声&#xff0c;也不知道为啥。 1983 年的春节前&#xff0c;家里要打扫房间&#xff…