大家好,我是痞子衡,是正經(jīng)搞技術(shù)的痞子。今天痞子衡給大家分享的是MCUXpresso IDE下高度靈活的FreeMarker鏈接文件模板機(jī)制。
痞子衡之前寫過一篇文章 《MCUXpresso IDE下工程鏈接文件配置管理與自動(dòng)生成機(jī)制》,這篇文章介紹了 MCUXpresso IDE 在鏈接文件管理設(shè)計(jì)上跟其它 IDE(IAR/Keil)不一樣的地方,與 IAR/Keil 下用戶直接改寫鏈接文件去做個(gè)性化目標(biāo)鏈接(比如把某個(gè)源文件里全部代碼重定向鏈接到 RAM 里執(zhí)行)不同的是, MCUXpresso IDE 下用戶都是在圖形化配置界面里做對(duì)應(yīng)操作,然后 MCUXpresso IDE 會(huì)自動(dòng)生成相應(yīng)的鏈接文件(.ld)。但是圖性化操作界面里有時(shí)候不能百分百滿足用戶的個(gè)性化鏈接需求,這時(shí)候除了回退到 IAR/Keil 下那種傳統(tǒng)方式外,還有沒有其它方式呢?答案是有的,這就是今天要聊的 MCUXpresso IDE 下 FreeMarker 鏈接文件模板機(jī)制。
一、準(zhǔn)備工作
首先需要準(zhǔn)備好環(huán)境,包含必要的軟件,痞子衡的環(huán)境如下:
集成開發(fā)環(huán)境:MCUXpresso IDE_11.6.0_8187,點(diǎn)此下載
軟件開發(fā)包:SDK_2.12.1_EVK-MIMXRT1170(Toolchain需包含MCUXpresso IDE),點(diǎn)此下載
然后按照 《MCUXpresso IDE下將關(guān)鍵函數(shù)重定向到RAM中執(zhí)行的幾種方法》 文章 一、準(zhǔn)備工作 小節(jié)里改造下 evkmimxrt1170_hello_world_demo_cm7 示例工程選項(xiàng),并添加 critical_code.c 源文件。在這篇文章的 2.3 針對(duì)源文件中全部函數(shù) 小節(jié)里,痞子衡為了將 critical_code.c 里代碼全部鏈接到 DTCM,使用了回退到 IAR/Keil 那種傳統(tǒng)改寫鏈接文件的方式。今天我們就嘗試用 FreeMarker 鏈接文件模板機(jī)制這個(gè)特性來實(shí)現(xiàn)。
二、FreeMarker機(jī)制
FreeMarker 是一個(gè)模板引擎(更通俗的說法其實(shí)就是鏈接文本的生成器),它集成在 MCUXpresso IDE 內(nèi)部,由 MCUXpresso IDE 自動(dòng)調(diào)用。MCUXpresso IDE 下最終的鏈接文件其實(shí)是由這個(gè) FreeMarker 處理生成的。在 MCUXpresso IDE 軟件內(nèi)部有一組默認(rèn)的系統(tǒng)模板(也叫根模板),它還支持用戶提供的模板(這些模板均是用一種專用的語法 FTL 來描述的),所有適用工程的模板最終統(tǒng)一經(jīng)過 FreeMarker 來處理。
模板的設(shè)計(jì)是組件化的,這意味著用戶不需要編寫整個(gè)工程的模板,只需要加入指定的用戶模板實(shí)現(xiàn)個(gè)性化鏈接需求即可,其它部分仍由 MCUXpresso IDE 圖形配置界面完成。默認(rèn)情況下,用戶模板需要被放在指定的 user_project_root/linkscripts 目錄下(這個(gè)路徑不用額外添加進(jìn)工程選項(xiàng) C/C++ General Paths and Symbols Source Location 中)。
Note:更多 FreeMarker 細(xì)節(jié),可以參見 MCUXpressoIDE_11.6.0_8187MCUXpresso_IDE_User_Guide.pdf 文檔里的 17.14 FreeMarker Linker Script Templates 小節(jié)。
三、新方法解決問題
現(xiàn)在我們嘗試用 FreeMarker 特性來解決 critical_code.o 的鏈接需求。首先是在 MCUXpressoIDE_11.6.0_81874workspaceevkmimxrt1170_hello_world_demo_cm7 下創(chuàng)建一個(gè)名為 linkscripts 的文件夾(前面說了,這個(gè)新文件夾路徑不需要在工程選項(xiàng)里登記),然后在 linkscripts 里面新建如下三個(gè) .ldt 文件(固定文件名,由 FreeMarker 定死的):
bss.ldt data.ldt -- 作用是將 critical_code.o 放到指定 RAMx 區(qū)域 -- 備注:如果 MCU 僅一塊 RAM 空間,則此處應(yīng)為 main_data.ldt main_text.ldt -- 作用是將 critical_code.o 從 .text 段(默認(rèn)鏈接在 Flash 區(qū)域)移出來
main_text.ldt 內(nèi)容比較簡(jiǎn)單,僅僅是用于告訴 FreeMarker 不要將 critical_code.o 里的 text 段放進(jìn)主 .text 段里一起處理:
// 單目標(biāo)文件寫法 *(EXCLUDE_FILE(*critical_code.o) .text*) // 如果是多目標(biāo)文件,寫法可以這樣 *(EXCLUDE_FILE(*critical_code1.o *critical_code2.o) .text*)
data.ldt 中內(nèi)容比較關(guān)鍵,用于重置 critical_code.o 里的 text 段。這里需要注意的是如果是將該 text 放置進(jìn)主 RAM 區(qū)域(即工程選項(xiàng) MCU settings 里 Alias 名為 RAM 的空間),其寫法跟不放進(jìn)主 RAM 不一樣:
// 如果目標(biāo)文件放進(jìn)主 RAM - 正確寫法,等效于放進(jìn) memory.alias=="RAM" 或者 memory.name=="SRAM_DTC_cm7" 區(qū)域 *critical_code.o(.text*) // 如果目標(biāo)文件放進(jìn)主 RAM - 錯(cuò)誤寫法,實(shí)際不生效,等于沒有重置,代碼依舊放進(jìn) Flash 區(qū)域 <#if memory.alias=="RAM"> *critical_code.o(.text*) #if> // 如果目標(biāo)文件不是放進(jìn)主 RAM - 正確寫法1 <#if memory.name=="SRAM_ITC_cm7"> *critical_code.o(.text*) #if> // 如果目標(biāo)文件不是放進(jìn)主 RAM - 正確寫法2 <#if memory.alias=="RAM2"> *critical_code.o(.text*) #if> // 如果是多目標(biāo)文件,寫法可以這樣 <#if memory.name=="SRAM_ITC_cm7"> *critical_code1.o(.text*) *critical_code2.o(.text*) #if>
現(xiàn)在編譯工程查看映射文件,我們會(huì)發(fā)現(xiàn) critical_code.c 里全部函數(shù)都已經(jīng)鏈接在指定的 RAMx 區(qū)域了。如果你想更進(jìn)一步,把 critical_code.c 里全部 RO data 段都放進(jìn)指定 RAMx 區(qū)域,則需要再在 linkscripts 文件夾里增加一個(gè)名為 main_rodata.ldt 文件。其內(nèi)容如下,這里是告訴 FreeMarker 不要將 critical_code.o 里的 RO data 段放進(jìn)主 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鏈接文件模板機(jī)制痞子衡便介紹完畢了,掌聲在哪里~~~
審核編輯:湯梓紅
-
GCC
+關(guān)注
關(guān)注
0文章
108瀏覽量
24886 -
IDE
+關(guān)注
關(guān)注
0文章
341瀏覽量
46877 -
mcuxpresso
+關(guān)注
關(guān)注
1文章
41瀏覽量
4235
原文標(biāo)題:想要高度靈活的GCC鏈接文件模板?了解下FreeMarker機(jī)制
文章出處:【微信號(hào):pzh_mcu,微信公眾號(hào):痞子衡嵌入式】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論