这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 综合技术 » 基础知识 » IAP 有没有介绍关于“分散加载机制”和“IAP”方面的好文章?

共2条 1/1 1 跳转至

IAP 有没有介绍关于“分散加载机制”和“IAP”方面的好文章?

院士
2006-09-17 18:14:16     打赏
IAP 有没有介绍关于“分散加载机制”和“IAP”方面的好文章?



关键词: 有没有     介绍     关于     分散     加载     机制     方面的     面的    

院士
2006-12-22 22:43:00     打赏
2楼
问 有没有介绍关于“分散加载机制”和“IAP”方面的好文章? 1: “分散加载机制”请看《ARM体系结构与编程》,讲得还可以,并且网上有电子版。 2: 《ARM体系结构与编程》哪里有下?《ARM体系结构与编程》哪里有下?能不能给我传一份电子版的,yfhu2004@sohu.com 3: 我只有印刷的,电子版的在一个网站看到过PDF格式的,现在一下子想不起来了,sorry 4: IAP是什么意思? 5: “分散加载机制”根据目标硬件定制存储器映射
分散装载(Scatlerloading)
在实际的嵌入式系统中,ADS提供的缺省存储器映射是不能满足要求的。用户的目标硬件通常有多个存储器设备位于不同的位置,并且这些存储器设备在程序装载和运行时可能还有不同的配置。
Scattertoading可以通过一个文本文件来指定一段代码或数据在加载和运行时在存储器中的不同位置。这个文本文件scatterfile在命令行中由-scatter开关指定,例如:
ARMlink_scatterscat.scffilel.ofile2.0
在scatterfile中可以为每一个代码或数据区在装载和执行时指定不同的存储区域地址,Scatlertoading的存储区块可以分成二种类型:
装载区:当系统启动或加载时应用程序的存放区。
执行区:系统启动后,应用程序进行执行和数据访问的存储器区域,系统在实时运行时可以有一个或多个执行块。
映像中所有的代码和数据都有一个装载地址和运行地址(二者可能相同也可能不同,视具体情况而定)。在系统启动时,C函数库中的__main初始化代码会执行必要的复制及清零操作,使应用程序的相应代码和数据段从装载状态转入执行状态。
1.scatter文件语法
scatter文件是一个简单的文本文件,包含一些简单的语法。
My_Region0x00000x1000
{
thecontextofregion
}
每个块由一个头标题开始定义,头中至少包含块的名字和起始地址,另外还有最大长度和其他一些属性选项。块定义的内容包括在紧接的一对花括号内,依赖于具体的系统情况。
一个加载块必须至少含有一个执行块;实践中通常有多个执行块。
一个执行块必须至少含有一个代码或数据段;这些通常来自源文件或库函数等的目标文件;通配符号*可以匹配指定属性项中所有没有在文件中定义的余下部分。
2.简单分散加载样例
图8所示样例中,只有一个加载块,包含了所有的代码和数据,起始地址为0。这个加载块一共对应两个执行块。一个包含所有的RO代码和数据,执行地址与装载地址相同;同时另一个起始地址为0x10000的执行块,包含所有的RW和ZI数据。这样当系统开始启动时,从第一个执行块开始运行(执行地址等于装载地址),在执行过程中,有一段初始化代码会把装载块中的一部分代码转移到另外的执行块中。
下面是这个scatter描述文件,该文件描述了上述存储器映射方式。
LOAD_ROM0x4000

EXE_ROM0x00000x4000;Rootregion

*〈+RO〉;Allcodeandconstantdata

RAM0x100000x8000

*〈+RW,+ZI〉;Allnon-constantdata


3.在分散文件中放置对象
在大多数应用中,并不是像前例那样,简单地把所有属性都放在一起,用户需要控制特定代码和数据段的放置位置。这可以通过在scatter文件中对单个目标文件进行定义实现,而不是只简单地依靠通配符。
为了覆盖标准的连接器布局规则,我们可以使用+FIRST和+LAST分散加载指令。典型的例子是在执行块的开始处放置中断向量表格:
LOAD_ROM0x00000x4000

EXEC_ROM0x00000x4000

vectors.o〈Vect,+FIRST〉
*〈+RO〉

;moreexecregions...

在这个scatter文件中,保证了vextors.o中的Vect域被放置于地址0x0000。
4.RootRegion(根区)
根区是一个执行块,它的加载地址与执行地址是一致的。每个scatter文件至少有一个根区。分散加载有一个限制:创建执行块的代码和数据(即完成复制和清零的代码和数据)无法自行复制到另一个位置。因此,在根区中必须含有下面的部分:
_main.o,包含复制代码/数据的代码;
连接器输出变量$$Table和ZISection$$Table,包含被复制代码/数据的地址。
由于上面两个部分的属性是只读的,因此他们被*〈+RO〉通配符语法匹配。如果*〈+RO〉被用在了非根区中,则在根区中必须显式地指明另一个RO区域。
下面是一个例子:
LOAD_ROM0x00000x4000

EXE_ROM0x00000x4000;rootregion

_main.o〈+RO〉;copyingcode
*〈Region$$Tabl0e〉;RO/RWaddressestocopy
*〈ZISection$$Table〉;ZIaddressestozero

RAM0x100000x8000

*〈+RO〉;allotherROsections
*〈+RW,+ZI〉;allRWandZIsections

6: IAP=In Application ProgrammingISP= In System Programming
ICP= In Circuit Programming

共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]