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

大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家分享的是 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 小节。

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

三、新方法解决问题

现在我们尝试用 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 区域)移出来

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

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 区域

*critical_code.o(.text*)

// 如果目标文件不是放进主 RAM    - 正确写法1

*critical_code.o(.text*)

// 如果目标文件不是放进主 RAM    - 正确写法2

*critical_code.o(.text*)

// 如果是多目标文件,写法可以这样

*critical_code1.o(.text*)
*critical_code2.o(.text*)

现在编译工程查看映射文件,我们会发现 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 里改成如下这样就可以了:


*critical_code.o(.text*)
*critical_code.o(.rodata .rodata.* .constdata .constdata.*)

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

欢迎订阅

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

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

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

Original: https://www.cnblogs.com/henjay724/p/16928122.html
Author: 痞子衡
Title: 痞子衡嵌入式:MCUXpresso IDE下高度灵活的FreeMarker链接文件模板机制

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/797822/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • [Linux段错误 :C/C++]一种内存泄漏的排查方法

    内存泄漏(Memory Leak)是指程序中已动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。本文不再过多介绍内存…

    Python 2023年9月29日
    041
  • 530. Minimum Absolute Difference in BST

    Given the root of a Binary Search Tree (BST), return the minimum absolute difference betwe…

    Python 2023年11月6日
    045
  • php宝塔搭建部署实战易优宠物用品网站源码

    啊哦~你想找的内容离你而去了哦 内容不存在,可能为如下原因导致: ① 内容还在审核中 ② 内容以前存在,但是由于不符合新 的规定而被删除 ③ 内容地址错误 ④ 作者删除了内容。 可…

    Python 2023年11月7日
    043
  • tensorflow学习笔记(一)

    文章目录 * – 一、安装环境 – 二、例子 – 三、张量 – + 3.1 创建一个tensor + * (1) 直接创建 * (2…

    Python 2023年8月26日
    063
  • 【Python数据分析】Numpy

    Numpy使用 https://numpy.org/ The fundamental package for scientific computing with Python mu…

    Python 2023年8月26日
    037
  • XXL-JOB最佳实践与升级指南

    前言: xxl-job是国内一款使用者比较多的分布式任务调度平台,我们内部从19年开始使用该款开源软件,使用的是2.0.1版本,并在此基础上做了二次开发,添加了一些定制化的功能。随…

    Python 2023年10月23日
    058
  • Anaconda安装Python之【Conda基本操作】

    Anaconda是开源的Python包管理器,包含了python学习的全部包,安装后包含conda,一个用于管理python环境的工具。 1.1 Conda安装 Conda ins…

    Python 2023年9月7日
    057
  • Django【执行查询】(一)

    官方Django3.2 文档:https://docs.djangoproject.com/en/3.2/topics/db/queries/本文大部分内容参考官方3.2版本文档撰…

    Python 2023年11月2日
    052
  • python月球和地球体重_地球和月球围绕太阳运行,与Python玩游戏

    我想在pygame中用python代码使太阳系只有两个性质:地球绕太阳转,月球绕地球连续运行。这是我的代码:import sys, random, math import pyga…

    Python 2023年9月21日
    058
  • 手把手教你用Python做web疫苗登记系统

    我们采用flask来开发该系统,Flask 是一个使用 Python 编写的轻量级 Web 应用程序框架。该系统有一下功能: $ pip install Flask $ py -3…

    Python 2023年8月12日
    042
  • PyQt5滑块控制灰度图的二值化范围

    根据大家的要求,添加一些解释。 首先,PyqT5中自带滑块配件,分为水平方向和竖直方向两种滑块。有时候也叫拖动条,不管怎么说,就是能够滑动的条状部件。滑块的基本属性包括4个,分别是…

    Python 2023年8月26日
    044
  • 20多年老码农的IT学习之路

    20年IT工作经历,目前在一家500强做企业架构,年薪税前150万多.最近公司业绩不好,有感觉工作不保,所以又捡起了编程,开始学习Golang,Angular等。我不是985,21…

    Python 2023年11月4日
    049
  • 第5章 pandas入门

    整述:pandas是有使数据清洗和分析工作变得更快更简单的数据结构和操作工具。pandas经常和其它工具⼀同使用,如数值计算工具NumPy和SciPy,分析库statsmodels…

    Python 2023年8月6日
    070
  • Django模板系统

    Django模板系统 Django模板基本语法 Django模板系统主要涉及模板变量、过滤器、模板标签等。 模板变量形如{{ name}},{{}}内为一个变量名 过滤器主要是对模…

    Python 2023年8月6日
    059
  • python中scroll的用法_如何使用pygame.surface.scroll()?

    编辑:您的image和screen变量是向后的。我敢肯定,这也给你带来了一些困惑。。在 你的问题可能是你试图滚动一个全黑的背景。它可能是滚动的,你只是不知道,因为你用blit()在…

    Python 2023年9月23日
    046
  • Pandas学习笔记02 索引操作

    索引操作 前言 1.0 dataframe 数据 2.0 series对象取值 * 2.1 通过行索引取值 2.2 切片 2.3 高级索引 – 2.3.1 标签索引 2…

    Python 2023年8月22日
    079
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球