国产毛片a精品毛-国产毛片黄片-国产毛片久久国产-国产毛片久久精品-青娱乐极品在线-青娱乐精品

ARM處理器的分散加載及特殊應(yīng)用研究

發(fā)布時間:2010-3-24 09:27    發(fā)布者:李寬
關(guān)鍵詞: arm , 處理器 , 加載 , 研究 , 應(yīng)用
引言

在當(dāng)今的嵌入式系統(tǒng)設(shè)計中,ARM處理器以價格便宜、功耗低、集成度高、外設(shè)資源豐富和易于使用的特點而得到廣泛的應(yīng)用;在速度和性能方面已達到或超過部分Pcl04嵌入式計算機的性能,而成本卻比相應(yīng)的PCI04計算機低很多,廣泛應(yīng)用于手機、GPS接收機、地圖導(dǎo)航、路由器、以太網(wǎng)交換機及其他民用和工業(yè)電子設(shè)備。

在一個采用ARM處理器的實時嵌入式系統(tǒng)中,目標(biāo)硬件常常由Flash、SRAM、SDRAM和 NVRAM(非易失性RAM)等存儲器組成,并定位于不同的物理地址范圍,那么,怎樣通過軟件更好地訪問和利用這些不同的存儲器并讓系統(tǒng)高效地運行?分散加載(scatter loading)就提供了這樣一種機制。它可以將內(nèi)存變量定位于不同的物理地址上的存儲器或端口,通過訪問內(nèi)存變量即可達到訪問外部存儲器或外設(shè)的目的;同時通過分散加載,讓大多數(shù)程序代碼在高速的內(nèi)部RAM中運行,從而使得系統(tǒng)的實時性大大增強。

1 ARM ELF目標(biāo)文件的主要構(gòu)成

ARM EIF(ExectItable and Linking Format)目標(biāo)文件主要由.Text段、.Data段、.BSS段構(gòu)成,其他段如.debug段、.comment段等與本文關(guān)系不大,不作介紹。

.Text 段由可執(zhí)行代碼組成,段類型為Code,屬性為RO:

.Data段由已初始化數(shù)據(jù)組成,段類型為Data,屬性為RO:

.BSS 段由未初始化數(shù)據(jù)組成,段類型為Zero,屬性為Rw,在應(yīng)用程序啟動時對該段的數(shù)據(jù)初始化為零。如果在分散加載文件中指定了UNINIT屬性,則在應(yīng)用程序啟動時不初始化該段。

2 分散加載的基本原理

假設(shè)一個采用ARM處理器的實時嵌入式系統(tǒng)目標(biāo)硬件的存儲器由ROM存儲器和RAM存儲器組成。當(dāng)一個嵌入式系統(tǒng)在仿真環(huán)境下調(diào)試完畢,需要脫機運行的時候,就需要將源程序編譯連接成可執(zhí)行目標(biāo)代碼并燒寫到ROM存儲器中。由于ROM存儲器存取數(shù)據(jù)的速率比RAM存儲器慢,因此,讓程序在ROM存儲器中運行。CPU每次取指令和取數(shù)據(jù)操作都要訪問ROM存儲器,這樣需要在 CPU的總線周期中插入等待周期,通過降低總線的速率來滿足訪問慢速的ROM存儲器,這樣勢必會降低CPU的運行速率和效率,因此,分散加載就顯得非常必要。

ARM的連接器提供了一種分散加載機制,在連接時可以根據(jù)分散加載文件(.scf文件)中指定的存儲器分配方案,將可執(zhí)行鏡像文件分成指定的分區(qū)并定位于指定的存儲器物理地址。這樣,當(dāng)嵌入式系統(tǒng)在復(fù)位或重新上電時,在對CPU相應(yīng)寄存器進行初始化后,首先執(zhí)行ROM存儲器的 Bootloader(自舉)代碼,根據(jù)連接時的存儲器分配方案,將相應(yīng)代碼和數(shù)據(jù)由加載地址拷貝到運行地址,這樣,定位在RAM存儲器的代碼和數(shù)據(jù)就在 RAM存儲器中運行,而不再從ROM存儲器中取數(shù)據(jù)或取指令,從而大大提高了CPU的運行速率和效率。

