日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【转载】ADS分散加载文件使用总结(lpc23xx)

發布時間:2025/3/15 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【转载】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為加載區的名稱,其后面的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???????
??? {
??????? * (+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://blog.sina.com.cn/s/blog_518318f50100i410.html

?

轉載于:https://www.cnblogs.com/it_mac/archive/2010/09/14/1825560.html

總結

以上是生活随笔為你收集整理的【转载】ADS分散加载文件使用总结(lpc23xx)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。