MCU - 链接脚本ld概述,及程序存储机制

文摘   科技   2024-03-09 10:18   广东  



1. 链接脚本ld  

1.1 加载地址LMA和运行地址VMA  

1.1.1 加载地址LMA   

  • 烧录程序时,代码段、数据段存储的地址,一般是在FLASH中
  • 这个存储地址可保证掉电不丢失



1.1.2 运行地址VMA   

  • 软件运行时,代码段、数据段所处的(虚拟)地址,可以在FLASH、SRAM
  • 【VMA】在SRAM,则需要从【LMA】加载,即从FLASH拷贝到SRAM,如【.data】




1.2 程序的存储机制  

1.2.1 概述   

项目编译后,一般会显示代码大小等信息:

即大致分代码段、数据段,存储于FLASH、SRAM中。



1.2.2 一般结构    

  • 常规的代码放FLASH,变量在SRAM中。上电时,从【LMA】加载数据到【VMA】。

  • 同样的,FLASH的其他内容也可以定义到SRAM,上电从FLASH加载到SRAM。





1.3 ld的作用   

告诉链接器如何将各个目标文件组合成最终的可执行文件,包括:
  • 指定程序入口点,即从何处开始执行程序

  • 定义内存布局,包括代码段、数据段、堆、栈的分配布局





1.4 ld的基本语法与规则   

这里并不打算介绍语法规范,只挑需要的讲述。完整的可去搜索引擎查找,如:
cnblogs.com/jianhua1992/p/16852784.html


1.4.1 最重要的两个命令   

  • MEMORY: 内存命令
  • SECTIONS: 段命令
命令的内容由一个大括号括起来,如:    




1.4.2 SECTIONS简介

分配代码段、数据段、堆、栈。一个链接脚本中可存在多个SECTIONS命令,不过比较少这样使用:




1.4.3 位置计数器“.”   

英文字符【.】随处可见,可简单认为是一个指向FLASH、SRAM的指针:
  • 指向当前存储器的当前地址,一直递增
  • 可对其赋值,如:
    • 【. += 0x10000;】
    • 【. = 0x10000;】
  • 可取当前地址:【_sdata = .;】

   




1.4.4 “>、AT>”的作用   

一般用法:
  • > 对应运行区域
  • AT> 对应加载区域

下图表示代码/数据烧录至FLASH,上电加载到SRAM运行。

   


-- END --


碎片聚合
求真务实
 最新文章