分散加載的基本原理如圖1所示。



3 分散加載文件語法

在一個實時嵌入式系統(tǒng)中,分散加載文件是對目標(biāo)硬件中的多個存儲器塊的分塊描述,它直接對應(yīng)目標(biāo)硬件存儲器的起始地址和范圍。同時,它在應(yīng)用程序連接時用于告訴連接器用戶程序代碼和數(shù)據(jù)的加載地址和運行地址,在連接時由連接器產(chǎn)生相應(yīng)的加載地址和運行地址符號,包括代碼和數(shù)據(jù)的加載起始地址、運行地址和長度等。這些符號用于上電后執(zhí)行啟動代碼的數(shù)據(jù)拷貝工作,啟動代碼根據(jù)這些符號,將指定代碼和數(shù)據(jù)由ROM中的加載地址拷貝到RAM中的運行地址中,從而實現(xiàn)代碼在高速RAM存儲器中的脫機運行。其語法格式如下:



注意:

①每一個分散加載文件必須至少包含一個根區(qū),每個根區(qū)的加載地址等于執(zhí)行地址。

②每一個引導(dǎo)區(qū)必須至少包含一個執(zhí)行區(qū),每一個執(zhí)行區(qū)必須至少包含一個代碼段或數(shù)據(jù)段;一個引導(dǎo)區(qū)可以包含幾個執(zhí)行區(qū),每一個執(zhí)行區(qū)只能屬于一個引導(dǎo)區(qū)。

4 分散加載時連接器生成的預(yù)定義符號

在編譯連接時如果指定了分散加載文件 (.scf文件),在連接后會自動生成如下變量:



5 重新實現(xiàn)_user_initial_stackheap()函數(shù)

分散加載機制提供了一種指定代碼和靜態(tài)數(shù)據(jù)布局的方法。使用分散加載時,必須重新放置堆棧和堆。

應(yīng)用程序的堆棧(stack)和堆 (heap)是在C庫函數(shù)初始化過程中建立起來的,在ADSl.2或更新版本中,在缺省狀態(tài)下C庫函數(shù)初始化代碼會將連接器生成的符號 Image$$ZI$$Limit地址作為堆的基地址。在分散加載時,連接器會將用戶的__user_initial_stackheap()函數(shù)代替C 庫函數(shù)默認的堆棧和堆初始化函數(shù),并將其連接到用戶的鏡像文件中,用戶可通過重新實現(xiàn)__user_initial_stackheap()函數(shù)來改變堆棧和堆的位置,而適合自己的目標(biāo)硬件。

__user_initial_staekheap()可以用C或匯編語言來實現(xiàn)。它必須返回如下參數(shù):

R0--堆基地址;

r1——堆棧基地址;

r2——堆長度限制值(需要的話);

r3 ——堆棧長度限制值(需要的話)。

當(dāng)用戶使用分散加載功能的時候,必須重新實現(xiàn)__user_initial_stackheap(),否則連接器會報錯:

Error:L6218E:Undefined symbol Image$$ZI$$一Limit(referred from sys—stackheap.o)。

注:Image$$ZI$$Iimit 變量為零初始化段(gI段)的末地址。未使用分散加載時,堆默認就定位在zI段的末地址,如圖2所示。

--user_initial_stackheap() 函數(shù)的實現(xiàn)有兩種方法。



(1)共用一個存儲區(qū)

匯編語言如下:



這種方式定義的堆棧和堆共用一個存儲區(qū),采用相向的增長方向,如圖3所示。



(2)使用兩個存儲區(qū)

匯編語言如下:



