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

    文章

    8739

    浏览量

    363369
  • FlaSh
    +关注

    关注

    10

    文章

    1573

    浏览量

    147028
  • GCC
    GCC
    +关注

    关注

    0

    文章

    105

    浏览量

    24743
  • 编译器
    +关注

    关注

    1

    文章

    1588

    浏览量

    48797
收藏 人收藏

    评论

    相关推荐

    如何使用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的外设中配置USB?

    我必须在 MCUxpresso IDE 中使用 LPC54113 实现 USB 协议代码。请提供以下详细信息,1. 如何在 MCUxpresso IDE 的外设中
    发表于 04-04 06:22

    如何在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>大全

    在MPLAB® X IDE自动生成配置位代码

    在我们日常接触到的PIC®单片机用户中,有些用户经常会遇到如何在项目程序中编写配置位设置代码的问题。所以这里向大家介绍一下使用MPLAB® X IDE自动
    的头像 发表于 06-07 13:46 4792次阅读

    MCUXpresso IDE在Flash调试的注意事项

    大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是 MCUXpresso IDE 下使用 J-Link 下载算法在 Flash 调试注意事项。 介绍一下如何使用新
    的头像 发表于 12-23 13:53 826次阅读

    不同IDE下应用程序RW段分散链接的方法~

    今天痞子衡给大家介绍的是MCUXpresso IDE下将应用程序RW段分散链接的几种方法。早期的 MCU 芯片,一般都会嵌入内部 Flash 和 RAM,并且 Flash 和 RAM
    发表于 12-07 13:21 9次下载
    不同<b class='flag-5'>IDE</b>下应用程序RW段分散<b class='flag-5'>链接</b>的方法~

    MCUXpresso IDE生成镜像文件的方法

    我们先来看看MCUXpress以外的其它IDE下是如何生成各种格式镜像文件的。我们以 SDK_2.11.1_MIMXRT1170-EVKoardsevkmimxrt1170demo_appshello_worldcm7 目录下
    的头像 发表于 10-20 09:16 1254次阅读

    三种常用IDE下花式生成镜像文件的方法

    大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家分享的是MCUXpresso IDE生成镜像文件的方法及其与IAR,MDK差异。
    的头像 发表于 10-24 14:08 1098次阅读

    想要高度灵活的GCC链接文件模板?了解下FreeMarker机制

    大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家分享的是MCUXpresso IDE下高度灵活的FreeMarker链接文件模板机制
    的头像 发表于 12-16 10:28 427次阅读

    MCUXpresso配置工具快速入门指南

    要编译生成的代码,需要MCUXpresso SDK包。您可以从http下载SDK包://SDK包包含许多示例项目,可以帮助您入门。MCUXpresso配置工具是通用的,旨在帮助硬件设计
    发表于 12-19 14:06 2次下载

    MCUXpresso IDE生成镜像文件的方法及其与IAR,MDK差异

    MCUXpresso IDE生成镜像文件的方法及其与IAR,MDK差异
    的头像 发表于 09-28 17:05 651次阅读
    <b class='flag-5'>MCUXpresso</b> <b class='flag-5'>IDE</b>下<b class='flag-5'>生成</b>镜像<b class='flag-5'>文件</b>的方法及其与IAR,MDK差异