【转载】ADS分散加载文件使用总结(lpc23xx)
有如下分散加載文件:
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為加載區(qū)的名稱,其后面的0x00000000表示加載區(qū)的起始地址(存放程序代碼的起始地址),也可以在后面添加其空間大小,如“ROM_LOAD 0x00000000 0x20000”表示加載區(qū)起始地址為0x00000000,大小為128K字節(jié);ROM_EXEC描述了執(zhí)行區(qū)的地址,放在第一塊位置定義,其起始地址、空間大小與加載區(qū)起始地址、空間大小要一致。從起始地址開始放置向量表(即Startup.o(vectors,+First),其中Startup.o為Startup.s的目標文件),接著放置其他代碼(即映像文件)(即 *(RO));變量區(qū)IRAM的起始地址為0x4000000040,放置Startup.o(MyStacks);變量區(qū)ERAM的起始地址為0x80000000,放置出Startup.o文件之外的其他文件的變量(即 *(+RW,+ZI));緊靠ERAM變量區(qū)之后的是系統(tǒng)堆空間(HEAP),放置描述為Startup.o(Heap);堆棧區(qū)STACKS使用片內(nèi)RAM,由于ARM的堆棧一般采用滿遞減堆棧,所以堆棧區(qū)的起始地址設(shè)置為0x40004000,放置描述為Startup.o(Stacks)
??
2.使用地址不連續(xù)的內(nèi)存(LPC2368)
Lpc2368一共有56K的RAM,其中通用Ram32K,地址為0x40000000~0x40007fff;8KB的USB專用RAM,地址0x7fd00000~0x7fd01ffff;16KB Ethernet專用RAM,地址為0x7fe00000~0x7fe03fff;以上的USB和Ethernet專用RAM也可用做通用RAM,需要做如下設(shè)置:(1)target.c中將USB和Ethernet功能打開,需要設(shè)置PCONP寄存器,詳見Datasheet。(2)設(shè)置分散加載文件,分配這兩段內(nèi)存。
在DebugInRam模式下,有如下分散加載文件:
ROM_LOAD 0x40000000
{
??? ROM_EXEC 0x40000000???? //加載映像文件(通用RAM首地址)
??? {
?????? ?Startup.o (vectors, +First)
??????? * (+RO)
??? }
??? IRAM 0x40007000??????? //用戶堆棧
??? {
??????? Startup.o (MyStacks)
??? }?????
??? STACKS 0x40008000 UNINIT???? //系統(tǒng)堆棧
??? {
??????? Startup.o (Stacks)
??? }
??? ERAM 0x7fe00000???????
??? {
??????? * (+RW,+ZI)
??? }
??? HEAP +0 UNINIT
??? {
??????? Startup.o (Heap)
??? }
?}
?
3.分散使用Flash地址(LPC2368)
項目中,要求將片內(nèi)Flash起始幾個扇區(qū)空出來留作他用,或者當用到的Flash地址不連續(xù)的時候,都可用以下方法來編寫分散加載文件:
ROM_LOAD 0x00000000
{
?????? ROM_EXEC 0x00000000????
??? ??? {
????? ??Startup.o (vectors,+First)??
??? ??? }
??? 。。。
}
ROM_LOAD1 0x00004000?? //加載映像文件,從第四個扇區(qū)開始
{
?????? ROM_EXEC1 0x00004000
?? ?? ? {
???? ???? * (+RO)
??? ??? }
}
值得注意的是,中斷向量表必須放在flash起始地址處,否則無法啟動。根據(jù)以上分散加載文件編譯生成的Hex文件會有兩個,分別如下:
Hex1:
:020000040000FA
:1000000018F09FE518F09FE518F09FE518F09FE5C0
。。。
Hex2:
:020000040000FA
:1040000090808FE20F0098E8080080E0081081E0BF
。。。
可以看出,生成的兩段Hex文件的起始地址是不同的,其中一段為中斷向量表;另一段為用戶映像文件。
?
4.固定變量內(nèi)存地址
嵌入式開發(fā)中,有時會需要在同一片內(nèi)的不同段程序(比如Bootloader和主程序間)間傳遞數(shù)據(jù),這時候往往需要固定變量地址。一般來言,C語言編寫的程序,變量地址是由C編譯器來分配內(nèi)存的,程序員無法實現(xiàn)知道變量地址。而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中變量的起始地址,以這種方法,可以固定任何全局變量的地址,以便其被其他系統(tǒng)訪問。
?
本文摘自:http://blog.sina.com.cn/s/blog_518318f50100i410.html
?
轉(zhuǎn)載于:https://www.cnblogs.com/it_mac/archive/2010/09/14/1825560.html
總結(jié)
以上是生活随笔為你收集整理的【转载】ADS分散加载文件使用总结(lpc23xx)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 阿里巴巴十周年晚会
- 下一篇: Java笔记(二)抽象类,接口,完全解耦