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

STM32CubeIDE 实用技巧之 ld 链接文件

[复制链接]
STMCU小助手 发布时间:2022-8-7 13:59
前言 ! w7 e, n% T8 p7 S& s. W
STM32CubeIDE 是 ST 推出的免费集成编译环境,基于 Eclipse 开源框架,集成了 GCC、GDB 等免费的编译器、链接器,支持 STM32 全系列芯片,可以创建 C/C++工程,支持调试、波形实时仿真、一键下载等。
# y7 i2 o/ n2 j- ?在实际项目中,有时候需要对内存进行细分时,比如指定变量/函数/文件到特殊地址等等,KEIL 可以通过“*.sct”文件来实现;IAR 可以通过“*.icf”文件来实现;对于 STM32CubeIDE,可以通过“*.ld”链接文件来实现。
! B: x( T. d6 y( g1 ~本文将介绍 GCC 的“*.ld”链接文件的常见用法,供大家参考使用。
& P: W8 m2 p3 f) d  X' @
基本概念
3 b- G% b" v  o. O5 H“*.ld”链接文件组合了许多对象和归档文件,重新定位它们的数据并绑定符号引用。通常,编译程序的最后一步是运行“*.ld”链接文件。
; x6 o- h+ _2 w  Q通俗来讲,链接文件可以描述输入文件中的段,将其映射到输出文件中,并指定输出文件中的内存分配。- p  z9 Y% ]3 ~& v' e) y  d
以下就是链接文件涉及到的相关概念:3 q: p0 x  I+ k+ O  D. {
8 n, z" i& V( B1 ^$ D8 S9 M. d  ~
内存(Memory) : F; S7 ^$ F$ v$ o4 O3 X& ^4 x
语法:
. ~" C2 D! z) |! s* g) F6 a# k
  1. MEMORY
    . [& Q) ~8 [5 L4 u/ z: k# d
  2. {" i7 t  }0 e- ^. p) `  l
  3. name [(attr)] : ORIGIN = origin, LENGTH = len
    : ^7 j& T7 k  R! T" Q3 w* ^) r1 b
  4. … }
复制代码

. Z* w  u" h: e
! V# x# G: q! ^) l( D* r注释:这里的“attr”只能由以下特性组成: : I/ ~' k; d# p6 ~$ W. D2 q
‘R’ Read-only section5 f" i) R* H* l/ n. ]8 T
‘W’ -- Read/write section
" r4 \- Z# l5 u  L& |9 ]( v5 ~‘X’ -- Executable section: z6 M1 B) \. D3 `4 m
‘A’ -- Allocatable section2 C  ~8 g  P  C3 L2 @. K' U2 X2 O
‘I’ -- Initialized section. Z$ l- ?# @$ h6 T3 N
‘L’ -- Same as ‘I’
5 e- T  H8 ^  R( ]' @‘!’ -- Invert the sense of any of the attributes that follow2 c8 _% p: N( q& _$ R6 m* n5 w
) ^: w6 ~6 W1 A3 _" Q7 E9 f
示例:" @! v- o3 c" E- D( U7 [3 F
  1. /* Memories definition */" y8 d8 S  z) X" \. I
  2. MEMORY
    / W: y% Q. B4 Q- r$ B% T
  3. {0 V- l' j9 i% ?7 B- ~5 H& L
  4. RAM (xrw) : ORIGIN = 0x20000300, LENGTH = 36K
    ) q% |* v8 R( r5 v' D/ S9 L
  5. FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 128K
    3 l+ k- i+ P* n* i9 l$ d
  6. }
复制代码

. ?, S- e: \' ^1 S注释:
# S0 V, s; F. h% p5 J! m, y“xrw”表示“RAM”区是可读、可写和可执行的,且 RAM 的起始地址为“0x20000000”,长度为 36K。
5 R* y: ?- A$ D“rx”表示“FLASH”区是可读和可执行的,FLASH 的起始地址为“0x08000000”,长度为 128K。
) _7 T5 C3 r. M# |/ h4 |9 \
; }8 G" B: F" Z2 M1 S6 F
段(Section) 2 N0 m: @" S- }$ A
Section 有 loadable(可加载) 和 allocatable(可分配)两种类型。不可加载也不可分配的内存段,通常包含某些调试信息。! E/ Q  H+ R/ }1 s  H
loadable(可加载)是指:程序运行时,该段内容应该被加载到内存中。 / B% s' S& y; Z  r# U. |
allocatable(可分配)是指:该段的内容应该被预留出,但不应该加载任何别的内容(某些情况下,这些内存必须归零)。
# z# ]3 X- W0 b7 x) Y0 P# |“可加载”和“可分配”的 section 都有两个地址:“VMA”和“LMA”。0 G4 r. ?, r4 f# _, M
VMA(the virtual memory address):这是运行输出文件时,该 section 的地址。VMA 是可选项,可以不设置。7 M& l: V8 o% N( l- {
LMA(load memory address):这是加载 section 时的地址。2 @* \7 i. J* h/ N5 |
在大多数情况下,这两个地址是相同的。当然也可以不相等,比如下面的例子就是 LMA 和 VMA 不同的案例:数据段被加载到 ROM 中,然后在程序启动时复制到 RAM 中(通常用于初始化全局变量)。此时 ROM 地址就是LMA,RAM 地址就是 VMA。
1 p4 Q( P" _8 U5 Y
& ]! f$ _8 n4 z: L  O( B
语法:3 g7 K) A8 U5 f5 _" y8 G: H3 _6 M
  1. SECTIONS" W8 G" T9 @4 k/ a. E& H/ e3 r
  2. {
    / h  }8 A: R1 t7 u
  3. section [address] [(type)] :
    2 G8 ]4 O6 }7 q- b1 L+ j
  4. {
    1 c3 n5 b: ?+ g/ h
  5. [AT(lma)]
    8 a2 }% Z+ W' z
  6. [ALIGN(section_align) | ALIGN_WITH_INPUT]
    " G2 I3 P7 L# `( Y
  7. [SUBALIGN(subsection_align)]
      f( r; |3 |" [$ U+ b
  8. [constraint] {
      ]+ t; f$ w0 d, _% b
  9. output-section-command
    3 z. ^& S( |5 I0 G0 d  o0 r
  10. output-section-command
    - l; L* `/ b4 A4 g4 R6 }
  11. ...9 V( Z3 p( A) B6 p# w/ @4 y$ C
  12. } [>region] [AT>lma_region] [:phdr :phdr ...] [=fillexp] [,]4 _' Y9 y  C% w8 ]
  13. ..." ^4 ~! O6 }( [$ E* T) Q/ `  E  T
  14. }
复制代码
& Z( [1 j7 o* m3 y2 a% H
注释:大多数的段仅使用了上述的一部分属性。" @% ^8 ~) ~- a8 C
% T# f+ M* K" x/ `' F& M( a+ y! J
示例:; ?  M" ~5 v! [% w2 C! O- k
  1. /* Sections */: T* [% h* C: h3 u* Q- _& k+ b
  2. SECTIONS5 J, T4 r0 n* L9 ?
  3. {7 z( [' e" O' A/ l4 X2 }7 _
  4. /* The startup code into "FLASH" Rom type memory */
    3 s8 H5 G% H8 F, K9 W2 e2 y( _
  5. .isr_vector :
    5 y0 g6 [7 v$ ]2 S; {4 j
  6. {* A: O5 L. P5 f' d8 I) g; b" V
  7. . = ALIGN(4);- H  d" o. @: s; W) r& x9 m; i
  8. KEEP(*(.isr_vector)) /* Startup code */
    . `  A& ]6 {2 t' r
  9. . = ALIGN(4);9 i, B& {. F5 l/ P/ V# {" d' A* _! C
  10. } >FLASH
    4 W% }; x& J& }
  11. /* Initialized data sections into "RAM" Ram type memory */
    + w, e0 N  N1 p, Y+ u5 L/ v2 q' d
  12. .data : ! S2 X- x/ `  C2 c& r9 W9 F
  13. {
    1 y+ l8 s- K( y4 I. b
  14. . = ALIGN(4);
    . O4 \! a8 N6 p6 T
  15. _sdata = .; /* create a global symbol at data start */
      \# u/ q2 q0 H: b/ _' U- h. v
  16. *(.data) /* .data sections */
    6 a3 B" c& u1 U: C' K% C
  17. *(.data*) /* .data* sections */
    # D1 l( F0 f  p& p' x
  18. . = ALIGN(4);
    ! A, v* V$ @0 W+ V& i/ Q3 P
  19. _edata = .; /* define a global symbol at data end */5 V& w4 D3 }9 W+ @$ G

  20. . l& ?  \' w4 [; m+ j1 X2 y2 L6 w, n
  21. } >RAM AT> FLASH6 b. Z8 d0 \$ `
  22. }
复制代码
* r& k3 E( i5 i1 I; ~
注释:上述示例中“.isr_vector”的 LMA 与 VMA 是相等的。“! z% y# q% K# ]) g' L- @
.data”因为有“>RAM AT> FLASH”的修饰,表示.data 段的 VMA 为 RAM,LMA 为 FLASH。即.data 段的内容会放在 FLASH 中,但是运行时,会加载到 RAM 中。 : ]9 q) v; Q" F+ F  v

6 I& X; N: y9 S# G. J2 C3 m) U完整版请查看:附件  B& z* b- F. [# b4 }6 m( {0 @0 r
# a4 ]6 E! C9 b0 ~' j) i6 `

- }- e' U' w5 h* J8 Y& u7 b
" p; e, O/ Q5 h8 m- Y8 `# |$ m

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

下载

398.99 KB, 下载次数: 79

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

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版