因?yàn)?a href="http://www.54549.cn/keyword/嵌入式" target="_blank" class="relatedlink">嵌入式應(yīng)用領(lǐng)域的多樣性,每一個(gè)系統(tǒng)都具有各自的特點(diǎn)。在進(jìn)行系統(tǒng)程序設(shè)計(jì)的時(shí)候,一定要進(jìn)行具體分析,充分利用這些特點(diǎn),揚(yáng)長(zhǎng)避短。 結(jié)合 ARM 架構(gòu)本身的一些特點(diǎn),在這里討論幾個(gè)常見(jiàn)的要點(diǎn)。 1.ARM 還是 Thumb? 在討論 ARM 還是 Thumb 之前,先說(shuō)明 ARM 內(nèi)核型號(hào)和 ARM 結(jié)構(gòu)體系之間的區(qū)別和聯(lián)系。 如圖-1所示,ARM 的結(jié)構(gòu)體系主要從版本 4 開(kāi)始,發(fā)展到了現(xiàn)在的版本 6,結(jié)構(gòu)體系的變化,對(duì)程序員而言最直接的影響就是指令集的變化。結(jié)構(gòu)體系的演變意味著指令集的不斷擴(kuò)展,值得慶幸的是 ARM 結(jié)構(gòu)體系的發(fā)展一直保持了向上兼容,不會(huì)造成老版本程序在新結(jié)構(gòu)體系上的不兼容。 ![]() 圖-1 ARM 結(jié)構(gòu)體系和處理器家族的演變發(fā)展 在圖中的橫坐標(biāo)上,顯示了每一個(gè)體系結(jié)構(gòu)上都含有眾多的處理器型號(hào),這是在同一體系結(jié)構(gòu)下根據(jù)硬件配置和存儲(chǔ)器系統(tǒng)的不同而作的進(jìn)一步細(xì)分。 需要注意的是通常我們用來(lái)區(qū)分 ARM 處理器家族的 ARM7、ARM9 或 ARM10,可能跨越不同的體系結(jié)構(gòu)。 在ARM的體系結(jié)構(gòu)版本4與5中, 還可以再細(xì)分出幾個(gè)小的擴(kuò)展版本: V4T、V5TE和V5TEJ,其區(qū)別如圖-2中所示,這些后綴名也反映在各自擁有的處理器型號(hào)上面,可以進(jìn)行直觀的分辨。V6 結(jié)構(gòu)體系因?yàn)榘艘郧鞍姹镜乃刑匦,所以不需要再進(jìn)行分類。 ![]() 圖-2 結(jié)構(gòu)體系特征 上面介紹了整個(gè) ARM 處理器家族的分布,主要是說(shuō)明在一個(gè)特定的平臺(tái)上編寫(xiě)程序的時(shí)候,一定要先弄清楚目標(biāo)的特性和一些細(xì)微的差別,特別是需要具體優(yōu)化特征的時(shí)候。 從 ARM 體系結(jié)構(gòu) V4T 以后,最大的變化是增加了一套 16 位的指令集——Thumb。到底在一個(gè)具體應(yīng)用中要否采用 Thumb呢?首先我們來(lái)分析一下 ARM和 Thumb 各自的特點(diǎn)和優(yōu)勢(shì)。先看下面一張性能分析圖: ![]() 圖-3 ARM 和 Thumb指令集的比較 圖中的縱坐標(biāo)是測(cè)試向量 Dhrystone 在 20MHz 頻率下運(yùn)行 1 秒鐘的結(jié)果, 其值越大表明性能越好;橫坐標(biāo)是系統(tǒng)存儲(chǔ)器系統(tǒng)的數(shù)據(jù)總線寬度。結(jié)果表明: (a) 當(dāng)系統(tǒng)具有32 位的數(shù)據(jù)總線寬度時(shí),ARM 比 Thumb有更好的性能表現(xiàn)。 (b) 當(dāng)系統(tǒng)的數(shù)據(jù)總線寬度小于32 位時(shí),Thumb比 ARM 的性能更好。 由此可見(jiàn), 并不是32位的ARM指令集性能一定強(qiáng)于16位的Thumb指令集,要具體情況具體分析?疾靷(gè)中的原因,其實(shí)不難發(fā)現(xiàn),因?yàn)楫?dāng)在一個(gè) 16 位存儲(chǔ)器系統(tǒng)里面取1 條 32位指令的時(shí)候,需要耗費(fèi)2 個(gè)存儲(chǔ)器訪問(wèn)周期;比之 32位的系統(tǒng),其速度正好大概下降一半左右。而 16 位指令在 32 位存儲(chǔ)器系統(tǒng)或16 位存儲(chǔ)器系統(tǒng)里的表現(xiàn)基本相同。正是存儲(chǔ)器造成的系統(tǒng)瓶頸導(dǎo)致了這個(gè)有趣的差別。 除了在窄帶寬系統(tǒng)里面的性能優(yōu)勢(shì)外, Thumb 指令的另外一個(gè)好處是代碼尺寸。同樣一段 C 代碼,用 Thumb 指令編譯的結(jié)果,其長(zhǎng)度大約只占 ARM 編譯結(jié)果的 65%左右,可以明顯地節(jié)省存儲(chǔ)器空間。在大多數(shù)情況下,緊湊的代碼和窄帶寬的存儲(chǔ)器系統(tǒng),還會(huì)帶來(lái)功耗上的優(yōu)勢(shì)。 當(dāng)然,如果在 32 位的系統(tǒng)上面,并且對(duì)系統(tǒng)性能要求很高的情況下,ARM是一個(gè)更好的選擇。畢竟在這種情況下,只有 32 位的指令集才能完全發(fā)揮 32位處理器的優(yōu)勢(shì)來(lái)。 因此,選擇 ARM 還是 Thumb,需要從存儲(chǔ)器開(kāi)銷和性能要求兩方面加以權(quán)衡考慮。 2.堆棧的分配 在圖-3 中,橫坐標(biāo)上還有一種情況,就是 16 位的存儲(chǔ)器寬度,但是堆棧空間是 32 位的。這種情況下無(wú)論 ARM 還是 Thumb,其性能表現(xiàn)都比單純的 16 位存儲(chǔ)器系統(tǒng)情況下要好。這是因?yàn)?ARM 和 Thumb 其指令集雖然分 32 位和 16位,但是堆棧全部是采用32 位的。因此在 16 位堆棧和 32 位堆棧的不同環(huán)境下,其性能當(dāng)然都會(huì)相差很多。這種差別還跟具體的應(yīng)用程序密切相關(guān),如果一個(gè)程 序堆棧的使用頻率相當(dāng)高,則這種性能差異很大;反之則要小一些。 在基于 ARM 的系統(tǒng)中,堆棧不僅僅被用來(lái)進(jìn)行諸如函數(shù)調(diào)用、中斷響應(yīng)等時(shí)候的現(xiàn)場(chǎng)保護(hù),還是程序局部變量和函數(shù)參數(shù)傳遞(如果大于4個(gè))的存儲(chǔ)空間。所以出于系統(tǒng)整體性能考慮,要給堆棧分配相對(duì)訪問(wèn)速度最快、數(shù)據(jù)寬度最大的存儲(chǔ)器空間。 一個(gè)嵌入式系統(tǒng)通常存在多種多樣的存儲(chǔ)器類型。設(shè)計(jì)的時(shí)候一定要先清楚每一種存儲(chǔ)器的訪問(wèn)速度,地址分配和數(shù)據(jù)線寬度。然后根據(jù)不同程序和目標(biāo)模塊對(duì)存儲(chǔ)器的不同要求進(jìn)行合理分配,以期達(dá)到最佳配置狀態(tài)。 3.ROM 還是 RAM 在 0 地址處? 顯然當(dāng)系統(tǒng)剛啟動(dòng)的時(shí)候,0 地址處肯定是某種類型的 ROM,里面存儲(chǔ)了系統(tǒng)的啟動(dòng)代碼。 但是很多靈活的系統(tǒng)設(shè)計(jì)中, 0 地址處的存儲(chǔ)器類型是可映射的。也就是說(shuō),可以通過(guò)軟件的方法,把別的存儲(chǔ)器(主要是快速的 RAM)分配以0 起始的地址。 這種做法的最主要目的之一是提高系統(tǒng)對(duì)中斷的反應(yīng)速度。因?yàn)槊恳粋(gè)中斷發(fā)生的時(shí)候,ARM 都需要從 0 地址處的中斷向量表開(kāi)始其中斷響應(yīng)流程,顯然把中斷向量表放在 RAM 里,比放在 ROM 里有更快的訪問(wèn)速度。因此,如果系統(tǒng)提供了這一類的地址重映射功能,軟件設(shè)計(jì)者一定要加以利用。 下面是一個(gè)典型的經(jīng)過(guò) 0 地址重映射之后的存儲(chǔ)空間分布圖,注意盡可能把速度要求最高的部分放置在系統(tǒng)里面訪問(wèn)速度最快、帶寬最寬的 RAM 里面。 ![]() 圖-4 系統(tǒng)存儲(chǔ)器分布的實(shí)例 4.存儲(chǔ)器地址重映射(memory remap) 存儲(chǔ)器地址重映射是當(dāng)前很多先進(jìn)控制器所具有的功能。在上一節(jié)中已經(jīng)提到了 0 地址處存儲(chǔ)器重映射的例子,簡(jiǎn)而言之,地址重映射就是可以通過(guò)軟件配置來(lái)改變一塊存儲(chǔ)器物理地址的一種機(jī)制或方法。 當(dāng)一段程序?qū)\(yùn)行自己的存儲(chǔ)器進(jìn)行重映射的時(shí)候,需要特別注意保證程序執(zhí)行流程在重映射前后的承接關(guān)系。下面是一種典型的存儲(chǔ)器地址重映射情況: ![]() 圖-5 存儲(chǔ)器重映射舉例 1 系統(tǒng)上電后的缺省狀態(tài)是 0地址上放有 ROM,這塊 ROM 有兩個(gè)地址:從0起始和從0x10000 起始,里面存儲(chǔ)了初始化代碼。當(dāng)進(jìn)行地址 remap以后,從 0起始的地址被定向到了 RAM 上,ROM 則只保留有唯一的從 0x10000 起始的地址了。 如果存儲(chǔ)在 ROM 里的 Reset_Handler 一直在0 – 0x4000的地址上運(yùn)行,則當(dāng)執(zhí)行完remap以后,下面的指令將從RAM 里預(yù)取,必然會(huì)導(dǎo)致程序執(zhí)行流程的中斷。根據(jù)系統(tǒng)特點(diǎn),可以用下面的辦法來(lái)解決這個(gè)問(wèn)題: (1) 上電后系統(tǒng)從 0 地址開(kāi)始自動(dòng)執(zhí)行,設(shè)計(jì)跳轉(zhuǎn)指令在 remap 發(fā)生前使 PC指針指向0x10000 開(kāi)始的 ROM 地址中去,因?yàn)椴煌刂?br /> 指向的是同一塊ROM,所以程序能夠順利執(zhí)行。 (2) 這時(shí)候 0 - 0x4000的地址空間空閑, 不被程序引用, 執(zhí)行remap后把 RAM引進(jìn)。因?yàn)槌绦蛞恢痹?0x10000 起始的 ROM 空間里 運(yùn)行,remap 對(duì)運(yùn)行流程沒(méi)有任何影響。 (3) 通過(guò)在 ROM 里運(yùn)行的程序,對(duì) RAM 進(jìn)行相應(yīng)的代碼和數(shù)據(jù)拷貝,完成應(yīng)用程序運(yùn)行的初始化。 下面是一段實(shí)現(xiàn)上述步驟的例程: ------------------------------------------------------------------------------------------------------- ENTRY ;啟動(dòng)時(shí),從 0 開(kāi)始,設(shè)法跳轉(zhuǎn)到“真”的ROM 地址(0x10000 開(kāi)始的空間里) LDR pc, =start ;insert vector table here … Start ;Begin of Reset_Handler ; 進(jìn)行 remap設(shè)置 LDR r1, =Ctrl_reg ;假定控制 remap的寄存器 LDR r0, [r1] ORR r0, r0, #Remap_bit ;假定對(duì)控制寄存器進(jìn)行 remap設(shè)置 STR r0, [r1] ;接下去可以進(jìn)行從 ROM 到 RAM 的代碼和數(shù)據(jù)拷貝 ------------------------------------------------------------------------------------------------------- 除此之外,還有另外一種常見(jiàn)的remap方式,如下圖: ![]() 圖-6 存儲(chǔ)器重映射舉例 2 原來(lái) RAM 和 ROM 各有自己的地址, 進(jìn)行重映射以后 RAM 和 ROM 的地址都發(fā)生了變化,這種情況下,可以采用以下的方案: (1) 上電后,從 0 地址的 ROM 開(kāi)始往下執(zhí)行。 (2) 根據(jù)映射前的地址,對(duì) RAM 進(jìn)行必要的代碼和數(shù)據(jù)拷貝。 (3) 拷貝完成后,進(jìn)行 remap操作。 (4) 因?yàn)?RAM 在 remap 前準(zhǔn)備好了內(nèi)容,使得 PC 指針能繼續(xù)在 RAM 里取到正確的指令。 不同的系統(tǒng)可能會(huì)有多種靈活的 remap方案,根據(jù)上面提到的兩個(gè)例子,可以總結(jié)出最根本的考慮是: 要使程序指針在 remap以后能繼續(xù)往下得到正確的指令。 5. 根據(jù)目標(biāo)存儲(chǔ)器系統(tǒng)分散加載映像(scatterloading) Scatterloading 文件是 ARM 的工具鏈里面的一個(gè)特性,作為程序編譯過(guò)程中給連接器使用的一個(gè)參數(shù),用來(lái)指定最終生成的目標(biāo)映像文件運(yùn)行時(shí)的分布狀態(tài)。如果用戶程序映像只是如圖7 所示的最簡(jiǎn)狀態(tài),所有的可執(zhí)行代碼都集合放置在一起,那么可以不使用 Scatterloading 文件,直接用連接器的命令行選項(xiàng)就能夠完成設(shè)置: RO = 0x00000:表示映像的第一條指令開(kāi)始地址; RW = 0x10000:表示變量區(qū)的起始地址,變量區(qū)一定要位于 RAM 區(qū)。 ![]() 圖-7 簡(jiǎn)單的映像分布舉例 但是一個(gè)復(fù)雜的系統(tǒng)可能會(huì)把映像分割成幾個(gè)部分。如圖 8,系統(tǒng)中存在多種類型的存儲(chǔ)器,不能的代碼部分根據(jù)執(zhí)行性能優(yōu)化的考慮分布與不同的地方。 ![]() 圖-8 復(fù)雜的映像分布舉例 這時(shí)候不能通過(guò)簡(jiǎn)單的 RO、RW 參數(shù)來(lái)完成實(shí)現(xiàn)上述配置,就要用到scatterloading 文件了。在 scatterloading文件里,可以給編譯出來(lái)的各個(gè)目標(biāo)模塊指定運(yùn)行地址,下面的例子是針對(duì)圖8 的。 FLASH 0x20000 0x8000 { FLASH 0x20000 0x8000 { init.o (Init, +First) * (+RO) } 32bitRAM 0x0000 { vectors.o (Vect, +First) handlers.o (+RO) } STACK 0x1000 UNINIT { stackheap.o (stack) } : : 16bitRAM 0x10000 { * (+RW,+ZI) } HEAP 0x15000 UNINIT { stackheap.o (heap) } } 關(guān)于 scatterloading文件的詳細(xì)語(yǔ)法,請(qǐng)參閱 ARM 公司的相關(guān)手冊(cè)。 引證文獻(xiàn) 1. 辛鑫.蒙建波.羅根 由 C到ARM匯編指令及程序優(yōu)化 [期刊論文] -單片機(jī)與嵌入式系統(tǒng)應(yīng)用2007(06) 2. 楊志強(qiáng) 嵌入式系統(tǒng)設(shè)計(jì)與發(fā)展 [期刊論文] -青海師范大學(xué)學(xué)報(bào)(自然科學(xué)版)2005(03) 3. 鄧海峰.余慧英.袁可風(fēng) 一種嵌入式圖像處理平臺(tái)的設(shè)計(jì)與實(shí)現(xiàn) [期刊論文] -計(jì)算機(jī)應(yīng)用2005(z1) 4. 劉志勇 基于ARM的無(wú)線視頻傳輸硬件系統(tǒng)的初步研究與開(kāi)發(fā) [學(xué)位論文] 碩士2005 5. 劉峰雷 ARM9在新一代元件參數(shù)分析儀中的應(yīng)用 [學(xué)位論文] 碩士2005 6. 王雷 基于ARM微處理器的應(yīng)用研究 [學(xué)位論文] 碩士2005 7. 韓冰 車流量檢測(cè)信號(hào)處理系統(tǒng)設(shè)計(jì) [學(xué)位論文] 碩士2005 作 者:ARM中國(guó) 費(fèi)浙平 來(lái) 源:?jiǎn)纹瑱C(jī)與嵌入式系統(tǒng)應(yīng)用2003(10) |