當(dāng)前位置:首頁(yè) > 嵌入式 > 嵌入式教程
[導(dǎo)讀]ARM處理器的分散加載及特殊應(yīng)用研究

摘要 從ARM ELF目標(biāo)文件主要構(gòu)成出發(fā),詳細(xì)介紹了分散加載的基本原理、分散加載文件的語(yǔ)法、分散加載時(shí)連接器生成的預(yù)定義符號(hào)及要重新實(shí)現(xiàn)的函數(shù)等;以定位目標(biāo)外設(shè)和定義超大型結(jié)構(gòu)體數(shù)組兩項(xiàng)應(yīng)用來(lái)加以說(shuō)明,并給出完整的工程實(shí)例和Bootloader代碼。這些都已經(jīng)在實(shí)際工程中多次應(yīng)用和驗(yàn)證,是筆者實(shí)際工程項(xiàng)目的萃取。
關(guān)鍵詞 分散加載 嵌入式系統(tǒng) Scatter Loading Bootloader ARM ELF


引 言
    在當(dāng)今的嵌入式系統(tǒng)設(shè)計(jì)中,ARM處理器以價(jià)格便宜、功耗低、集成度高、外設(shè)資源豐富和易于使用的特點(diǎn)而得到廣泛的應(yīng)用;在速度和性能方面已達(dá)到或超過部分PC104嵌入式計(jì)算機(jī)的性能,而成本卻比相應(yīng)的PC104計(jì)算機(jī)低很多,廣泛應(yīng)用于手機(jī)、GPS接收機(jī)、地圖導(dǎo)航、路由器、以太網(wǎng)交換機(jī)及其他民用和工業(yè)電子設(shè)備。
    在一個(gè)采用ARM處理器的實(shí)時(shí)嵌入式系統(tǒng)中,目標(biāo)硬件常常由Flash、SRAM、SDRAM和NVRAM(非易失性RAM)等存儲(chǔ)器組成,并定位于不同的物理地址范圍,那么,怎樣通過軟件更好地訪問和利用這些不同的存儲(chǔ)器并讓系統(tǒng)高效地運(yùn)行?分散加載(scatter loading)就提供了這樣一種機(jī)制。它可以將內(nèi)存變量定位于不同的物理地址上的存儲(chǔ)器或端口,通過訪問內(nèi)存變量即可達(dá)到訪問外部存儲(chǔ)器或外設(shè)的目的;同時(shí)通過分散加載,讓大多數(shù)程序代碼在高速的內(nèi)部RAM中運(yùn)行,從而使得系統(tǒng)的實(shí)時(shí)性大大增強(qiáng)。


1 ARM ELF目標(biāo)文件的主要構(gòu)成
    ARM ELF(Executable 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)用程序啟動(dòng)時(shí)對(duì)該段的數(shù)據(jù)初始化為零。如果在分散加載文件中指定了UNINIT屬性,則在應(yīng)用程序啟動(dòng)時(shí)不初始化該段。


2 分散加載的基本原理
    假設(shè)一個(gè)采用ARM處理器的實(shí)時(shí)嵌入式系統(tǒng)目標(biāo)硬件的存儲(chǔ)器由ROM存儲(chǔ)器和RAM存儲(chǔ)器組成。當(dāng)一個(gè)嵌入式系統(tǒng)在仿真環(huán)境下調(diào)試完畢,需要脫機(jī)運(yùn)行的時(shí)候,就需要將源程序編譯連接成可執(zhí)行目標(biāo)代碼并燒寫到ROM存儲(chǔ)器中。由于ROM存儲(chǔ)器存取數(shù)據(jù)的速率比RAM存儲(chǔ)器慢,因此,讓程序在ROM存儲(chǔ)器中運(yùn)行。CPU每次取指令和取數(shù)據(jù)操作都要訪問ROM存儲(chǔ)器,這樣需要在CPU的總線周期中插入等待周期,通過降低總線的速率來(lái)滿足訪問慢速的ROM存儲(chǔ)器,這樣勢(shì)必會(huì)降低CPU的運(yùn)行速率和效率,因此,分散加載就顯得非常必要。
    ARM的連接器提供了一種分散加載機(jī)制,在連接時(shí)可以根據(jù)分散加載文件(.scf文件)中指定的存儲(chǔ)器分配方案,將可執(zhí)行鏡像文件分成指定的分區(qū)并定位于指定的存儲(chǔ)器物理地址。這樣,當(dāng)嵌入式系統(tǒng)在復(fù)位或重新上電時(shí),在對(duì)CPU相應(yīng)寄存器進(jìn)行初始化后,首先執(zhí)行ROM存儲(chǔ)器的Bootloader(自舉)代碼,根據(jù)連接時(shí)的存儲(chǔ)器分配方案,將相應(yīng)代碼和數(shù)據(jù)由加載地址拷貝到運(yùn)行地址,這樣,定位在RAM存儲(chǔ)器的代碼和數(shù)據(jù)就在RAM存儲(chǔ)器中運(yùn)行,而不再?gòu)腞OM存儲(chǔ)器中取數(shù)據(jù)或取指令,從而大大提高了CPU的運(yùn)行速率和效率。分散加載的基本原理如圖1所示。

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

   
    注意:
    ①每一個(gè)分散加載文件必須至少包含一個(gè)根區(qū),每個(gè)根區(qū)的加載地址等于執(zhí)行地址。
    ②每一個(gè)引導(dǎo)區(qū)必須至少包含一個(gè)執(zhí)行區(qū),每一個(gè)執(zhí)行區(qū)必須至少包含一個(gè)代碼段或數(shù)據(jù)段;一個(gè)引導(dǎo)區(qū)可以包含幾個(gè)執(zhí)行區(qū),每一個(gè)執(zhí)行區(qū)只能屬于一個(gè)引導(dǎo)區(qū)。


