1 SCF文件
keil编译器在链接的时候,是根据分散加载(.scf后缀的文件)来确定程序的加载域和运行域的。
- 加载域就是程序运行前在flash中具体分区情况
- 执行域就是程序运行后,程序在flash和ram中的分区情况。
当程序运行后,RW段中的数据会被复制到RAM中,同时还会初始化一个ZI段用来存放没有初始化和被初始化为零的相关变量。
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文件编写
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进行投诉反馈,一经查实,立即删除!