昨天,修改程序的时候,修改到了scf文件,之前对于scf文件没有了解,趁着这个机会略知一二。
scf文件,全名scatter file,中文名分散加载文件,是ARMlink的输入参数,如果你想把你的代码固定的放在存储器的某个特定的位置,用scf文件就特别方便。
直接来一个scf文件的实例好了。
LOAD_ROM 0x10020000 0x1000 //加载区 名称 起始地址 地址范围
{
EXEC_ROM 0x10020000 0x1000 //执行区 名称 起始地址 地址范围
{
* (RESET,+FIRST) //将RESET代码放在区首,最开始执行 FIRST属性符表示放在最开始
* (+RO) //只读代码和数据放在此区域
}
STACK_TOP 0x20005000 UNINIT 0x0 //UNINIT的意思是没有初始化 栈顶 栈:操作系统自动申请和释放
{
startup.o (STACK_TOP) //startup.o STACK_TOP放入此处
}
STACK 0x20005000 EMPTY -0x1000 //向下空0x1000大小
{
}
HEAP_TOP ImageBase(STACK) UNINIT 0x0 //ImageBase(STACK)不是很懂 从栈底开始堆顶? 堆:程序员自己申请和释放
{
startup.o (HEAP_TOP) //startup.o HEAP_TOP放入此处
}
HEAP ImageBase(STACK) EMPTY -0x0 //空0
{
}
HEAP_BOTTOM ImageBase(HEAP) UNINIT 0x0
{
startup.o(HEAP_BOTTOM) //startup.o HEAP_BOTTOM放入此处
}
DATA_UNINIT 0x20000140 UNINIT 0x40
{
*(NO_INIT) //NO_INIT 放入此处
}
DATA 0x20000240 UNINIT(0x5000-0x240-ImageLength(STACK)-ImageLength(HEAP))
{
*(+RW,+ZI) //RW,ZI 放入此处
}
}
RO,RW,ZI,NOINIT,分别表示只读,可读可写,初始化为0,以及没有初始化的文件和数据。
sct文件分为加载区和执行区,每个加载区里都有1个或者多个执行区。