4 分散加載時(shí)連接器生成的預(yù)定義符號(hào)
    在編譯連接時(shí)如果指定了分散加載文件(.scf文件),在連接后會(huì)自動(dòng)生成如下變量:

   
5 重新實(shí)現(xiàn)_user_initial_stEickheap()函數(shù)
    分散加載機(jī)制提供了一種指定代碼和靜態(tài)數(shù)據(jù)布局的方法。使用分散加載時(shí),必須重新放置堆棧和堆。
    應(yīng)用程序的堆棧(stack)和堆(heap)是在C庫(kù)函數(shù)初始化過程中建立起來(lái)的,在ADSl.2或更新版本中,在缺省狀態(tài)下C庫(kù)函數(shù)初始化代碼會(huì)將連接器生成的符號(hào)Image$$ZI$$Limit地址作為堆的基地址。在分散加載時(shí),連接器會(huì)將用戶的__user_initidl_stackheap()函數(shù)代替C庫(kù)函數(shù)默認(rèn)的堆棧和堆初始化函數(shù),并將其連接到用戶的鏡像文件中,用戶可通過重新實(shí)現(xiàn)__user_initial_stackheap()函數(shù)來(lái)改變堆棧和堆的位置,從而適合自己的目標(biāo)硬件。

    __user_initial_stackheap()可以用C或匯編語(yǔ)言來(lái)實(shí)現(xiàn)。它必須返回如下參數(shù):

    r0—堆基地址;

    r1—堆棧基地址;

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

    r3—堆棧長(zhǎng)度限制值(需要的話)。
    當(dāng)用戶使用分散加載功能的時(shí)候,必須重新實(shí)現(xiàn)一user_initial_staacklaeap(),否則連接器會(huì)報(bào)錯(cuò):
    Error:L6218E:Undefined symbol Imager$$ZI$$一Limit(referred from sys_stackheap.o)。
    注:Image$$ZI$$Limit變量為零初始化段(ZI段)的末地址。未使用分散加載時(shí),堆默認(rèn)就定位在ZI段的末地址,如圖2所示。

[!--empirenews.page--]

    __user_initial_stackheap()函數(shù)的實(shí)現(xiàn)有兩種方法。
    (1)共用一個(gè)存儲(chǔ)區(qū)
    匯編語(yǔ)言如下:

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

    (2)使用兩個(gè)存儲(chǔ)區(qū)
    匯編語(yǔ)言如下:

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

6 特殊應(yīng)用[!--empirenews.page--]
6. 1 定位目標(biāo)外設(shè)
    使用分散加載,可以將用戶定義的結(jié)構(gòu)體或代碼定位到指定物理地址上的外設(shè),這種外設(shè)可以是定時(shí)器、實(shí)時(shí)時(shí)鐘、靜態(tài)SRAM或者是兩個(gè)處理器間用于數(shù)據(jù)和指令通信的雙端口存儲(chǔ)器等。在程序中不必直接訪問相應(yīng)外設(shè),只需訪問相應(yīng)的內(nèi)存變量即可實(shí)現(xiàn)對(duì)指定外設(shè)的操作,因?yàn)橄鄳?yīng)的內(nèi)存變量定位在指定的外設(shè)上。這樣,對(duì)外設(shè)的訪問看不到相應(yīng)的指針操作,對(duì)結(jié)構(gòu)體成員的訪問即可實(shí)現(xiàn)對(duì)外設(shè)相應(yīng)存儲(chǔ)單元的訪問,讓程序員感覺到仿佛沒有外設(shè),只有內(nèi)存。
    例如,一個(gè)帶有兩個(gè)32位寄存器的定時(shí)器外設(shè),在系統(tǒng)中的物理地址為Ox04000000,其C語(yǔ)言結(jié)構(gòu)描述如下:

   
    要使用分散加載將上述結(jié)構(gòu)體定位到Ox04000000的物理地址,可以將上述結(jié)構(gòu)體放在一個(gè)文件名為timer_regs.c中,并在分散加載文件中指定即可,如下:


    屬性UNINIT是避免在應(yīng)用程序啟動(dòng)時(shí)對(duì)該執(zhí)行段的ZI數(shù)據(jù)段初始化為零。
    在程序連接后,通過Image map文件可查看該ZI數(shù)據(jù)段的存儲(chǔ)器分配情況:
    Execution Region TIMER(Base:Ox04000000,Size:0x00000008,Max:0xffffffff,ABSOLUTE,UNINIT)Base Addr Size Type Attr Idx E Section Name 0bi ectOx04000000 0x00000008 Zero RW 32.bss tlmer_regs.o從Image map文件可以看出,該TIMER執(zhí)行區(qū)定位在物理地址0x04000000,即結(jié)構(gòu)體timer_regs定位在Ox04000000,因此,在程序中對(duì)結(jié)構(gòu)體的操作即是對(duì)定時(shí)器的操作。
