痞子衡嵌入式:MCUXpresso IDE下高度靈活的FreeMarker鏈接文件模板機制

来源:https://www.cnblogs.com/henjay724/archive/2022/11/26/16928122.html
-Advertisement-
Play Games

大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家分享的是MCUXpresso IDE下高度靈活的FreeMarker鏈接文件模板機制。 痞子衡之前寫過一篇文章 《MCUXpresso IDE下工程鏈接文件配置管理與自動生成機制》,這篇文章介紹了 MCUXpresso IDE 在鏈接文件管理設 ...



  大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家分享的是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主頁知乎主頁微信公眾號 平臺上。

微信搜索"痞子衡嵌入式"或者掃描下麵二維碼,就可以在手機上第一時間看了哦。

  最後歡迎關註痞子衡個人微信公眾號【痞子衡嵌入式】,一個專註嵌入式技術的公眾號,跟著痞子衡一起玩轉嵌入式。

痞子衡嵌入式-微信二維碼 痞子衡嵌入式-微信收款二維碼 痞子衡嵌入式-支付寶收款二維碼

  衡傑(痞子衡),目前就職於恩智浦MCU系統部門,擔任嵌入式系統應用工程師。

  專欄內所有文章的轉載請註明出處:http://www.cnblogs.com/henjay724/

  與痞子衡進一步交流或咨詢業務合作請發郵件至 [email protected]

  可以關註痞子衡的Github主頁 https://github.com/JayHeng,有很多好玩的嵌入式項目。

  關於專欄文章有任何疑問請直接在博客下麵留言,痞子衡會及時回覆免費(劃重點)答疑。

  痞子衡郵箱已被私信擠爆,技術問題不推薦私信,堅持私信請先掃碼付款(5元起步)再發。



您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Spring Boot 3.0 正式發佈 大家好,我是棧長。 Spring Boot 3.0 正式發佈了: 同時發佈更新的還有 2.7.x 和 2.6.x 兩條版本線,Spring Boot 是我見過的發版最守時的技術框架之一。 Spring Boot 3.0 這是一個重大的主版本更新,距離上一代的 ...
  • 本文主要跟隨Datawhale的學習路線以及內容教程,詳細介紹了集成學習常見的多個演算法的基於sklearn的實現過程,同時還有兩個案例,內容豐富。 ...
  • 1、流程圖 1.1 數據預熱 1.2 搶購 1.3 生成訂單 (發送訂單消息) 1.4 訂單入庫 (監聽 消費訂單消息) 1.5 查看訂單狀態 1.6 支付 (獲取支付鏈接 ) 1.7 支付成功 微信回調 (發送 支付成功消息) 1.8 支付成功 返回給前端成功 (監聽 支付成功消息) 2、incr ...
  • 首先接到這個任務,發現nginx的日誌限制更多的都是在Linux下做的,找了半天,也沒找到能直接通過nginx.conf更改體現到日誌限制上的。 最後決定直接通過bat腳本,來對nginx的日誌進行分割和刪除。 至於需要誰來執行bat腳本,大家可以根據自己的業務需求來操作,比如: 1.通過系統的任務 ...
  • 聲明 本文章中所有內容僅供學習交流使用,不用於其他任何目的,不提供完整代碼,抓包內容、敏感網址、數據介面等均已做脫敏處理,嚴禁用於商業用途和非法用途,否則由此產生的一切後果均與作者無關! 本文章未經許可禁止轉載,禁止任何修改後二次傳播,擅自使用本文講解的技術而導致的任何意外,作者均不負責,若有侵權, ...
  • 繼上篇文章(EF Core懶人小技巧之拒絕DbSet)之後,最近筆者把這個小功能單獨封裝成一個擴展方法並開源,歡迎交流和Star~ GitHub: EntityFrameworkCore.Extension.AutoMapping Nuget:EntityFrameworkCore.Extensio ...
  • title: c# GameDesigner2 description: published: true date: 2022-10-05T12:14:46.146Z tags: editor: markdown dateCreated: 2022-10-05T07:57:15.455Z # 地址 ...
  • 一:背景 1.講故事 前段時間分析了一個dump,一頓操作之後,我希望用外力來阻止程式內部對某一個com組件的調用,對,就是想藉助外力實現,如果用 windbg 的話,可以說非常輕鬆,但現實情況比較複雜,客戶機沒有windbg,也不想加入任何的手工配置,希望全自動化來處理。 真的很無理哈。。。不過這 ...
