MCUXpresso IDE下高度灵活的FreeMarker链接文件模板机制

news2024/11/30 8:38:00

一、准备工作

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

  • 集成开发环境: 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链接文件模板机制痞子衡便介绍完毕了,掌声在哪里~~~

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

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

相关文章

这么卷,现在测试工程师要求会写工具了?

Fintech概念正受到不少互联网金融公司的热捧&#xff0c;主要是指代那些可用于撕裂传统金融服务方式的高新技术。越来越多的企业开辟了新的部门去研究各种各样能让自己产品增值的科技类产品。 尤其是在很多互联网金融公司&#xff0c;业务分析师BA(Business Analyst)&#xff…

【Linux】-- 初识操作系统

目录 一、冯诺依曼体系结构 二、操作系统 1.概念 2.为什么要有操作系统 三.操作系统 1.硬件层 2.驱动层 3.操作系统层 4.用户层 &#xff08;1&#xff09;用户层 &#xff08;2&#xff09;系统调用接口 &#xff08;3&#xff09;用户操作接口 四、如何管理 1…

C. Zero-Sum Prefixes Codeforces Round #833 (Div. 2)(前缀和+贪心)

传送门 题意&#xff1a; 给你一个长度为n的数组&#xff0c;里面包含a1,a2,a3...an n个元素&#xff0c; 当的时候&#xff0c;你可以将变成任意数字&#xff0c; 问你经过任意次操作后对于&#xff0c;它的前i项和为0的个数是最大是多少&#xff1f; 思路&#xff1a; …

27岁自学Python转行靠谱吗?入行晚吗?

前言 今年已经奔三的小编来给大家说说&#xff0c;之前自己也是在一个普通的二本院校上学&#xff0c;学的还是工商管理&#xff0c;毕竟读书的时候电视剧里面的主角都是工商管理的大佬。 不过在毕业之后就经历了社会的毒打&#xff0c;后面小编就想去换一个工作&#xff0c;…

[附源码]计算机毕业设计springboot交通事故档案管理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

jsp192ssm驾校报名预约管理系统

目 录 汽车驾校管理系统设计与实现 I 摘 要 I ABSTRACT I 目 录 III 第1章 绪论 3 1.1开发背景 3 1.2开发意义 3 1.3研究内容 3 第2章 主要技术和工具介绍 3 2.1SSM 框架 错误&#xff01;未定义书签。 2.1.1. Spring 框架 3 2.1.2 SpringS…

clickhouse远程访问Oracle 11g数据库(clickhouse-jdbc-bridge)

1、简介 clickhouse-jdbc-bridge&#xff1a;是clickhouse提供的一个jdbc组件&#xff0c;用于通过JDBC的方式远程访问其他数据库表。 2、安装 &#xff08;1&#xff09;下载源文件并打包获取clickhouse-jdbc-bridge-2.0.7-shaded.jar 在官网&#xff1a;https://github.c…

stc15 - ST7920-12864并口通讯和串口通讯的整理(在一个实现中)

文章目录stc15 - ST7920-12864并口通讯和串口通讯的整理(在一个实现中)概述笔记原理图ENDstc15 - ST7920-12864并口通讯和串口通讯的整理(在一个实现中) 概述 为板子写测试程序, 整到12864 LCD这里. STC原厂工程只提供并口通讯. 找了网上同学的串口通讯实现, 整理了一下, 将串…

当成为全球第二大汽车出口国后,中国车企的下一步是什么?

新一轮汽车出口浪潮在疫情期间悄然启动&#xff0c;中国汽车工业协会发布数据显示&#xff0c;自2021年起&#xff0c;汽车出口销量呈现高速增长的势头&#xff0c;2022年前三季度汽车出口量超过2021年全年出口量&#xff0c;并超越德国&#xff0c;成为仅次于日本的全球第二大…

熊市链游模型如何设计开发?

GameFi的全局趋势 自第一款视频游戏诞生以来&#xff0c;游戏世界已经发生了翻天覆地的变化。技术和玩游戏的目的是不断围绕游戏本身发展着的两件主要事情。曾经的街机游戏、主机游戏、电脑游戏&#xff0c;再到如今智能手机时代&#xff0c;手机游戏已经无处不在。随着时间的…