6.2 定義超大型結(jié)構(gòu)體數(shù)組
    分散加載機(jī)制在提供將指定代碼和數(shù)據(jù)定位在指定物理地址的能力的同時(shí),也提供了一種代碼分割機(jī)制——可以將指定的零初始化段(ZI段)從可執(zhí)行代碼中分離出來(lái)。這樣最終生成的燒入ROM或Flash中的鏡像文件就不包括那部分分割了的零初始化段,即使該零初始化段再大,也不影響最終生成的鏡像文件的大小。但不采用分散加載機(jī)制,零初始化段在編譯連接后是直接生成到鏡像文件中的。它的大小直接影響最終要燒寫的文件的大小,且零初始化段的大小還取決于內(nèi)存的大小,它不能大到超過內(nèi)存的大小;而采用分散加載機(jī)制,可以將某個(gè)零初始化段定位到非內(nèi)存地址的一個(gè)存儲(chǔ)器外設(shè)上,如NVRAM(非易失性隨機(jī)存儲(chǔ)器)。
    筆者曾在一個(gè)實(shí)際工程中采用這種分散加載機(jī)制,將一個(gè)2MB的結(jié)構(gòu)體數(shù)組定位到外部NVRAM中,用于記錄設(shè)備在工作過程中采集到的數(shù)據(jù);而在本系統(tǒng)中,ARM處理器的內(nèi)存只有256 KB,F(xiàn)lash存儲(chǔ)器也只有2 MB。如果不采用分散加載,程序根本無(wú)法運(yùn)行,也不能燒寫到Flash中。
    采用分散加載,把對(duì)復(fù)雜外設(shè)的訪問變成對(duì)結(jié)構(gòu)體數(shù)組的訪問,使程序代碼精簡(jiǎn)易懂。對(duì)程序員來(lái)說(shuō),對(duì)結(jié)構(gòu)體數(shù)組的操作還是和內(nèi)存變量的操作一樣的。
    編者注:本文為期刊縮略版,全文見本刊網(wǎng)站www.mesnet.com.cn。


結(jié) 語(yǔ)
    分散加載是嵌入式系統(tǒng)應(yīng)用中不可或缺的一種加載方式,ARM、DSP、PowerPC和MIPS等嵌入式處理器,都離不開分散加載。這種分散加載的思想是通用的,只是不同處理器的實(shí)現(xiàn)方式不同。
    本文詳細(xì)闡述了基于ARM處理器的分散加載方法及其特殊應(yīng)用,并以實(shí)際工程為例來(lái)說(shuō)明怎樣實(shí)現(xiàn)分散加載及使用分散加載的好處。它是筆者在實(shí)際工程應(yīng)用中的心得體會(huì),同時(shí)也是筆者工作經(jīng)驗(yàn)的總結(jié),希望本文對(duì)從事嵌入式系統(tǒng)設(shè)計(jì)和應(yīng)用的工程技術(shù)人員能有所幫助。

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

倫敦2024年8月29日 /美通社/ -- 英國(guó)汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時(shí)1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動(dòng) BSP

北京2024年8月28日 /美通社/ -- 越來(lái)越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來(lái)越多業(yè)務(wù)中斷的風(fēng)險(xiǎn),如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對(duì)日本游戲市場(chǎng)的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)開幕式在貴陽(yáng)舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語(yǔ)權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對(duì)環(huán)境變化,經(jīng)營(yíng)業(yè)績(jī)穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤(rùn)率延續(xù)升勢(shì) 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長(zhǎng) 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競(jìng)爭(zhēng)力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競(jìng)爭(zhēng)優(yōu)勢(shì)...

關(guān)鍵字: 通信 BSP 電信運(yùn)營(yíng)商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺(tái)與中國(guó)電影電視技術(shù)學(xué)會(huì)聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會(huì)上宣布正式成立。 活動(dòng)現(xiàn)場(chǎng) NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長(zhǎng)三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會(huì)上,軟通動(dòng)力信息技術(shù)(集團(tuán))股份有限公司(以下簡(jiǎn)稱"軟通動(dòng)力")與長(zhǎng)三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