0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

MCUXpresso IDE下工程鏈接文件配置管理與自動生成機(jī)制介紹

冬至子 ? 來源:痞子衡嵌入式 ? 作者:痞子衡 ? 2022-11-17 10:41 ? 次閱讀

系統(tǒng)地介紹了 ARM Cortex-M 內(nèi)核微控制器開發(fā)過程中所要了解的主要文件類型:源文件、鏈接文件、工程文件、可重定向文件、映射文件、可執(zhí)行文件、反匯編文件、鏡像文件。

上述 8 種文件中,大家對源文件、工程文件以及鏡像文件這三種應(yīng)該是最熟悉的,而其余文件類型,很多人應(yīng)該都沒有深入研究過,但痞子衡一直認(rèn)為只有深入了解了鏈接文件才算是真正步入嵌入式開發(fā)老手行列。

我們知道不同 IDE 下鏈接文件語法是不一樣的,而恩智浦 MCUXpresso IDE 底層編譯器是 Arm GCC,因此其鏈接文件就是標(biāo)準(zhǔn) GCC 下 .ld 文件。如果你對 .ld 文件語法非常精通,當(dāng)然可以自己從頭開始寫鏈接文件,如果不太熟的話,也不要緊張,MCUXpresso IDE 早就為你掃清了障礙,在這個 IDE 下能夠支持圖形界面里做鏈接配置,然后自動生成相應(yīng)鏈接文件的。今天痞子衡就和大家聊聊這個特性:

一、準(zhǔn)備開發(fā)環(huán)境

首先需要準(zhǔn)備好環(huán)境,包含必要的軟件,痞子衡的環(huán)境如下:

集成開發(fā)環(huán)境:MCUXpresso IDE_11.4.0_6224,點此下載

軟件開發(fā)包:SDK_2.10.0_EVK-MIMXRT1170(Toolchain需包含MCUXpresso IDE),點此下載

二、MCUXpresso IDE下鏈接文件配置

現(xiàn)在進(jìn)入正題,我們先從 SDK 包里導(dǎo)入生成一個工程(就選最簡單的 hello_world 吧)。工程導(dǎo)入成功后,會在 \\MCUXpressoIDE_11.4.0_6224\\workspace\\evkmimxrt1170_hello_world_demo_cm7 下看到 .project 工程文件,在 MCUXpresso IDE 下打開這個工程。

2.1 Memory 空間定義

在工程名上右擊選擇 Properties 進(jìn)入選項配置界面,其中 MCU settings 一欄里定義的就是 MCU 實際存儲空間,這是鏈接文件的空間分配基礎(chǔ),我們后面會將程序里全部的段都鏈接在這些區(qū)域里。

存儲空間屬性(Type)分為兩類:一類是 Flash(存放 RO 段),一類是 RAM(存放 RW 段)。每個屬性的空間都可以被定義很多個,但其中僅 Alias 名為 Flash 和 RAM 的空間才是默認(rèn)被選中用于鏈接程序段的(可通過上下移動按鈕將指定空間調(diào)整到前排 Flash 和 RAM 的位置)。

圖片

2.2 默認(rèn)程序段分配

還是在上一節(jié)打開的 Properties 選項配置界面,其中 Settings / Managed Linker Script 頁面就是鏈接文件里具體程序段鏈接設(shè)置,這個頁面的最上面 Manage linker script 要保持勾選,勾選上則代表使用 IDE 的鏈接文件自動生成功能。

在一個具體應(yīng)用程序項目工程里,如果源文件僅包含標(biāo)準(zhǔn) C 和匯編代碼,那么程序段會被默認(rèn)歸納為三大類:RO 段(函數(shù)代碼,常量,全局變量初值等),RW 段(全局變量,重定向到 RAM 中函數(shù)代碼等),Heap/Stack。IDE 里分別提供了這三類程序段的空間指定:

1. Link application to RAM 勾選框:
    - 不勾選,則 RO 段放在 2.1 節(jié)圖中 Alias 名為 Flash 的空間里
    - 勾選上,則 RO 段放在 2.1 節(jié)圖中 Alias 名為 RAM 的空間里
2. Heap and Stack placement 配置框:
    - 可以按需調(diào)整 Heap/Stack 里的 Region,Location,Size,其中 Region 可以是 2.1 節(jié)圖中屬性為 RAM 的任意空間
    - Heap/Stack 默認(rèn)大小均為 4KB,放在 2.1 節(jié)圖中 Alias 名為 RAM 的空間里
