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

STM32CubeIDE 实用技巧之 ld 链接文件

[复制链接]
STMCU小助手 发布时间:2022-8-7 13:59
前言
+ j$ J: F3 N8 b. P- t. NSTM32CubeIDE 是 ST 推出的免费集成编译环境,基于 Eclipse 开源框架,集成了 GCC、GDB 等免费的编译器、链接器,支持 STM32 全系列芯片,可以创建 C/C++工程,支持调试、波形实时仿真、一键下载等。
$ X. r( F" P+ F" z在实际项目中,有时候需要对内存进行细分时,比如指定变量/函数/文件到特殊地址等等,KEIL 可以通过“*.sct”文件来实现;IAR 可以通过“*.icf”文件来实现;对于 STM32CubeIDE,可以通过“*.ld”链接文件来实现。+ z. Y: s; ]: C4 h
本文将介绍 GCC 的“*.ld”链接文件的常见用法,供大家参考使用。
, R2 K+ K6 w! t- N0 g
基本概念
: x6 _( d& b& q7 g! j9 C*.ld”链接文件组合了许多对象和归档文件,重新定位它们的数据并绑定符号引用。通常,编译程序的最后一步是运行“*.ld”链接文件。
/ v6 f2 a. }2 D- l2 t. e) g通俗来讲,链接文件可以描述输入文件中的段,将其映射到输出文件中,并指定输出文件中的内存分配。2 @. Y% [0 \* S* V+ f. }  d3 }
以下就是链接文件涉及到的相关概念:1 ^: ?4 W8 N2 |& T

: A/ U( b0 D( D4 b" [0 D( @3 j
内存(Memory)
" b/ f& \0 d6 C语法! z2 J# `# S7 K# ~  j
  1. MEMORY' x" k- L7 v4 D$ p' b
  2. {
    / y$ c) U5 v7 D( d* T
  3. name [(attr)] : ORIGIN = origin, LENGTH = len; _; Z5 c$ U) B0 w6 i% O- G6 [! I
  4. … }
复制代码

: S, S; e8 p0 P; W; J% p; y
* w0 q, u) L( P! E注释:这里的“attr”只能由以下特性组成:
( K6 g5 |) ]+ O, f  ?‘R’ Read-only section
2 A& z4 G: J- R. e* f! a‘W’ -- Read/write section
. w" N1 \3 s6 W‘X’ -- Executable section
, V& t7 ^- u, ^$ Z9 k& s‘A’ -- Allocatable section& @0 x' }  ?, A; S
‘I’ -- Initialized section" C" \3 q& F  c9 u4 _& ^' C5 e
‘L’ -- Same as ‘I’( M6 ^# h% O# d8 a& f# K
‘!’ -- Invert the sense of any of the attributes that follow
/ V1 `& f* S8 E0 ~( E/ l* ^5 `% e
示例
; z+ h* P" T; J& p& n$ N/ g
  1. /* Memories definition */
    - a9 V3 O' i7 y: W" m! Y5 a
  2. MEMORY3 p5 S/ E) c; X) T* O
  3. {
    & F0 K3 g) T9 W+ D5 z" e
  4. RAM (xrw) : ORIGIN = 0x20000300, LENGTH = 36K
    - k7 e4 N3 P( s
  5. FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 128K
    ! s" N3 A* ^2 X+ `6 a$ a1 _
  6. }
复制代码

