本文介绍: 这是代码加载域,从Target配置看,ROM的起始地址范围分别就是0x08000000 0x00040000,而LR_IROM1为加载名称,代表这块存储区域。*.o表示选择所有的.o文件,均放在这里,RESET为节区名,+First表示将RESET节区放在最前面keil编译器链接的时候,是根据分散加载(.scf后缀的文件)来确定程序加载域和运行域的。表示将剩下的,所有的RO(readeonly只读的)属性的节区放这里。这是将标准库里,有使用到的相关文件或节区,放到这里,挨着上面的*.o。

1 SCF文件

keil编译器链接的时候,是根据分散加载(.scf后缀的文件)来确定程序加载域和运行域的。

2 SCT分散加载文件

打开一个STM32的工程,找到工程配置的入口,选择Target
在这里插入图片描述选择Linker
在这里插入图片描述我们去掉一个勾,看到Scatter File一行可以修改编辑,以下是分散加载文件的具体内容
在这里插入图片描述分号后面是注释

LR_IROM1 0x08000000 0x00040000  {

这是代码的加载域,从Target配置看,ROM的起始地址范围分别就是0x08000000 0x00040000,而LR_IROM1为加载域名称,代表这块存储区域

加载域括起来的,为执行域。本文件两个执行域:ER_IROM1和RW_IRAM1。类似的,0x08000000和0x00040000为ER_IROM1的起始地址大小

*.o (RESET, +First)

*.o表示选择所有的.o文件,均放在这里,RESET为节区名,+First表示将RESET节区放在最前面。RESET在启动文件.s文件可以看到

 (InRoot$$Sections)

这是将标准库里,有使用到的相关文件或节区,放到这里,挨着上面的*.o

 .ANY (+RO)

表示将剩下的,所有的RO(readeonly,只读的)属性的节区放这里

 .ANY (+RW +ZI)

表示剩下的,所有的RW、ZI属性的节区

3 SCF文件编写

一:什么时候使用scatter file

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

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

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

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

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

如:堆放到SDRAM里面

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)
}
}

原文地址:https://blog.csdn.net/qq_45578181/article/details/134624905

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_14479.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注