有如下分散加載文件:
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.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
{
* (+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中變量的起始地址,以這種方法,可以固定任何全局變量的地址,以便其被其他系統訪問。
上一篇:【嵌入式】S3C2410平臺移植linux 2.6.14內核
下一篇:基于ARM的流水燈仿真示例(第一次修改)
推薦閱讀
史海拾趣
Chip Quik公司在電子行業初創時,以其獨特的芯片焊接技術脫穎而出。該公司研發了一種新型的低溫焊接材料,能夠在不損壞周圍元件的情況下快速、準確地修復或更換芯片。這一創新技術迅速吸引了電子維修市場的關注,公司借此機會成功進入市場。
近年來,電子行業面臨著諸多變革和挑戰,如技術更新換代加速、市場需求變化等。為了應對這些變革,EG & G Inc公司不斷進行戰略調整和業務優化。公司加大了對新技術和新產品的研發力度,同時注重提高生產效率和降低成本。此外,公司還積極探索新的商業模式和市場機會,以保持其在行業中的領先地位并實現持續發展。
以上五個故事概述了EG & G Inc公司在電子行業中的重要發展歷程和關鍵事件。這些故事不僅展示了公司的實力和成就,也反映了其在不斷變革的市場環境中保持競爭力和持續發展的能力。
隨著電子技術的不斷發展,EG & G Inc公司不斷進行技術創新和產品升級。公司投入大量資源進行研發,成功推出了一系列具有競爭力的電子產品。其中,某款高精度測量儀器在市場上獲得了廣泛認可,成為了公司的明星產品。此外,公司還積極開拓新的應用領域,將電子技術應用于醫療、環保等多個領域,為公司帶來了新的增長點。
Dantona Industries公司的創始人,Daniel Tona,在電子工程領域擁有深厚的背景。他看到了電子行業的巨大潛力,決定創立自己的公司。起初,他只有一間小辦公室和幾個志同道合的伙伴。為了節省成本,他們經常需要親自采購材料、組裝產品,甚至進行市場推廣。在這個過程中,他們遇到了資金短缺、技術難題以及市場競爭等多重挑戰。然而,憑借對技術的執著和對市場的敏銳洞察力,Daniel Tona帶領團隊一步步克服困難,逐漸在電子行業站穩了腳跟。
面對日益增長的市場需求,CIRCUITCO公司意識到必須提升產能以滿足客戶需求。于是,公司投入巨資對生產線進行升級改造,引進先進的生產設備和技術。經過一系列的努力,公司的生產效率大幅提升,產品質量也得到了進一步保障。這一舉措不僅提高了公司的盈利能力,也為公司在未來的市場競爭中奠定了堅實基礎。
隨著產品線的不斷擴展,AOTC開始進軍國際市場。公司積極與各大電子廠商合作,將光電轉換器集成到各類電子產品中,從而實現了市場份額的快速增長。同時,公司還不斷投入研發,對產品進行升級迭代,以滿足市場不斷變化的需求。
我對嵌入式軟件開發的時間也不是很長,僅僅只有5年,算不上高手,也不是老手只能算是5歲的老菜鳥 ,在前面的3年里沒有高人指點,靠著自己摸索也寫了不少的程序吧,那時侯我沒有想過要寫出容易理解 和維護以及移植的問題,僅僅想著如何把這個功能 ...… 查看全部問答∨ |
品牌設計師 崗位要求: * 視覺傳達設計類專業本科以上學歷; * 有平面設計從業經驗,并有較多的作品; * 熟練使用Photoshop、Illustrator、CorelDraw等軟件,熟悉排版、印刷等后期制作; * 能快速、全面、準確的領悟產品信息,對產品設計有獨 ...… 查看全部問答∨ |
下面貼個freescale的coldfire v1系列中mcf51cn128 MCU的一個示例,利用定時器實現輸出捕獲的功能。 MCF51CN128是freescale去年推出的V1 CORE的coldfire處理器,具有一個以太網控制器,是實現以太網應用的不錯選擇 具有50MHZ的主頻 ------------- ...… 查看全部問答∨ |
|
我想問一下,NRF2401的芯片發送數據時,怎么檢測它到底發沒發信號,我看了許多關于這部分調試的文章,只是對這個問題一帶而過,我現在都不知道整個程序到底是哪出了問題。是發射呢,還是i接收呢? 還有一個小問題就是,我用的是MSP430單片機,沒有 ...… 查看全部問答∨ |
是不是在FPGA和硬盤之間還要一個什么轉接的芯片?怎么在網上也搜不這種芯片。。。求高人指點一下FPGA對SATA 2硬盤的讀寫整體構架和需要的硬件!??!… 查看全部問答∨ |
wince5.0系統 SD卡驅動已經可以發現識別卡 并且sdmemory.dll已經被sdbus加載 但是有一個問題: 如果sd卡沒有格式化(其實里面有東西,而且用其他的windows mobile手機能看見卡里面的東西) 那么就沒有sd盤符顯示但是在存儲管理器中能看見它的存在 ...… 查看全部問答∨ |
|
目前我司開發了一套ARM測試板,用的是菲利浦LPC2138型號的cpu,H-JTAG的引腳與cpu的連接正確,前幾天用H-JTAG SERVER檢測cpu的時候可以檢測,也可以在線編程,但是昨天不知道怎么回事用H-JTAG SERVER檢測cpu的時候就是檢測不到,但是沒有改任何的設置, ...… 查看全部問答∨ |
我以前做工控的,現在有個項目,需要實時系統,本來說基于pc104+IO擴展卡,由于IO數目比較多,PC104可能達不到要求,我現在想基于PC機+PCI或者是PXI,我目前的問題是 1.Vxworks支持哪些CPU,是不是只要是X86架構的都能夠運行。 2.哪 ...… 查看全部問答∨ |