你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32CubeIDE 实用技巧之 ld 链接文件

[复制链接]
STMCU小助手 发布时间:2022-8-7 13:59
前言
STM32CubeIDE 是 ST 推出的免费集成编译环境,基于 Eclipse 开源框架,集成了 GCC、GDB 等免费的编译器、链接器,支持 STM32 全系列芯片,可以创建 C/C++工程,支持调试、波形实时仿真、一键下载等。
在实际项目中,有时候需要对内存进行细分时,比如指定变量/函数/文件到特殊地址等等,KEIL 可以通过“*.sct”文件来实现;IAR 可以通过“*.icf”文件来实现;对于 STM32CubeIDE,可以通过“*.ld”链接文件来实现。
本文将介绍 GCC 的“*.ld”链接文件的常见用法,供大家参考使用。
基本概念
*.ld”链接文件组合了许多对象和归档文件,重新定位它们的数据并绑定符号引用。通常,编译程序的最后一步是运行“*.ld”链接文件。
通俗来讲,链接文件可以描述输入文件中的段,将其映射到输出文件中,并指定输出文件中的内存分配。
以下就是链接文件涉及到的相关概念:

内存(Memory)
语法
  1. MEMORY
  2. {
  3. name [(attr)] : ORIGIN = origin, LENGTH = len
  4. … }
复制代码


注释:这里的“attr”只能由以下特性组成:
‘R’ Read-only section
‘W’ -- Read/write section
‘X’ -- Executable section
‘A’ -- Allocatable section
‘I’ -- Initialized section
‘L’ -- Same as ‘I’
‘!’ -- Invert the sense of any of the attributes that follow

示例
  1. /* Memories definition */
  2. MEMORY
  3. {
  4. RAM (xrw) : ORIGIN = 0x20000300, LENGTH = 36K
  5. FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 128K
  6. }
复制代码

注释:
“xrw”表示“RAM”区是可读、可写和可执行的,且 RAM 的起始地址为“0x20000000”,长度为 36K。
“rx”表示“FLASH”区是可读和可执行的,FLASH 的起始地址为“0x08000000”,长度为 128K。

段(Section)
Section 有 loadable(可加载) 和 allocatable(可分配)两种类型。不可加载也不可分配的内存段,通常包含某些调试信息。
loadable(可加载)是指:程序运行时,该段内容应该被加载到内存中。
allocatable(可分配)是指:该段的内容应该被预留出,但不应该加载任何别的内容(某些情况下,这些内存必须归零)。
“可加载”和“可分配”的 section 都有两个地址:“VMA”和“LMA”。
VMA(the virtual memory address):这是运行输出文件时,该 section 的地址。VMA 是可选项,可以不设置。
LMA(load memory address):这是加载 section 时的地址。
在大多数情况下,这两个地址是相同的。当然也可以不相等,比如下面的例子就是 LMA 和 VMA 不同的案例:数据段被加载到 ROM 中,然后在程序启动时复制到 RAM 中(通常用于初始化全局变量)。此时 ROM 地址就是LMA,RAM 地址就是 VMA。

语法
  1. SECTIONS
  2. {
  3. section [address] [(type)] :
  4. {
  5. [AT(lma)]
  6. [ALIGN(section_align) | ALIGN_WITH_INPUT]
  7. [SUBALIGN(subsection_align)]
  8. [constraint] {
  9. output-section-command
  10. output-section-command
  11. ...
  12. } [>region] [AT>lma_region] [:phdr :phdr ...] [=fillexp] [,]
  13. ...
  14. }
复制代码

注释:大多数的段仅使用了上述的一部分属性。

示例
  1. /* Sections */
  2. SECTIONS
  3. {
  4. /* The startup code into "FLASH" Rom type memory */
  5. .isr_vector :
  6. {
  7. . = ALIGN(4);
  8. KEEP(*(.isr_vector)) /* Startup code */
  9. . = ALIGN(4);
  10. } >FLASH
  11. /* Initialized data sections into "RAM" Ram type memory */
  12. .data :
  13. {
  14. . = ALIGN(4);
  15. _sdata = .; /* create a global symbol at data start */
  16. *(.data) /* .data sections */
  17. *(.data*) /* .data* sections */
  18. . = ALIGN(4);
  19. _edata = .; /* define a global symbol at data end */

  20. } >RAM AT> FLASH
  21. }
复制代码

注释:上述示例中“.isr_vector”的 LMA 与 VMA 是相等的。“
.data”因为有“>RAM AT> FLASH”的修饰,表示.data 段的 VMA 为 RAM,LMA 为 FLASH。即.data 段的内容会放在 FLASH 中,但是运行时,会加载到 RAM 中。

完整版请查看:附件



LAT0816_STM32CubeIDE实用技巧之ld链接文件_v1.0.pdf

下载

398.99 KB, 下载次数: 45

收藏 评论0 发布时间:2022-8-7 13:59

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版