STM32 SCF文件

2023-12-13 16:20:08

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文件编写

一:什么时候使用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
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。