在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

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

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

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

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

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

一、準備開發環境

首先需要準備好環境,包含必要的軟件,痞子衡的環境如下:

集成開發環境:MCUXpresso IDE_11.4.0_6224,點此下載

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

二、MCUXpresso IDE下鏈接文件配置

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

2.1 Memory 空間定義

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

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

圖片

2.2 默認程序段分配

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

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

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

圖片

2.3 自定義程序段分配

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

比如工程 clock_config.c 文件里如下函數 UpdateSemcClock(),這個函數在默認的 RO .text 段里,RO 段都是鏈接在 Flash 里的,但是我們希望將這個函數重定向到 ITCM 里執行,所以我們可以使用 attribute ((section("CodeQuickAccess"))) 鏈接器語法來修飾這個函數,然后在 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 自動生成的鏈接文件

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

圖片

2.5 查看Map文件確認

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

圖片

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

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

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

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

// RW .bss 段在            BOARD_SDRAM:0x80000004 - 0x80000107,共 260 個字節
.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)

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

三、MCUXpresso IDE下鏈接小實驗

根據上面的知識,我們現在來做些鏈接設置小實驗,在做實驗前,我們調整下 Memory 定義,把 SDRAM 相關空間移到后面去,默認 RAM 用 SRAM_DTC_cm7 空間,這樣看起來習慣一點。

圖片

3.1 默認 XiP 鏈接

調整過 Memory 空間順序后的鏈接結果如下:

圖片

3.2 Non-XiP 鏈接

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

圖片

3.3 XiP 鏈接,調整 Stack 大小并放置到 OCRAM1

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

圖片

3.4 XiP 鏈接,調整 RW 段到 OCRAM2

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

圖片

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

審核編輯:劉清

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • ARM
    ARM
    +關注

    關注

    134

    文章

    9176

    瀏覽量

    369297
  • FlaSh
    +關注

    關注

    10

    文章

    1644

    瀏覽量

    148710
  • GCC
    GCC
    +關注

    關注

    0

    文章

    108

    瀏覽量

    24890
  • 編譯器
    +關注

    關注

    1

    文章

    1642

    瀏覽量

    49301
收藏 人收藏

    評論

    相關推薦

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

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

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

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

    如何在MCUXpresso IDE生成.bin文件

    是盟友,我們在哪里閃存代碼 0x00000000?,0x60000000 我們如何在 MCUXpresso IDE生成 .bin 文件
    發表于 04-26 06:55

    如何通過make將項目從MCUxpresso IDE轉換為在GNU GCC上運行?

    我采用了一個使用 MCUxpresso IDE 設置的項目,并使用自動生成的 make 文件通過命令行簡單地運行“make all”命令。使
    發表于 05-06 07:20

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

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

    Saltstack配置管理大全

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

    基于SVN軟件配置管理及持續集成

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

    MCUXpresso IDE在Flash調試的注意事項

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

    MCUXpresso IDE生成鏡像文件的方法

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

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

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

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

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

    MCUXpresso配置工具快速入門指南

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

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

    MCUXpresso IDE生成鏡像文件的方法及其與IAR,MDK差異
    的頭像 發表于 09-28 17:05 ?900次閱讀
    <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中測量能耗?
    的頭像 發表于 09-19 16:40 ?620次閱讀
    如何在<b class='flag-5'>MCUXpresso</b> <b class='flag-5'>IDE</b>中測量能耗?

    民機機載軟件的配置管理

    配置管理(Configuration Management)在航空領域經常又稱為構型管理,是現代復雜產品研制的核心技術。與很多傳統觀念中配置管理是對文檔和版本的簡單管理不同,現代復雜產
    的頭像 發表于 12-01 16:15 ?939次閱讀
    民機機載軟件的<b class='flag-5'>配置管理</b>
    主站蜘蛛池模板: 欧美系列在线 | 国产成人精品视频一区二区不卡 | 十三以下岁女子毛片免费播放 | 黄色美女网址 | 4hc44四虎www亚洲| 一区二区在线免费观看 | 狠狠燥 | 午夜免费啪视频 | 天天综合网天天综合色 | 精品久久久久久久久久 | 国产成人悠悠影院 | 成人五级毛片免费播放 | 免费拍拍视频 | 四虎影音在线观看 | a爱视频 | 第四色亚洲 | 直接看黄的网站 | 在线播放网址 | 激情综合五月亚洲婷婷 | 久久精品男人影院 | 男人天堂资源网 | 亚洲韩国在线一卡二卡 | 男女爱爱免费视频 | 在线天堂中文新版www | 国产毛片农村妇女aa板 | 欧美亚洲网站 | 午夜8050| 宅男午夜 | 6080午夜 | 手机免费在线视频 | 1000部禁片黄的免费看 | 久久综合九色综合欧美狠狠 | 日韩免费三级电影 | 波多野结衣在线一区 | 久久vs国产综合色大全 | 国产美女叼嘿视频免费看 | 福利视频一区二区三区 | 男啪女色黄无遮挡免费观看 | 色综合久久网女同蕾丝边 | 天天天天天天操 | 精品视频一区二区三区四区五区 |