這種方式定義的堆棧和堆分別采用兩個不同存儲區(qū)。堆棧采用向下增長,從地址 Ox40000到地址0x20000;堆采用向上增長,從地址0x28000000到地址0x28080000,如圖4所示。

6  特殊應(yīng)用

6.1 定位目標(biāo)外設(shè)

使用分散加載,可以將用戶定義的結(jié)構(gòu)體或代碼定位到指定物理地址七的外設(shè),這種外設(shè)可以是定時器、實時時鐘、靜態(tài)SRAM或者是兩個處理器間用于數(shù)據(jù)和指令通信的雙端口存儲器等。在程序中不必直接訪問相應(yīng)外設(shè),只需訪問相應(yīng)的內(nèi)存變量即可實現(xiàn)對指定外設(shè)的操作,因為相應(yīng)的內(nèi)存變量定位在指定的外設(shè)上。這樣,對外設(shè)的訪問看不到相應(yīng)的指針操作,對結(jié)構(gòu)體成員的訪問即可實現(xiàn)對外設(shè)相應(yīng)存儲單元的訪問,讓程序員感覺到仿佛沒有外設(shè),只有內(nèi)存。

例如,一個帶有兩個32位寄存器的定時器外設(shè),在系統(tǒng)中的物理地址為0x04000000,其C語言結(jié)構(gòu)描述如下:



屬性UNINIT是避免在應(yīng)用程序啟動時對該執(zhí)行段的ZI數(shù)據(jù)段初始化為零。

在程序連接后,通過Image map文件可查看該ZI數(shù)據(jù)段的存儲器分配情況:

Execution Region TIMER(Base:0 x04000000,Size:0x00000008,Max:Oxffffffff,ABSOLUTE,UNINIT)Base.Addr Size Type Attr  Idx  E Section Name Object

0x04000000 0x00000008 Zero RW 32.bss timer_regs.o

從Image map文件可以看出,該TIMER執(zhí)行區(qū)定位在物理地址Ox04000000,即結(jié)構(gòu)體timer_regs定位在0x04000000,因此,在程序中對結(jié)構(gòu)體的操作即是對定時器的操作。

6.2定義超大型結(jié)構(gòu)體數(shù)組

分散加載機制在提供將指定代碼和數(shù)據(jù)定位在指定物理地址的能力的同時,也提供了一種代碼分割機制——可以將指定的零初始化段(ZI段)從可執(zhí)行代碼中分離出來。這樣最終生成的燒人ROM或Flash中的鏡像文件就不包括那部分分割了的零初始化段,即使該零初始化段再大,也不影響最終生成的鏡像文件的大小。但不采用分散加載機制,零初始化段在編譯連接后是直接生成到鏡像文件中的。它的大小直接影響最終要燒寫的文件的大小,且零初始化段的大小還取決于內(nèi)存的大小,它不能大到超過內(nèi)存的大小;而采用分散加載機制,可以將某個零初始化段定位到非內(nèi)存地址的一個存儲器外設(shè)上,如NVRAM(非易失性隨機存儲器)。

筆者曾在一個實際工程中采用這種分散加載機制,將一個2MB的結(jié)構(gòu)體數(shù)組定位到外部NVRAM中,用于記錄設(shè)備在工作過程中采集到的數(shù)據(jù);而在本系統(tǒng)中,ARM處理器的內(nèi)存只有256 KB,F(xiàn)lash存儲器也只有2 MB。如果不采用分散加載,程序根本無法運行,也不能燒寫到Flash中。

采用分散加載,把對復(fù)雜外設(shè)的訪問變成對結(jié)構(gòu)體數(shù)組的訪問,使程序代碼精簡易懂。對程序員來說,對結(jié)構(gòu)體數(shù)組的操作還是和內(nèi)存變量的操作一樣的。

結(jié)語

