1、STM32 启动文件与 .sct 文件分析
1) 定义STACK段,{NOINIT,读写}:分配一段内存大小为0.5K;
2) 定义HEAP段, {NOINIT,读写}:分配一段内存大小为1K;
3) 定义RESET段,{DATA,只读}:DCD各种中断向量;
4) 定义|.text|段,{CODE,只读}:Reset_Handler函数,函数中最后加载了__main;
对剩余的中断函数进行了弱定义;
在最后还有一段用户初始化堆栈的代码__user_initial_stackheap。
那这些代码都存放在什么位置呢?
5) 分析 .sct 文件:
分散加载文件(即scatter file,后缀为.scf)。
分散加载文件是一个文本文件,通过编写一个分散加载文件来指定ARM连接器在生成映像文件时如何分配RO,RW,ZI等数据的存放地址。
如果不用SCATTER文件指定,那么ARM连接器会按照默认的方式来生成映像文件,一般情况下我们是不需要使用分散加载文件的。
但在某些场合,我们希望把某些数据放在指定的地址处,那么这时候SCATTER文件就发挥了非常大的作用。
而且SCATTER文件用起来非常简单好用。
举个例子:
比如像LPC2378芯片具有多个不连续的SRAM,通用的RAM是32KB,可是32KB不够用,我想把某个.C中的RW数据放在USB的SRAM中,那么就可以通过SCATTER文件来完成这个功能。
LR_IROM1 0x08000000 0x00080000 { ; load region size_region
ER_IROM1 0x08000000 0x00080000 { ; load address = execution address
*.o (RESET, +First)
*(InRoot$$Sections)
.ANY (+RO)
}
RW_IRAM1 0x20000000 0x00010000 { ; RW data
.ANY (+RW +ZI)
}
}
STACK段和HEAP段是RW属性,存在RAM(0x20000000-0x20010000)中,具体的地址由编译器在后面链接时决定,并不是一定存在RAM的开头地址。
RESET段存在FLASH(0x08000000-0x08080000)中,而且是FLASH的最开头,再结合CORTEX-M3的特性,其上电后根据启动引脚来决定PC位置,比如启动设置为FLASH启动,则