3. Global data placement 下拉框:
    - 可以按需鏈接 RW 段到 2.1 節(jié)圖中屬性為 RAM 的任意空間
    - RW 段默認(rèn)放在 2.1 節(jié)圖中 Alias 名為 RAM 的空間里

圖片

2.3 自定義程序段分配

除了上一節(jié)鏈接器默認(rèn)的程序段名外,我們也可以自定義一些用戶段名,方便一些特殊代碼處理。這里需要使用 ** attribute ((section("UserSectionName")))** 鏈接器語法來修飾指定函數(shù)/變量,這樣該函數(shù)/變量就會被放在 UserSectionName 段里,然后我們在上一節(jié)圖中鏈接設(shè)置框的最后 Extra linker script input sections 框里單獨(dú)為自定義 UserSectionName 段指定鏈接空間。

比如工程 clock_config.c 文件里如下函數(shù) UpdateSemcClock(),這個函數(shù)在默認(rèn)的 RO .text 段里,RO 段都是鏈接在 Flash 里的,但是我們希望將這個函數(shù)重定向到 ITCM 里執(zhí)行,所以我們可以使用 attribute ((section("CodeQuickAccess"))) 鏈接器語法來修飾這個函數(shù),然后在 Extra linker script input sections 框里將 CodeQuickAccess 段放到 SRAM_ITC_cm7 空間里即可。

#define AT_QUICKACCESS_SECTION_CODE(func) __attribute__((section("CodeQuickAccess"), __noinline__)) func
#define AT_QUICKACCESS_SECTION_DATA(func) __attribute__((section("DataQuickAccess"))) func

AT_QUICKACCESS_SECTION_CODE(void UpdateSemcClock(void));
void UpdateSemcClock(void)
{
    SEMC->IPCMD = 0xA55A000D;
    while ((SEMC->INTR & 0x3) == 0);
    SEMC->INTR                                = 0x3;
    SEMC->DCCR                                = 0x0B;
    CCM->CLOCK_ROOT[kCLOCK_Root_Semc].CONTROL = 0x602;
}

2.4 自動生成的鏈接文件

