×
单片机 > 单片机程序设计 > 详情

ARM空间分段(lst文件夹下map文件)

发布时间:2020-06-20 发布时间:
|
对于ARM,堆是向上生长的,栈是向下生长的。


 局部变量占用栈(stack)空间。

  程序中动态申请的如malloc()和new函数申请的内存空间占用堆(heap)空间。

 

|ImageRO

 
Base| 
表示RO输出段运行时起始地址,也可以说是程序代码存放的起始地址,由-ro-base这个参数指定;
|ImageRO
 
Limit|
表示RO输出段运行时存储区域界限,其值可通过|ImageRO
 
Base|+Code sizes+RO Data sizes+4计算得出;
|ImageRW
 
Base|
表示RW输出段运行时起始地址,记得是运行时的地址,而不一定是加载时的存放地址,因为RW输出段在加载时可能是在ROM中并紧跟着RO输出段存放的,当程序运行时才移动(在有些书中说是移动,个人觉得应该只是复制,希望大家能帮我解释一下,谢谢!)到RAM起始地址为|ImageRW
 
Base|的区域,由-rw-base这个参数指定;未指定的话,默认紧跟RO输出段,那么|ImageRW
 
Base|=|ImageRO
 
Limit|;
|ImageRW
 
Limit|
表示RW输出段运行时存储区域界限,其值可通过|ImageRW
 
Base|+RW Data sizes+4计算得出;
|ImageZI
 
Base|
表示ZI输出段运行时起始地址,它是运行时在RAM中生成的,紧跟着RW输出段存放,其值和|ImageRW
 
Limit|一样;
|ImageZI
 
Limit|
表示ZI输出段运行时存储区域界限,其值可通过|ImageZI
 
Base|+ZI Data sizes+4计算得出。

 

 

CODE 是 RO-CODE同义词,也是.text同义词
CONST是RO-DATA同义词,也是.constdata同义词
DATA是RW-DATA同义词,也是.data同义词
ZI是.bss的同义词

 

  Total RO  Size (Code + RO Data)                12216 (  11.93kB)
  Total RW  Size (RW Data + ZI Data)               292 (   0.29kB)
  Total ROM Size (Code + RO Data + RW Data)      12412 (  12.12kB)

 

应用程序的堆栈(stack)和堆(heap)是在C库函数初始化过程中建立起来的,在ADSl.2或更新版本中,在缺省状态下C库函数初始化代码会将连接器生成的符号ImageZI

 
Limit地址作为堆的基地址。在分散加载时,连接器会将用户的__user_initidl_stackheap()函数代替C库函数默认的堆栈和堆初始化函数,并将其连接到用户的镜像文件中,用户可通过重新实现__user_initial_stackheap()函数来改变堆栈和堆的位置,从而适合自己的目标硬件。

 

    __user_initial_stackheap()可以用C或汇编语言来实现。它必须返回如下参数:

    r0—堆基地址;

    r1—堆栈基地址;

    r2—堆长度限制值(需要的话);

    r3—堆栈长度限制值(需要的话)。
    当用户使用分散加载功能的时候,必须重新实现一user_initial_staacklaeap(),否则连接器会报错:
    Error:L6218E:Undefined symbol ImagerZI

 
一Limit(referred from sys_stackheap.o)。
    注:ImageZI
 
Limit变量为零初始化段(ZI段)的末地址。未使用分散加载时,堆默认就定位在ZI段的末地址,而栈通常位于RAM的顶端

 

 

(2)使用两个存储区
    汇编语言如下:

 

这种方式定义的堆栈和堆分别采用两个不同存储区。堆栈采用向下增长,从地址Ox40000到地址Ox20000;堆采用向上增长,从地址0x28000000到地址0x28080000,如图4所示。

 

关键字:ARM  空间分段  map文件

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
ARM 汇编的必知必会