- a, Y6 {/ M( n8 P8 I( E3 H注释:
6 y5 b; j: N' F0 @% ?“xrw”表示“RAM”区是可读、可写和可执行的,且 RAM 的起始地址为“0x20000000”,长度为 36K。
3 z4 `/ m- M# U8 i2 M! D4 y/ ^" c0 q“rx”表示“FLASH”区是可读和可执行的,FLASH 的起始地址为“0x08000000”,长度为 128K。) [$ K% K% \8 f+ A/ _* e# @
0 g! }3 e) o$ q0 T, I( K
段(Section) 5 P$ T9 @9 l1 ^
Section 有 loadable(可加载) 和 allocatable(可分配)两种类型。不可加载也不可分配的内存段,通常包含某些调试信息。
% A9 c+ W9 Y4 _4 S9 Xloadable(可加载)是指:程序运行时,该段内容应该被加载到内存中。 / @0 x5 K; Z) C5 D) H
allocatable(可分配)是指:该段的内容应该被预留出,但不应该加载任何别的内容(某些情况下,这些内存必须归零)。; \7 K/ ?, a! h7 Y( Y8 l
“可加载”和“可分配”的 section 都有两个地址:“VMA”和“LMA”。& i6 }( a& l3 b
VMA(the virtual memory address):这是运行输出文件时,该 section 的地址。VMA 是可选项,可以不设置。
) a. T0 {/ s2 f6 g( D) u4 dLMA(load memory address):这是加载 section 时的地址。4 K1 ~. p' R- `8 t" q
在大多数情况下,这两个地址是相同的。当然也可以不相等,比如下面的例子就是 LMA 和 VMA 不同的案例:数据段被加载到 ROM 中,然后在程序启动时复制到 RAM 中(通常用于初始化全局变量)。此时 ROM 地址就是LMA,RAM 地址就是 VMA。
5 ]7 G) i/ b1 M" n7 a/ ^  B2 U& |# q' }0 b! H
语法
% A7 @2 a. S! n2 n1 S. X0 f
  1. SECTIONS
    2 v) ], r/ D) Y5 F& F
  2. {: g/ e2 }2 f$ M$ ^7 ^1 p1 o
  3. section [address] [(type)] :! ^( p9 r/ [2 |* p+ J7 [
  4. {7 T. @/ f1 {  _9 D5 f
  5. [AT(lma)]
    ) q/ f) g/ W' ^1 x; t
  6. [ALIGN(section_align) | ALIGN_WITH_INPUT]/ C4 Y( s- o2 |: H* G' g0 h
  7. [SUBALIGN(subsection_align)]
    , c, b1 J# I  I
  8. [constraint] {9 e( u9 r. [0 a  w# o7 G
  9. output-section-command% Y. Q& `5 G" @& J: a
  10. output-section-command( A  d7 W! `9 [9 \/ i- f
  11. .../ I& R1 {1 h9 W; X
  12. } [>region] [AT>lma_region] [:phdr :phdr ...] [=fillexp] [,]! Y6 B# [1 ?$ I3 m
  13. ...% F. J% a2 X; {2 R- L! e
  14. }
复制代码
$ S2 [% N  k- S" U6 w0 ~
注释:大多数的段仅使用了上述的一部分属性。
' o" p9 c/ R( y
: b+ ?4 P. s0 t, z- Z, `
示例% s. A+ u$ }0 |  D/ d4 {
  1. /* Sections */
    ( A% G6 d* j* d; J" D/ y8 H0 @( w
  2. SECTIONS2 y0 f& C+ E% V! j( W) }0 F2 Y
  3. {
    & |) t# y( x, S% y) f' ?$ T
  4. /* The startup code into "FLASH" Rom type memory */
    1 F; |: Q3 p/ x7 b
  5. .isr_vector :
    ) ]8 Y) q# }+ J: t
  6. {: H3 A  i8 ^! G- ^. Y: {
  7. . = ALIGN(4);& i1 D( y$ u! a+ Y  w
  8. KEEP(*(.isr_vector)) /* Startup code */
    % S* T- x) \- B
  9. . = ALIGN(4);: ^1 d' r. i, z2 _3 `$ `0 j: n
  10. } >FLASH
    # Q, r& u* ~  \, _, N, b) ?
  11. /* Initialized data sections into "RAM" Ram type memory */' _) d7 \) t) W6 ~1 `) z8 h! Y
  12. .data :
    7 K2 m: N/ P3 @; [; I: i3 O, h
  13. {. Q% P; e5 g2 N' @. G
  14. . = ALIGN(4);0 X/ j; w: L/ q4 H# X0 T
  15. _sdata = .; /* create a global symbol at data start */
    % t8 C+ Z1 y) i) v8 D% t! J5 C! p
  16. *(.data) /* .data sections */) K  [3 Y. ~0 Z" X; ?! `/ V& V, c
  17. *(.data*) /* .data* sections */
    6 [1 l8 r+ x; o
  18. . = ALIGN(4);* g) s) L1 p! W4 |; Z1 s/ K
  19. _edata = .; /* define a global symbol at data end */' h& A) i$ `1 L$ @) X  z
  20. " J5 b; o# B/ s9 d5 F' J
  21. } >RAM AT> FLASH
    7 V+ X# w' N; l1 `+ `* B& D5 H
  22. }
复制代码
( g* }( e3 t" |7 Z- g0 b! e& n& ~
注释:上述示例中“.isr_vector”的 LMA 与 VMA 是相等的。“& b  g# U# \4 j9 }2 V  U
.data”因为有“>RAM AT> FLASH”的修饰,表示.data 段的 VMA 为 RAM,LMA 为 FLASH。即.data 段的内容会放在 FLASH 中,但是运行时,会加载到 RAM 中。
- G& ?+ N# g% s( x4 u5 L. n% p- l' j- f! ]/ |- _! _# B' I9 \
完整版请查看:附件  I6 b9 I  E8 Z$ ^" r/ q

1 d, r6 M/ F) c0 ~) y& e, k: |/ F

6 v! P; A  H& y0 t, W: R
; G; q0 W5 Y) S$ S

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

下载

398.99 KB, 下载次数: 41

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

举报

0个回答

所属标签

相似分享

官网相关资源

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