分散加載是嵌人式系統(tǒng)應(yīng)用中不可或缺的一種加載方式,ARM、DSP、 PowerPC和MIPS等嵌入式處理器,都離不開分散加載。這種分散加載的思想是通用的,只是不同處理器的實現(xiàn)方式不同。

本文詳細闡述了基于ARM處理器的分散加載方法及其特殊應(yīng)用,并以實際工程為例來說明怎樣實現(xiàn)分散加載及使用分散加載的好處。它是筆者在實際工程應(yīng)用中的心得體會,同時也是筆者工作經(jīng)驗的總結(jié),希望本文對從事嵌入式系統(tǒng)設(shè)計和應(yīng)用的工程技術(shù)人員能有所幫助。

參考文獻

   1. ARM Limited ARM ELF File Format 1998
   2. ARM Limited Application Note 48,Scatter Loading 1998
   3. ARM Limited Application Note 107,Embedded Software Development with ADS v1.2 2002

作者:桂林長海發(fā)展有限責(zé)任公司 夏爽
來源:單片機與嵌入式系統(tǒng)應(yīng)用  2009 (4)
本文地址:http://m.qingdxww.cn/thread-9794-1-1.html     【打印本頁】

本站部分文章為轉(zhuǎn)載或網(wǎng)友發(fā)布,目的在于傳遞和分享信息,并不代表本網(wǎng)贊同其觀點和對其真實性負責(zé);文章版權(quán)歸原作者及原出處所有,如涉及作品內(nèi)容、版權(quán)和其它問題,我們將根據(jù)著作權(quán)人的要求,第一時間更正或刪除。
您需要登錄后才可以發(fā)表評論 登錄 | 立即注冊

廠商推薦

  • Microchip視頻專區(qū)
  • 使用SAM-IoT Wx v2開發(fā)板演示AWS IoT Core應(yīng)用程序
  • 使用Harmony3加速TCP/IP應(yīng)用的開發(fā)培訓(xùn)教程
  • 集成高級模擬外設(shè)的PIC18F-Q71家族介紹培訓(xùn)教程
  • 探索PIC16F13145 MCU系列——快速概覽
  • 貿(mào)澤電子(Mouser)專區(qū)

相關(guān)在線工具

相關(guān)視頻

關(guān)于我們  -  服務(wù)條款  -  使用指南  -  站點地圖  -  友情鏈接  -  聯(lián)系我們
電子工程網(wǎng) © 版權(quán)所有   京ICP備16069177號 | 京公網(wǎng)安備11010502021702
快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 在线看黄页 | 91国内揄拍·国内精品对白 | 亚洲综合欧美在线 | 精品一区二区三区在线成人 | 逃离韩国动漫免费观看 | 久久精品中文字幕有码日本 | 天天操操操操操 | 成年性羞羞视频免费观看 | 中文字幕在线观看一区二区 | 欧美日韩精品在线播放 | 精品一区二区在线欧美日韩 | 免费的毛片视频 | 国产午夜精品一区二区三区小说 | 2021久久精品免费观看 | 国产一国产一级毛片视频在线 | 天天爽夜夜爽一区二区三区 | 日本国产在线视频 | 91精品国产福利在线观看性色 | 精品一区二区三区在线视频 | 向日葵视频app在线观看 | 日韩欧美色综合 | 热99re久久免费视精品频软件 | 男女男在线精品网站免费观看 | 日韩一区二区三区中文字幕 | 在线视频日韩欧美 | 色爽视频 | 996免费视频国产在线播放 | 欧美日韩国产在线成人网 | 亚洲艹 | 青青网站| 一级做a爱片特黄在线观看 一级做a爱片就在线看 | 四虎影视永久地址www成人污 | 国产乱人视频免费观看 | 日本高清va不卡视频在线观看 | 91免费观看在线网址 | 成年午夜 | 成人精品一区二区三区中文字幕 | 亚洲国产美女精品久久久久 | 免费一区二区三区久久 | 538精品一线 | 国产人成精品午夜在线观看 |