鏈接設(shè)置完成后,會在工程目錄 \\MCUXpressoIDE_11.4.0_6224\\workspace\\evkmimxrt1170_hello_world_demo_cm7\\Debug 下自動生成最終鏈接文件(假定用得 debug build),文件一共有三個,其中 evkmimxrt1170_hello_world_demo_cm7_Debug.ld 是主鏈接文件,感興趣的可以打開這個鏈接文件學(xué)習(xí)一下(如果看不懂語法可以結(jié)合這篇文章 https://www.embedded.com/building-bare-metal-arm-systems-with-gnu-part-3/ )。

圖片

2.5 查看Map文件確認(rèn)

按照 2.1 節(jié)和 2.2 節(jié) 圖中的鏈接設(shè)置,我們編譯鏈接 evkmimxrt1170_hello_world_demo_cm7 工程可以得到如下鏈接結(jié)果,從空間占用上來看是符合預(yù)期的。

圖片

現(xiàn)在我們可以打開生成的 evkmimxrt1170_hello_world_demo_cm7.map 文件具體分析一下最終鏈接情況,痞子衡摘錄了最核心部分如下:

Memory Configuration
Name             Origin        Length             Attributes
/------------------------------------------------------------/
// RO .text 段在           BOARD_FLASH:0x30000000 - 0x30006eaf,共 28336 個字節(jié)
// RO CodeQuickAccess 段在 BOARD_FLASH:0x30006eb0 - 0x30006ee7,共 56 個字節(jié)
// RO .data_init 段在      BOARD_FLASH:0x30006ee8 - 0x30006eeb,共 4 個字節(jié)
.boot_hdr       0x30000000     0x2000
.text           0x30002000     0x4eb0

// RW CodeQuickAccess 段在 SRAM_ITC_cm7:0x00000000 - 0x00000037,共 56 個字節(jié)
.data_RAM4      0x00000000       0x38 load address 0x30006eb0
 CodeQuickAccess
                0x00000000       0x38 ./board/clock_config.o
                0x00000000                UpdateSemcClock

// RW .data 段在           BOARD_SDRAM:0x80000000 - 0x80000003,共 4 個字節(jié)
.data           0x80000000        0x4 load address 0x30006ee8
 .data.SystemCoreClock
                0x80000000        0x4 ./device/system_MIMXRT1176_cm7.o

// RW .bss 段在            BOARD_SDRAM:0x80000004 - 0x80000107,共 260 個字節(jié)
.bss            0x80000004      0x104

// Heap 在                 BOARD_SDRAM:0x80000108 - 0x80001107,共 4KB
.heap           0x80000108     0x1000

// Stack 在                BOARD_SDRAM:0x82fff000 - 0x82ffffff,共 4KB
.stack          0x82fff000        0x0
                0x82fff000                _vStackBase = .
                0x82fff000                . = ALIGN (0x4)
                0x83000000                _vStackTop = (. + _StackSize)

簡單總結(jié)下,RO 段一般從 Flash 的最前面開始鏈接的,.text 段在最前面,然后是 ramfunc 函數(shù)實體,最后是 .data_init 段(全局變量初值)。RW 段也是從 RAM 的最前面開始鏈接,.data 段在前,.bss 在后,然后是 Heap 和 Stack(Heap/Stack的具體位置是可以設(shè)置的,有 Start、End、Post Data 三種選擇)。

三、MCUXpresso IDE下鏈接小實驗

根據(jù)上面的知識,我們現(xiàn)在來做些鏈接設(shè)置小實驗,在做實驗前,我們調(diào)整下 Memory 定義,把 SDRAM 相關(guān)空間移到后面去,默認(rèn) RAM 用 SRAM_DTC_cm7 空間,這樣看起來習(xí)慣一點。

圖片

3.1 默認(rèn) XiP 鏈接

調(diào)整過 Memory 空間順序后的鏈接結(jié)果如下:

圖片

3.2 Non-XiP 鏈接

現(xiàn)在我們嘗試使能 Link application to RAM 選項,其余不變,此時可以看到 28396 Bytes 的 RO 段也到了 SRAM_DTC_cm7 空間里,BOARD_FLASH 空間完全沒有任何占用:

圖片

3.3 XiP 鏈接,調(diào)整 Stack 大小并放置到 OCRAM1

我們嘗試調(diào)整 Stack 大小到 1KB 并放置到 SRAM_OC1,其余不變,此時可以看到 SRAM_DTC_cm7 空間消耗相比 3.1 節(jié)里少了 4KB,但 SRAM_OC1 空間消耗多了 1KB:

圖片

3.4 XiP 鏈接,調(diào)整 RW 段到 OCRAM2

我們嘗試調(diào)整 RW 段到 SRAM_OC2,其余不變,此時可以看到 SRAM_DTC_cm7 空間消耗相比 3.1 節(jié)里少了 264 Bytes,但 SRAM_OC2 空間消耗多了 264 Bytes:

圖片

至此,MCUXpresso IDE下工程鏈接文件配置管理與自動生成機(jī)制便介紹完畢了。

審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • ARM
    ARM
    +關(guān)注

    關(guān)注

    134

    文章

    8967

    瀏覽量

    365052
  • FlaSh
    +關(guān)注

    關(guān)注

    10

    文章

    1598

    瀏覽量

    147339
  • GCC
    GCC
    +關(guān)注

    關(guān)注

    0

    文章

    105

    瀏覽量

    24781
  • 編譯器
    +關(guān)注

    關(guān)注

    1

    文章

    1602

    瀏覽量

    48896
收藏 人收藏

    評論

    相關(guān)推薦

    如何使用MDK/MCUXpresso IDE/IAR工具編譯生成燒錄固件文件

    使用MDK/MCUXpresso IDE/IAR工具編譯生成燒錄固件文件。使用MCU BootUtility來加載hex文件或者bin
    發(fā)表于 11-04 06:55

    mcuxpresso ide生成文件錯誤的原因?

    mcuxpresso ide生成文件錯誤
    發(fā)表于 04-04 06:58

    如何在MCUXpresso IDE生成.bin文件?

    是盟友,我們在哪里閃存代碼 0x00000000?,0x60000000 我們?nèi)绾卧?MCUXpresso IDE生成 .bin 文件
    發(fā)表于 04-26 06:55

    基于CVS的OPNET模型配置管理研究

    在分析OPNET模型開發(fā)配置管理需求的基礎(chǔ)上,通過分析流行的配置管理工具,選擇CVS作為合適的配置管理工具,詳細(xì)介紹了基于CVS的OPNET模型配置
    發(fā)表于 11-17 11:39 ?0次下載

    Saltstack配置管理大全

    Saltstack配置管理大全
    發(fā)表于 09-08 09:01 ?9次下載
    Saltstack<b class='flag-5'>配置管理</b>大全

    基于SVN軟件配置管理及持續(xù)集成

    SVN是一款廣泛使用的配置管理工具,適合中小型軟件團(tuán)隊使用。本文敘述了SVN的特點,介紹配置管理的基本概念和相關(guān)角色:詳細(xì)介紹了基于SVN的軟件
    發(fā)表于 11-07 17:50 ?6次下載
    基于SVN軟件<b class='flag-5'>配置管理</b>及持續(xù)集成

    MCUXpresso IDE在Flash調(diào)試的注意事項

    大家好,我是痞子衡,是正經(jīng)搞技術(shù)的痞子。今天痞子衡給大家介紹的是 MCUXpresso IDE 下使用 J-Link 下載算法在 Flash 調(diào)試注意事項。 介紹一下如何使用新
    的頭像 發(fā)表于 12-23 13:53 ?924次閱讀

    淺述OpenHarmony HDF 配置管理分析及使用

    進(jìn)行配置管理。 ? HC-GEN(HDF Configuration Generator)是 HCS 配置轉(zhuǎn)換工具,可以將 HDF 配置文件轉(zhuǎn)換為軟件可讀取的文件格式: 在弱性能環(huán)境中
    的頭像 發(fā)表于 09-22 14:45 ?3914次閱讀
    淺述OpenHarmony HDF <b class='flag-5'>配置管理</b>分析及使用

    MCUXpresso IDE生成鏡像文件的方法

    我們先來看看MCUXpress以外的其它IDE下是如何生成各種格式鏡像文件的。我們以 SDK_2.11.1_MIMXRT1170-EVKoardsevkmimxrt1170demo_appshello_worldcm7 目錄下
    的頭像 發(fā)表于 10-20 09:16 ?1369次閱讀

    三種常用IDE下花式生成鏡像文件的方法

    大家好,我是痞子衡,是正經(jīng)搞技術(shù)的痞子。今天痞子衡給大家分享的是MCUXpresso IDE生成鏡像文件的方法及其與IAR,MDK差異。
    的頭像 發(fā)表于 10-24 14:08 ?1307次閱讀

    想要高度靈活的GCC鏈接文件模板?了解下FreeMarker機(jī)制

    大家好,我是痞子衡,是正經(jīng)搞技術(shù)的痞子。今天痞子衡給大家分享的是MCUXpresso IDE下高度靈活的FreeMarker鏈接文件模板機(jī)制
    的頭像 發(fā)表于 12-16 10:28 ?505次閱讀

    MCUXpresso配置工具快速入門指南

    要編譯生成的代碼,需要MCUXpresso SDK包。您可以從http下載SDK包://SDK包包含許多示例項目,可以幫助您入門。MCUXpresso配置工具是通用的,旨在幫助硬件設(shè)計
    發(fā)表于 12-19 14:06 ?2次下載

    MCUXpresso IDE生成鏡像文件的方法及其與IAR,MDK差異

    MCUXpresso IDE生成鏡像文件的方法及其與IAR,MDK差異
    的頭像 發(fā)表于 09-28 17:05 ?747次閱讀
    <b class='flag-5'>MCUXpresso</b> <b class='flag-5'>IDE</b>下<b class='flag-5'>生成</b>鏡像<b class='flag-5'>文件</b>的方法及其與IAR,MDK差異

    如何在MCUXpresso IDE中測量能耗?

    如何在MCUXpresso IDE中測量能耗?
    的頭像 發(fā)表于 09-19 16:40 ?461次閱讀
    如何在<b class='flag-5'>MCUXpresso</b> <b class='flag-5'>IDE</b>中測量能耗?

    民機(jī)機(jī)載軟件的配置管理

    配置管理(Configuration Management)在航空領(lǐng)域經(jīng)常又稱為構(gòu)型管理,是現(xiàn)代復(fù)雜產(chǎn)品研制的核心技術(shù)。與很多傳統(tǒng)觀念中配置管理是對文檔和版本的簡單管理不同,現(xiàn)代復(fù)雜產(chǎn)
    的頭像 發(fā)表于 12-01 16:15 ?661次閱讀
    民機(jī)機(jī)載軟件的<b class='flag-5'>配置管理</b>