加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

分散加载文件 ads

发布时间:2020-12-15 06:46:08 所属栏目:百科 来源:网络整理
导读:? 有如下分散加载文件: ROM_LOAD 0x00000000 ????????????? ;// Origination Point of Code (Code in Flash) { ??? ROM_EXEC 0x00000000 ?????????? ;// Origination Point of Executing ??? { ??????? Startup.o (vectors,+First) ??????? * (+RO) ??? } ?
?

有如下分散加载文件:

ROM_LOAD 0x00000000????????????? ;// Origination Point of Code (Code in Flash)
{
??? ROM_EXEC 0x00000000?????????? ;// Origination Point of Executing
??? {
??????? Startup.o (vectors,+First)
??????? * (+RO)
??? }
??? IRAM 0x40000040???????????????? ;// Origination Point of Internal SRAM
??? {????????????????????????????? ;// 0x40000000 ~ 0x4000003F for Vector
??????? Startup.o (MyStacks)
??? }
??? STACKS_BOTTOM +0 UNINIT
??? {
??????? Startup.o (StackBottom)
??? }
??? STACKS 0x40004000 UNINIT????? ;// End Point of Internal SRAM

??? {

??????? Startup.o (Stacks)

??? }
??? ERAM 0x81000000??????????????? ;// Origination Point of External SRAM
??? {
??????? * (+RW,+ZI)
??? }
??? HEAP +0 UNINIT???
???
{
??????? Startup.o (Heap)
??? }
??? HEAP_BOTTOM 0x81800000 UNINIT?? ;// End Point of External SRAM
??? {
??????? Startup.o (HeapTop)
??? }
}

其中,??? ROM_LOAD为加载区的名称,其后面的0x00000000表示加载区的起始地址(存放程序代码的起始地址),也可以在后面添加其空间大小,如“ROM_LOAD 0x00000000 0x20000”表示加载区起始地址为0x00000000,大小为128K字节;ROM_EXEC描述了执行区的地址,放在第一块位置定义,其起始地址、空间大小与加载区起始地址、空间大小要一致。从起始地址开始放置向量表(即Startup.ovectors+First),其中Startup.oStartup.s的目标文件),接着放置其他代码(即映像文件)(即 *RO));变量区IRAM的起始地址为0x4000000040,放置Startup.oMyStacks);变量区ERAM的起始地址为0x80000000,放置出Startup.o文件之外的其他文件的变量(即 *+RW+ZI));紧靠ERAM变量区之后的是系统堆空间(HEAP),放置描述为Startup.oHeap);堆栈区STACKS使用片内RAM,由于ARM的堆栈一般采用满递减堆栈,所以堆栈区的起始地址设置为0x40004000,放置描述为Startup.oStacks

2.使用地址不连续的内存(LPC2368

Lpc2368一共有56KRAM,其中通用Ram32K,地址为0x40000000~0x40007fff8KBUSB专用RAM,地址0x7fd00000~0x7fd01ffff16KB Ethernet专用RAM,地址为0x7fe00000~0x7fe03fff;以上的USBEthernet专用RAM也可用做通用RAM,需要做如下设置:(1target.c中将USBEthernet功能打开,需要设置PCONP寄存器,详见Datasheet。(2)设置分散加载文件,分配这两段内存。

DebugInRam模式下,有如下分散加载文件:

ROM_LOAD 0x40000000
{
??? ROM_EXEC 0x40000000???? //
加载映像文件(通用RAM首地址)
??? {
?????? ?Startup.o (vectors,+First)
??????? * (+RO)
??? }
??? IRAM 0x40007000??????? //
用户堆栈
??? {
??????? Startup.o (MyStacks)
??? }?????
???
STACKS 0x40008000 UNINIT???? //
系统堆栈
??? {
??????? Startup.o (Stacks)
??? }
???
ERAM 0x7fe00000??????? /*
变量,放置与Ethernet专用RAM首地址*/
??? {
??????? * (+RW,+ZI)
??? }
???
HEAP +0 UNINIT
??? {
??????? Startup.o (Heap)
??? }
?}

3.分散使用Flash地址(LPC2368

项目中,要求将片内Flash起始几个扇区空出来留作他用,或者当用到的Flash地址不连续的时候,都可用以下方法来编写分散加载文件:

ROM_LOAD 0x00000000
{
?????? ROM_EXEC 0x00000000???? /*
中断向量表*/
??? ??? {
????? ??Startup.o (vectors,+First)??
??? ???
}
???
。。。
}
ROM_LOAD1 0x00004000?? //
加载映像文件,从第四个扇区开始
{
?????? ROM_EXEC1 0x00004000
?? ?? ? {
???? ???? * (+RO)
??? ??? }
}

值得注意的是,中断向量表必须放在flash起始地址处,否则无法启动。根据以上分散加载文件编译生成的Hex文件会有两个,分别如下:

Hex1
:020000040000FA
:1000000018F09FE518F09FE518F09FE518F09FE5C0

。。。

Hex2
:020000040000FA
:1040000090808FE20F0098E8080080E0081081E0BF

。。。

可以看出,生成的两段Hex文件的起始地址是不同的,其中一段为中断向量表;另一段为用户映像文件。

4.固定变量内存地址

嵌入式开发中,有时会需要在同一片内的不同段程序(比如Bootloader和主程序间)间传递数据,这时候往往需要固定变量地址。一般来言,C语言编写的程序,变量地址是由C编译器来分配内存的,程序员无法实现知道变量地址。而ADS中的分散加载文件可以告知编译器,固定某些变量的地址,如下:

ROM_LOAD 0x00000000
{
??? ROM_EXEC 0x00000000
??? {
??????? Startup.o (vectors,+First)
??????? * (+RO)
??? }
?? ? RAM 0x40000000 UNINIT?? //Mfile.c
中的所有变量地址从0x40000000开始
??? {
??????? Mfile.O(+RW,+ZI)
??? }
??? IRAM 0x40000010
??? {
??????? Startup.o (MyStacks)
??????? * (+RW,+ZI)
??? }
??? HEAP +0 UNINIT
??? {
??????? Startup.o (Heap)
??? }
??? STACKS 0x40004000 UNINIT
??? {
??????? Startup.o (Stacks)
??? }
}

上述分散加载文件固定了Mfile.c中变量的起始地址,以这种方法,可以固定任何全局变量的地址,以便其被其他系统访问。

转自:http://devdiary.blog.sohu.com/52597162.html

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读