Navicat 被广泛的应用于各行各业的原因

近期&#xff0c;Navicat 发起了一场用户线上投票活动&#xff0c;受到了众多用户的关注和热情响应&#xff01;今天&#xff0c;我们就带大家了解此次投票数据通过用户的职业、使用频率、连接的数据库种类以及最常用的功能&#xff0c;通过用户视角了解 Navicat 产品的适用范畴…

Https加密超文本传输协议的运用

内容预知 1.https的相关知识 1.1 https的简介 1.2 HTTP 与 HTTPS 的区别 1 .3 SSL的相关了解 1.3 SSL/TLS协议和证书的关系 1.4 https的工作流程 1.5 客户端是如何验证证书是否有效 1.6 web网站并未全部采用https的原因 2. SSL证书获取的方法 2.1 阿里云证书的获取 2…

linux不显示当前路径的解决方法

1.输入vim ~/.bashrc进入用户的shell环境变量的配置文件(可以设置环境变量以及通过alias设置别名&#xff09; 2.按下“i”键进入编辑模式(底部显示INSERT&#xff09; 3.修改\w为$PWD&#xff1a; 修改为&#xff1a; 4.按“esc”键后输入":wq"保存并退出&#xff…

IPSec NAT穿越原理

在IPSec VPN部署中&#xff0c;如果发起者位于私网内部&#xff08;如下图FW_C&#xff09;&#xff0c;而它希望与FW_A之间直接建立一条IPSec隧道&#xff0c;这种情况下NAT会对部署IPSec VPN网络造成障碍。 PC2发业务报文给PC1&#xff0c;IPSec先对IP包头或端口信息进行验证…

10 个用图表解释JavaScript 闭包的面试题

闭包是函数式编程中的核心概念之一&#xff0c;是每个 JavaScript 开发人员必备的知识。在这里&#xff0c;我准备了 10 个关于闭包的面试挑战题&#xff0c;这些基本都是面试中经常被问到的。 你准备好了吗&#xff1f;我们现在要开始了。 每个题目都有一个代码片段&#xf…

代码随想录算法训练营第五十天| LeetCode123. 买卖股票的最佳时机 III、LeetCode188. 买卖股票的最佳时机 IV

一、LeetCode123. 买卖股票的最佳时机 III 1&#xff1a;题目描述&#xff08;123. 买卖股票的最佳时机 III&#xff09; 给定一个数组&#xff0c;它的第 i 个元素是一支给定的股票在第 i 天的价格。 设计一个算法来计算你所能获取的最大利润。你最多可以完成 两笔 交易。 注意…

小学生学Arduino---------点阵(一)静态图片显示

今天来看一下&#xff0c;点阵模块这一模块可以做出非常有意思的东西。 学习目标&#xff1a; 1、了解点阵原理 2、掌握图形绘制&#xff08;心形、三角形等&#xff09; 3、掌握图形显示器的功能 4、掌握led点阵屏幕的功能 5、搭建电路 6、编写程序 一、点阵的原理 LED点阵屏…

Functional Programming in Java venkat(16) Being Lazy part3

文章目录Functional Programming in Java venkat(16): Being LazyLeveraging the Laziness of StreamsIntermediate and Terminal OperationsMethod Evaluation OrderPeeking into the LazinessFunctional Programming in Java venkat(16): Being Lazy 这里是记录学习这本书 F…

linux权限详解

文章目录1.用户转换1.将普通用户转换成root1.su -2. su2.将root转换为普通用户2.文件的权限1.文件访问者的分类拥有者和other所属组2.rwx的含义3.修改权限第一种修改方式1.拥有者修改2.所属组的修改3.other的修改4.整体修改第二种修改方式666000777使用权限的修改1.拥有者用户的…

[事务]-事务概念/特性/并发问题/传播特性

1. 事务的概念 事务&#xff08;Transaction&#xff09;指的是一个操作序列&#xff0c;该操作序列中的多个操作要么都做&#xff0c;要么都不做&#xff0c;是一个不可分割的工作单位&#xff0c;是数据库环境中的逻辑工作单位&#xff0c;由DBMS中的事务管理子系统负责…