专栏中心

EEPW首页 > 专栏 > STM32F4的sct文件理解

STM32F4的sct文件理解

发布人:电子禅石 时间:2020-05-29 来源:工程师 发布文章

以下为摘抄:

一:什么时候使用scatter file:

1、存在复杂的地址映射:例如代码和数据需要分开存放在多个区域。

2、存在多个存储器类型:包含Flash, ROM, SDRAM,快速SRAM。我们根据代码与数据的特性把他们发在不同的存储器中,比如中断处理部分放在快速SRAM内部来提高响应速度,而把不常用到的代 码放到速度比较慢的Flash内。

3、函数的地址固定定位:可以利用Scatter file实现把某个函数放在固定地址,而不管其应用程序是否已经改变或重新编译。

4、利用符号确定堆和堆栈。

5、内存映射的IO:利用scatter file可以实现把某个数据段放在精确的地址处。因此对于嵌入式系统来说scatter file是必不可少的,因为嵌入式系统采用了ROM, RAM和内存映射的IO。

分散加载文件(即scatter file后缀为.scf)是一个文本文件,通过编写一个分散加载文件来指定ARM连接器在生成映像文件时如何分配RO,RW,ZI等数据的存放地址。如果不用SCATTER文件指定,那么ARM连接器会按照默认的方式来生成映像文件,一般情况下我们是不需要使用分散加载文件的。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

我现在的板子是STM32F429,外接了SDRAM,NandFlash,我想用sct文件的主要原因是要用到了nandflash,想把yaffs移植上去,但yaffs里面有大量的malloc,STM32F429的片内sram不足以完成这些malloc,故想到把堆放到SDRAM里面去,因此我的sct文件如下:

LR_IROM1 0x08000000 0x00100000 { ; load region size_region  加载域,起始地址是0x08000000,大小是0x00100000
 ER_IROM1 0x08000000 0x00100000  {  ; load address = execution address 执行地址,就是链接地址
  *.o (RESET, +First)
  *(InRoot$$Sections)
  .ANY (+RO)
 }
 RW_IRAM1 0x20000000 0x00030000  {  ; RW data
  .ANY (+RW +ZI)
 }
}

ARM_LIB_HEAP 0xC0000000 0x80000 { ; 指定堆栈地址
 RW_HEAP 0xC0000000 0x80000  {  
  .ANY (HEAP)
 }
}

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

分析下面这个sct文件

ARM_LIB_HEAP 0x20100000 EMPTY 0x100000-0x8000         #堆开始于0x20100000这个地址,长度是正值,说明向高地址增长,大小是(0x100000-0x8000)
{
}

ARM_LIB_STACK 0x20200000 EMPTY - 0x8000                     #EMPTY后面的长度是负值,则表示0x20200000是这个执行区的结束地址,换句话说就是栈的起始地址是0x20200000,地址向下增长,大小是0x8000,那么结束地址就是(0x20200000-0x8000)
{
}

 

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

再看下面这个复杂点的sct文件:

LR_IROM1 0x08000000 0x00100000 { ; load region size_region
   ER_IROM1 0x08000000 0x00100000  {  ; load address = execution address
   *.o (RESET, +First)
   *(InRoot$$Sections)
   .ANY (+RO)
   }
   

RW_IRAM_DATA 0x20000000 0x00030000 {  ; RW data                                                                                                   #所有+RW,+ZI段的数据全部放在0x20000000这里,分配的大小是0x00030000,但这个空间不一定会用完,从下面的定义来看,真正的大小可以用

.ANY (+RW +ZI)                                                                                                                                                                  #ImageLimit(RW_IRAM_DATA)来表示,这是在编译的时候就决定了的
   }

ARM_LIB_STACK 0x20030000 EMPTY -(0x20030000 - ImageLimit(RW_IRAM_DATA))  ; Stack region growing down    #没找到ImageLimit(RW_IRAM_DATA)的含义,猜测是程序编译出来的所有(+RW,+ZI)段的大小,这个大小在编译的时候就可以确定,这里只引用其值
   { }                                                                                                                                                                                          # 相当于RW数据是从0x20000000开始运行,地址向上增长,而栈的起始地址是从0x20030000地址开始,往下增长,RW和栈共用0x30000空间的

                                                                            
 
   RW_ERAM 0xD0000000 0x00800000 { ;Extern SDRAM                                                                                                     #将main.c编译时RW/ZI段所以的内容放到片外SDRAM起始地址0xD0000000的地方,大小是0x00800000,;类似上面,这个空间不一定会用完
   main.o(+RW +ZI)
   }
   
   ARM_LIB_HEAP +0 EMPTY  (0xD0800000 - ImageLimit(RW_ERAM)) ; Heap region growing up                                      #分配堆的空间,起始地址是从前一个执行区偏移0字节开始,这个地址其实就是0xD0000000+ImageLimit(RW_ERAM),长度为正值,
   { }                                                                                                                                                                                           #因此地址向上增长,说白了就是main函数运行起来所使用的内存之外的所以内存全部分配给了堆
}


专栏文章内容及配图由作者撰写发布,仅供工程师学习之用,如有侵权或者其他违规问题,请联系本站处理。 联系我们

关键词:

相关推荐

功率电路进阶教程:为什么要使用固态断路器?

功率电路进阶教程:固态断路器采用SiC JFET的四个理由

利用高压母线转换模块 (BCM) 为LED驱动器供电

视频 2010-04-16

2010年英特尔杯大学生嵌入式设计大赛宣传片 ③

视频 2010-03-26

IDF 2010 MeeGo展区QT介绍

视频 2010-04-19

诺斯罗普·格鲁曼加快DARPA项目下的微电子测试

中国科研团队在石版制造技术方面取得了新进展

英飞凌和Flex组装了分区控制器的各个组成部分

2009 “英特尔杯”全国计算机多核程序设计大赛1

安森美四大eFuse核心系列发力,驱动汽车电气化革新

功率电路进阶教程:SiC JFET 如何实现热插拔控制

使用预集成栈简化嵌入式虚拟化

大连Moblin研讨会视频 II

视频 2010-04-19

光学研究利用微光产生明亮的LED灯

GigaDevice在香港上市:创始人押注中国记忆未来

网络与存储 2026-01-19
更多 培训课堂
更多 焦点
更多 视频

技术专区