织梦CMS - 轻松建站从此开始!

罗索

ADS分散加载文件使用总结

jackyhwei 发布于 2011-01-21 09:21 点击:次 
上述分散加载文件固定了Mfile.c中变量的起始地址,以这种方法,可以固定任何全局变量的地址,以便其被其他系统访问。
TAG:

导读:
1.概述(引自周立功Lpc2200)
有如下分散加载文件:

  1. ROM_LOAD0x00000000 // Origination Point of Code (Code in Flash) 
  2. ROM_EXEC 0x00000000 // Origination Point of Executing 
  3. Startup.o (vectors, +First) 
  4. * (+RO) 
  5. IRAM 0x40000040 // Origination Point of Internal SRAM 
  6. // 0x40000000 ~0x4000003F for Vector 
  7. Startup.o (MyStacks) 
  8. STACKS_BOTTOM +0 UNINIT 
  9. Startup.o (StackBottom) 
  10. STACKS 0x40004000 UNINIT // End Point of Internal SRAM 
  11. Startup.o (Stacks) 
  12. ERAM 0x81000000 // Origination Point of External SRAM 
  13. * (+RW,+ZI) 
  14. HEAP +0 UNINIT 
  15. Startup.o (Heap) 
  16. HEAP_BOTTOM 0x81800000 UNINIT // End Point of External SRAM 
  17. Startup.o (HeapTop) 
  18. }  

其中, ROM_LOAD为加载区的名称,其后面的0x00000000表示加载区的起始地址(存放程序代码的起始地址),也可以在后面添加其空间大小,如“ROM_LOAD 0x00000000 0x20000”表示加载区起始地址为0x00000000,大小为128K字节;ROM_EXEC描述了执行区的地址,放在第一块位置定义,其起始地址、空间大小与加载区起始地址、空间大小要一致。从起始地址开始放置向量表(即Startup.o(vectors,+First),其中Startup.o为Startup.s的目标文件),接着放置其他代码(即映像文件)(即*(RO));变量区IRAM的起始地址为0x4000000040,放置Startup.o(MyStacks);变量区ERAM的起始地址为0x80000000,放置出Startup.o文件之外的其他文件的变量(即*(+RW,+ZI));紧靠ERAM变量区之后的是系统堆空间(HEAP),放置描述为Startup.o(Heap);堆栈区STACKS使用片内RAM,由于ARM的堆栈一般采用满递减堆栈,所以堆栈区的起始地址设置为0x40004000,放置描述为Startup.o(Stacks)
2.使用地址不连续的内存(LPC2368)
Lpc2368一共有56K的RAM,其中通用Ram32K,地址为0x40000000~0x40007fff;8KB的USB专用RAM,地址0x7fd00000~0x7fd01ffff;16KB Ethernet专用RAM,地址为0x7fe00000~0x7fe03fff;以上的USB和Ethernet专用RAM也可用做通用RAM,需要做如下设置:(1)target.c中将USB和Ethernet功能打开,需要设置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_EXEC0x00000000 /*中断向量表*/
{
Startup.o (vectors,+First)
}
。。。
}
ROM_LOAD1 0x00004000 //加载映像文件,从第四个扇区开始
{
ROM_EXEC10x00004000
{
* (+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中变量的起始地址,以这种方法,可以固定任何全局变量的地址,以便其被其他系统访问。

(renjwjx)
本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www.rosoo.net/a/201101/10795.html]
本文出处:CSDN博客 作者:renjwjx
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
将本文分享到微信
织梦二维码生成器
推荐内容