armlink - Scatter file文件格式
来源:互联网 发布:档案管理系统软件问题 编辑:程序博客网 时间:2024/05/16 06:35
执行区:系统启动后,应用程序进行执行和数据访问的存储器区域,系统在实时运行时可以有一个或多个执行块。
映像中所有的代码和数据都有一个装载地址和运行地址(二者可能相同也可能不同,视具体情况而定)。
1.scatter文件语法:
scatter文件是一个简单的文本文件,包含一些简单的语法。
My Region 0x0000 0x1000
{
;the context of region
}
标题:
每个块由一个头标题开始定义,头中至少包含块的名字(自己定义)和起始地址,如0x0000,另外还有最大长度等其他一些属性选项(注:这些属性是可选的,如0x1000)
内容:
块定义的内容包括在紧接的一对花括号内,依赖于具体的系统情况。
一个加载块(加载时域)必须至少含有一个执行块(运行时域);实践中通常有多个执行块。
一个执行块必须至少含有一个代码或数据段;这些通常来自源文件或库函数等的目标文件;通配符号*可以匹配指定属性项中所有没有在文件中定义的余下部分。
一个映像文件由域(region)、输出段(output sections)和输入段(input sections)组成。不要想得太复杂,其实他们之间就是包含与被包好的关系。具体关系是这样的: 映像文件 > 域 > 输出段 > 输入段 输入段: 输入段就是我们写的代码+初始化的数据+应该被初始化为0的数据+没有初始化的数据,用英文表示一下就是:RO(ReadOnly),RW (ReadWrite),ZI(ZeroInitialized),NOINIT(Not Initialized)。ARM连接器根据各个输入段不同的属性把相同的拿再一起组合一下就成为了输出段。 请看看平时写的东东: AREA RESET, CODE, READONLY AREA DSEG1, DATA, READWRITE AREA HEAP, NOINIT, READWRITE 看出其属性没? 输出段: 为了简化编译过程和更容易取得各种段的地址,那么把多个同属性的输入段按照一定的规律组合在一起,当然这个输出段的属性就和它包含的输入段的属性一样咯。输入段的排放规律就是:最先排放RO属性的输入段,然后是RW属性段,最后是ZI或NOINIT段。 域: 为什么还要加一层域,我的理解是由于代码的功能不同,那么我们有必要把不同功能的代码分类放。我们可以把需要高速执行的代码放在一起、把对速度 要求不高的放在一起、把执行频率高的放在一起,把执行频率低的放在一起...那么按照这种方式放的代码就可以根据其具体需要放在不同的存储器中了。这样可 以提高程序执行速度。一个域中包含1~3个输出段。 映像文件: 我暂时把映像文件理解成烧到存储器中的文件,由N个域组成。这些域其实可以看做是独立的模块,只是他们按照一定的顺序(这个顺序还是:RO+RW+ZI)被捆绑在一起,这样才方便烧写到非易失存储器中去。 好了,了解了映像文件的组成,那么来看看映像文件是怎么跑起来的。 映像文件就是有N节车厢的火车,车厢(域)里装着要送到不同站(不同类型的存储器)的货物。到相应的站了,那么就把相应的车厢拿下来。指挥拿这 个的就是scatter文件。拿下货物车厢后,我们就解开它,把里面的品牌为RO的货物提取出来,按照scatter的指示发给某个地址,然后再先后把品牌为RW和ZI的货物发到scatter指定的地址。
这里再用周立功的开发板附带例程里的分散加载文件做例子进行讲解:
硬件配置:
内部 64K RAM: 0x4000 0000 - 0x4000 ffff
外部 2M FLASH:0x8000 0000 - 0x801f ffff
外部 8M RAM: 0x8100 0000 - 0x807f ffff
ROM_LOAD 0x80000000 ;加载时域描述
{
ROM_EXEC 0x80000000 ;第一个运行时域描述
{
Startup.o (vectors, +First) ;输入段描述:模块startup位于该
;域的开头(+First),vector为入口点
* (+RO) ;本域包含全部RO代码(*(+RO))
}
IRAM 0x40000000 ;第二个运行时域:将堆栈空间放入
;片内静态RAM中(0x40000000)
{
Startup.o (MyStacks) ;本域包含模块STARTUP 的MYSTACKS段
}
STACKS_BOTTOM +0 UNINIT ;将栈底放在堆栈的后面(+0)
;不进行初始化(UNINIT)
{
Startup.o (StackBottom)
}
STACKS 0x40004000 UNINIT ;将STACKS放入40004000 此处地址不能访问
;如访问将产生预取中止和数据中止异常
{
Startup.o (Stacks)
}
ERAM 0x81000000 ;将所有RWZI(*(+RW,+ZI))段放入外部RAM中
{
* (+RW,+ZI)
}
HEAP +0 UNINIT ;在RWZI段后放入堆底
{
Startup.o (Heap)
}
HEAP_BOTTOM 0x81080000 UNINIT
{
Startup.o (HeapTop) ;堆顶:放入了外部RAM中(0x81080000)
}
}
(1)样例中,只有一个加载块ROM_LOAD,包含了所有的代码和数据(存放在ROM),起始地址为0x800000000。这个加载块一共对应七个执行块(ROM_EXEC, IRAM,STACKS_BOTTOM, STAKS,ERAM,HEAP,HEAP_BOTTOM)。
(2)RO的代码和数据会从ROM_EXEC开始执行,执行地址与装载地址相同。
(3)Startup.o是Startup.s的目标文件(Startup.s也在这个工程下),vectors是在Startup.s定义的段,整个句子的意思是把整个Startup.s编译生成的目标文件(向量表)放在0x8000 0000的第一个位置,即从vectors开始依次从ROM_EXEC的顶部放下来。
(4)所有的RW和ZI数据包含在外部RAM执行块里,起始地址为0x81080000。
(5)RW数据是从ROM_LOAD copy 过来的,ZI数据是在RAM中初始化的,其位置在RW之上。
(6)HEAP是用来定位堆栈的底的,堆栈底的位置在ZI之上所以使用"+0",heap会从此地址增加。
(7)STACKS是用来定位堆栈顶的,堆栈顶的位置在可以用来作为存储的内存的顶部。Stacks会从堆栈顶的地址下降。
- armlink - Scatter file文件格式
- armlink - Scatter file文件格式
- ARMLink scatter file(1)
- ARMLink scatter file(2)
- armlink scatter file
- Scatter file文件格式
- [ArmCompiler6--armlink]Keil-MDK中scatter file语法
- armlink - Scatter file文件实现将函数放在指定内存地址
- Scatter file
- Scatter file
- [ArmCompiler6--armlink]Keil-MDK中scatter load机制
- scatter file知识
- Scatter file 介绍
- ARM scatter file
- ARM Scatter File详解
- scatter file介绍
- ARM Scatter File详解
- scatter file介绍
- 计算机网络基础知识
- Oracle10g 报错'java.lang.Exception: No such metric'的解决方法
- 迈出第一步
- 乒乓2
- Apache配置SVN用户验证
- armlink - Scatter file文件格式
- 关于wince 没有Key press事件的解决方法
- Eclipse 在linux 下无法打开居然是JDK的原因!
- can't find main class问题(原理未知)
- Win32 PE病毒原理分析
- 最高标号预留与推进算法 --- 就是要比 Dinic 快!
- 文件下载
- 09 12 07 Java web 学习笔记
- Hash 算法及其应用