一周排行
    -Advertisement-
    Play Games
  • 1.部署歷史 猿友們好,作為初來實習的我,已經遭受社會的“毒打”,所以請容許我在下麵環節適當吐槽,3Q! 傳統部署 ​ 回顧以往在伺服器部署webapi項目(非獨立發佈),dotnet環境、守護進程兩個逃都逃不掉,正常情況下還得來個nginx代理。不僅僅這仨,可能牽扯到yum或npm。node等都要 ...
  • 隨著技術的進步,跨平臺開發已經成為了標配,在此大背景下,ASP.NET Core也應運而生。本文主要基於ASP.NET Core+Element+Sql Server開發一個校園圖書管理系統為例,簡述基於MVC三層架構開發的常見知識點,前一篇文章,已經簡單介紹瞭如何搭建開發框架,和登錄功能實現,本篇... ...
  • 這道題只要會自定義cmp恰當地進行排序,其他部分沒有什麼大問題。 上代碼: 1 #include<bits/stdc++.h> 2 using namespace std; 3 int n,s,h1,h2,cnt; 4 struct apple{ 5 int height,ns;//height為蘋 ...
  • 這篇文章主要描述RPC的路由策略,包括為什麼需要請求隔離,為什麼不在註冊中心中實現請求隔離以及不同粒度的路由策略。 ...
  • 簡介: 中介者模式,屬於行為型的設計模式。用一個中介對象來封裝一系列的對象交互。中介者是各對象不需要顯式地相互引用,從而使其耦合鬆散,而且可以獨立地改變他們之間的交互。 適用場景: 如果平行對象間的依賴複雜,可以使用中介者解耦。 優點: 符合迪米特法則,減少成員間的依賴。 缺點: 不適用於系統出現對 ...
  • 【前置內容】Spring 學習筆記全系列傳送門: Spring學習筆記 - 第一章 - IoC(控制反轉)、IoC容器、Bean的實例化與生命周期、DI(依賴註入) Spring學習筆記 - 第二章 - 註解開發、配置管理第三方Bean、註解管理第三方Bean、Spring 整合 MyBatis 和 ...
  • 簡介: 享元模式,屬於結構型的設計模式。運用共用技術有效地支持大量細粒度的對象。 適用場景: 具有相同抽象但是細節不同的場景中。 優點: 把公共的部分分離為抽象,細節依賴於抽象,符合依賴倒轉原則。 缺點: 增加複雜性。 代碼: //用戶類 class User { private $name; fu ...
  • 這次設計一個通用的多位元組SPI介面模塊,特點如下: 可以設置為1-128位元組的SPI通信模塊 可以修改CPOL、CPHA來進行不同的通信模式 可以設置輸出的時鐘 狀態轉移圖和思路與多位元組串口發送模塊一樣,這裡就不給出了,具體可看該隨筆。 一、模塊代碼 1、需要的模塊 通用8位SPI介面模塊 `tim ...
  • AOP-03 7.AOP-切入表達式 7.1切入表達式的具體使用 1.切入表達式的作用: 通過表達式的方式定義一個或多個具體的連接點。 2.語法細節: (1)切入表達式的語法格式: execution([許可權修飾符] [返回值類型] [簡單類名/全類名] [方法名]([參數列表]) 若目標類、介面與 ...
  • 測試一、虛繼承與繼承的區別 1.1 單個繼承,不帶虛函數 1>class B size(8): 1> + 1> 0 | + (base class A) 1> 0 | | _ia //4B 1> | + 1> 4 | _ib //4B 有兩個int類型數據成員,占8B,基類邏輯存在前面 1.2、單個 ...