| 目前越來(lái)越多的嵌入式系統設計開(kāi)始采用ARM9處理器。理解ARM9與ARM7的差別,以及如何針對ARM9進(jìn)行系統優(yōu)化,成為了一個(gè)令人關(guān)注的話(huà)題。本文通過(guò)對ARM9處理器的特點(diǎn)介紹,介紹針對ARM9處理器進(jìn)行系統優(yōu)化的一些有效方法。 隨著(zhù)更多應用在嵌入式系統中的實(shí)現,嵌入式系統設計向著(zhù)更高級、更復雜的方向發(fā)展。作為32位結構體系中的翹楚,ARM在各種應用領(lǐng)域里得到了極其廣泛的應用,成為目前國內電子設計領(lǐng)域里面的焦點(diǎn)之一(2005年一項針對國內嵌入式系統開(kāi)發(fā)者的調查表明,有63%的工程師把ARM作為32位CPU的首選)。過(guò)去幾年里,絕大部分ARM系統都是基于A(yíng)RM7處理器,最近一年里,基于A(yíng)RM9處理器的產(chǎn)品越來(lái)越多,研究ARM9的特點(diǎn)以及如何優(yōu)化從ARM7到ARM9的移植,成為很多嵌入式系統設計者所關(guān)注的熱點(diǎn)問(wèn)題。 我們慣稱(chēng)的ARM9系列中又存在A(yíng)RM9與ARM9E兩個(gè)系列,其中ARM9屬于A(yíng)RM v4T架構,典型處理器如ARM9TDMI和ARM922T;而ARM9E屬于A(yíng)RM v5TE架構,典型處理器如ARM926EJ和ARM946E。因為后者的芯片數量和應用更為廣泛,所以我們提到ARM9的時(shí)候更多地是特指ARM9E系列處理器(主要就是ARM926EJ和ARM946E這兩款處理器)。下面關(guān)于A(yíng)RM9的介紹也是更多地集中于A(yíng)RM9E。 ARM7處理器和ARM9E處理器的流水線(xiàn)差別 對嵌入式系統設計者來(lái)說(shuō),硬件通常是第一考慮的因素。針對處理器來(lái)說(shuō),流水線(xiàn)則是硬件差別的最明顯標志,不同的流水線(xiàn)設計會(huì )產(chǎn)生一系列硬件差異。讓我們來(lái)比較一下ARM7和ARM9E的流水線(xiàn),如圖1。 可以看到ARM9E從ARM7的3級流水線(xiàn)增加到了5級,ARM9E的流水線(xiàn)中容納了更多的邏輯操作,但是每一級的邏輯操作卻變得更為簡(jiǎn)單。比如原來(lái)ARM7的第三級流水,需要先內部讀取寄存器、然后進(jìn)行相關(guān)的邏輯和算術(shù)運算,接著(zhù)處理結果回寫(xiě),完成的動(dòng)作非常復雜;而在A(yíng)RM9E的5級流水中,寄存器讀取、邏輯運算、結果回寫(xiě)分散在不同的流水當中,使得每一級流水處理的動(dòng)作非常簡(jiǎn)潔。這就使得處理器的主頻可以大幅度地提高。因為每一級流水都對應CPU的一個(gè)時(shí)鐘周期,如果一級流水中的邏輯過(guò)于復雜,使得執行時(shí)間居高不下,必然導致所需的時(shí)鐘周期變長(cháng),造成CPU的主頻不能提升。所以流水線(xiàn)的拉長(cháng),有利于CPU主頻的提高。在常用的芯片生產(chǎn)工藝下,ARM7一般運行在100MHz左右,而ARM9E則至少在200MHz以上。 | | 圖1:ARM7的三級流水線(xiàn)與ARM9E的五級流水線(xiàn)。 | ARM9E處理器的存儲器子系統 像ARM926EJ和ARM946E這兩個(gè)最常見(jiàn)的ARM9E處理器中,都帶有一套存儲器子系統,以提高系統性能和支持大型操作系統。如圖2所示,一個(gè)存儲器子系統包含一個(gè)MMU(存儲器管理單元)或MPU(存儲器保護單元)、高速緩存(Cache)和寫(xiě)緩沖(Write Buffer);CPU通過(guò)該子系統與系統存儲器系統相連。 高速緩存和寫(xiě)緩存的引入是基于如下事實(shí),即處理器速度遠遠高于存儲器訪(fǎng)問(wèn)速度;如果存儲器訪(fǎng)問(wèn)成為系統性能的瓶頸,則處理器再快也是浪費,因為處理器需要耗費大量的時(shí)間在等待存儲器上面。高速緩存正是用來(lái)解決這個(gè)問(wèn)題,它可以存儲最近常用的代碼和數據,以最快的速度提供給CPU處理(CPU訪(fǎng)問(wèn)Cache不需要等待)。 MMU則是用來(lái)支持存儲器管理的硬件單元,滿(mǎn)足現代平臺操作系統內存管理的需要;它主要包括兩個(gè)功能:一是支持虛擬/物理地址映射,二是提供不同存儲器地址空間的保護機制。一個(gè)簡(jiǎn)單的例子可以幫助我們理解MMU的功能, 如圖3,在一個(gè)操作系統下,程序開(kāi)發(fā)人員都是在操作系統給定的API和編程模型下開(kāi)發(fā)程序;操作系統通常只開(kāi)放一個(gè)確定的存儲器地址空間給用戶(hù)。這樣就帶來(lái)一個(gè)直接的問(wèn)題,所有的應用程序都使用了相同的存儲器地址空間,如果這些程序同時(shí)啟動(dòng)的話(huà)(在現在的多任務(wù)系統中這是非常常見(jiàn)的),就會(huì )產(chǎn)生存儲器訪(fǎng)問(wèn)沖突。那操作系統是如何來(lái)避免這個(gè)問(wèn)題的呢? 操作系統會(huì )利用MMU硬件單元完成存儲器訪(fǎng)問(wèn)虛擬地址到物理地址的轉換。所謂虛擬地址就是程序員在程序中使用的邏輯地址,而物理地址則是真實(shí)存儲器單元的空間地址。MMU通過(guò)一定的規則,可以把相同的虛擬地址映射到不同的物理地址上去。這樣,即使有多個(gè)使用相同虛擬地址的程序進(jìn)程啟動(dòng),也可以通過(guò)MMU調度把它們映射到不同的物理地址上去,不會(huì )造成系統錯誤。 MMU處理地址映射功能之外,還能給不同的地址空間設置不同的訪(fǎng)問(wèn)屬性。比如操作系統把自己的內核程序地址空間設置為用戶(hù)模式下不可訪(fǎng)問(wèn),這樣的話(huà)用戶(hù)應用程序就無(wú)法訪(fǎng)問(wèn)到該空間,從而保證操作系統內核的安全性。MPU與MMU的區別在于它只有給地址空間設置訪(fǎng)問(wèn)屬性的功能而沒(méi)有地址映射功能。 Cache以及MMU等硬件單元的引入,給系統程序員的編程模型帶來(lái)了許多全新的變化。除了需要掌握基本的概念和使用方法之外,下面幾個(gè)針對系統優(yōu)化的點(diǎn)既有趣又重要: 1、系統實(shí)時(shí)性考慮 因為保存地址映射規則的頁(yè)表(Page Table)非常龐大,通常MMU中只是存儲器了常用的一小段頁(yè)表內容,大部分頁(yè)表內容都存儲于主存儲器里面;當調用新的地址映射規則時(shí),MMU可能需要讀取主存儲器來(lái)更新頁(yè)表。這在某些情況下會(huì )造成系統實(shí)時(shí)性的丟失。比如當需要執行一段關(guān)鍵的程序代碼時(shí),如果不巧這段代碼使用的地址空間不在當前MMU的頁(yè)表處理范圍里面,則MMU首先需要更新頁(yè)表,然后完成地址映射,接著(zhù)才能相應存儲器訪(fǎng)問(wèn);整個(gè)地址譯碼過(guò)程非常長(cháng),給實(shí)時(shí)性帶來(lái)非常大的不利影響。所以一般來(lái)說(shuō)帶MMU和Cache的系統在實(shí)時(shí)性上不如一些簡(jiǎn)單的處理器;不過(guò)也有一些辦法能夠幫助提高這些系統的實(shí)時(shí)效率。 一個(gè)簡(jiǎn)單的辦法是在需要的時(shí)候關(guān)閉MMU和Cache,這樣就變成一個(gè)簡(jiǎn)單處理器了,可以馬上提高系統實(shí)時(shí)性。當然很多情況下這不可行;在A(yíng)RM的MMU和Cache設計中,有一個(gè)鎖定的功能,就是說(shuō)你可以指定某一塊頁(yè)表在MMU中不會(huì )被更新掉,某一段代碼或數據可以在Cache中鎖定而不會(huì )被刷新掉;程序員可以利用這個(gè)功能來(lái)支持那些實(shí)時(shí)性要求最高的代碼,保證這些代碼始終能夠得到最快的響應和支持。 2、系統軟件優(yōu)化 在嵌入式系統開(kāi)發(fā)中,很多系統軟件優(yōu)化的方法都是相同和通用的,多數情況下這種規則也適用于A(yíng)RM9E架構上。如果你已經(jīng)是一個(gè)ARM7的編程高手,那么恭喜你,以前你掌握的優(yōu)化方法完全可以用在新的ARM9E平臺上,但是會(huì )有一些新的特性需要你加倍注意。最重要的便是Cache的作用,Cache本身并不帶來(lái)編程模型和接口的變化,但是如果我們考察Cache的行為,就能夠發(fā)現對于軟件優(yōu)化,Cache是有比較大的影響的。 Cache在物理上就是一塊高速SRAM,ARM9E的Cache組織寬度(cache line)都是4個(gè)word(也就是32個(gè)字節);Cache的行為受系統控制器控制而不是程序員,系統控制器會(huì )把最近訪(fǎng)問(wèn)存儲器地址附近的內容復制到Cache中去,這樣,當CPU訪(fǎng)問(wèn)下一個(gè)存儲器單元的時(shí)候(這個(gè)訪(fǎng)問(wèn)既可能是取指,也可能是數據),可能這個(gè)存儲器單元的內容已經(jīng)在Cache里了,所以CPU不需要真的到主存儲器上去讀取內容,而直接讀取Cache高速緩存上面的內容就可以了,從而加快了訪(fǎng)問(wèn)的速度。從Cache的工作原理我們可以看到,其實(shí)Cache的調度是基于概率的,CPU要訪(fǎng)問(wèn)的數據既可能在Cache中已經(jīng)存在(Cache hit),也可能沒(méi)有存在(Cache miss)。在Cache miss的情況下,CPU訪(fǎng)問(wèn)存儲器的速度會(huì )比沒(méi)有Cache的情況更壞,因為CPU除了要從存儲器訪(fǎng)問(wèn)數據以外,還需要處理Cache hit或miss的判斷,以及Cache內容的刷新等動(dòng)作。只有當Cache hit帶來(lái)的好處超過(guò)Cache miss帶來(lái)的犧牲的時(shí)候,系統的整體性能才能得到提高,所以Cache的命中率成為一個(gè)非常重要的優(yōu)化指標。 根據Cache行為的特點(diǎn),我們可以直觀(guān)地得到提高Cache命中率的一些方法,如盡可能把功能相關(guān)的代碼和數據放置在一起,減少跳轉次數;跳轉經(jīng)常會(huì )引起Cache miss。保持合適的函數大小,不要書(shū)寫(xiě)太多過(guò)小的函數體,因為線(xiàn)性的程序執行流程是最為Cache友好的。循環(huán)體最好放置在4個(gè)word對齊的地址,這樣就能保證循環(huán)體在Cache中是行對齊的,并且占用最少的Cache行數,使得被多次調用的循環(huán)體得到更好的執行效率。 性能和效率的提升 前面介紹了ARM9E相比于A(yíng)RM7性能上的提高,這不僅表現在A(yíng)RM9E有更快的主頻、更多的硬件特性上面,還體現在某些指令的執行效率上面。執行效率我們可以用CPU的時(shí)鐘周期數(Cycle)來(lái)衡量;運行同一段程序,ARM9E的處理器可以比ARM7節省大約30%左右的時(shí)鐘周期。 效率的提高主要來(lái)自于A(yíng)RM9E對于Load-Store指令執行效率的增強。我們知道在RISC架構的處理器中,程序中大約有30%的指令是Load-Store指令,這些指令的效率對系統效率的貢獻是最明顯的。ARM9E中有兩個(gè)因素幫助提高Load-Store指令的效率: 1)ARM9內核是哈佛架構,擁有獨立的指令和數據總線(xiàn);相對應,ARM7內核是指令和數據總線(xiàn)復用的馮?諾依曼架構。 2)ARM9的5級流水線(xiàn)設計把存儲器訪(fǎng)問(wèn)和寄存器寫(xiě)回放在不同的流水上面。 兩者結合,使得在指令流的執行過(guò)程中每個(gè)CPU時(shí)鐘周期都可以完成一個(gè)Load或Store指令。下面的表格比較了ARM7和ARM9處理器之間的Load-Store指令。從中可以看出所有的Store指令ARM9比ARM7省1個(gè)周期,Load指令可以省2個(gè)周期(在沒(méi)有互鎖的情況下,編譯工具能夠通過(guò)編譯優(yōu)化消除大多數的互鎖可能)。 綜合各種因素,ARM9E處理器擁有非常強大的性能。但是在實(shí)際的系統設計中,設計人員并不總是把處理器性能開(kāi)到最大,理想情況是把處理器和系統運行頻率降低,使得性能剛好能滿(mǎn)足應用需求;達到節省功耗和成本的目的。在評估系統能夠提供的處理器能力過(guò)程中,DMIPS指標被很多人采用;同時(shí)它也被廣泛應用于不同處理器間的性能比較。 但是用DMIPS來(lái)衡量處理器性能存在很大的缺陷。DMIPS并非字面上每秒百萬(wàn)條指令的意思,它是一個(gè)測量CPU運行一個(gè)叫Dhrystone的測試程序時(shí)表現出來(lái)的相對性能高低的一個(gè)單位(很多場(chǎng)合人們也習慣用MIPS作為這個(gè)性能指標的單位)。因為基于程序的測試容易受到惡意優(yōu)化的干擾,并且DMIPS指標值的發(fā)布不受任何機構的監督,所以使用DMIPS進(jìn)行評估時(shí)要慎重。例如對Dhrystone測試程序進(jìn)行不同的編譯處理,在同一個(gè)處理器上運行也可以得出差別很大的結果,如圖4中是ARM926EJ在32位0等待存儲器上運行測試程序的結果。ARM一直采用比較保守的值作為CPU的DMIPS標稱(chēng)值,如ARM926EJ是1.1DMPS/MHz。 | | 圖4:不同測試條件下ARM926EJ處理器的DMIPS值。 | DMIPS另外一個(gè)缺點(diǎn)是不能測量處理器的數字信號處理能力和Cache/MMU子系統的性能。因為Dhrystone測試程序不包含DSP表達式,只包含一些整型運算和字符串處理,并且測試程序偏小,幾乎可以完整地放在Cache里面運行而無(wú)需與外部存儲器進(jìn)行交互。這樣就難以反映處理器在一個(gè)真實(shí)系統中的真正性能。 一種值得鼓勵的評估方法是站在系統的角度看問(wèn)題,而不僅僅拘泥于CPU本身;而系統性能評估最好的測試向量就是用戶(hù)應用程序或相近的測試程序,這是用戶(hù)所需的最真實(shí)的結果。 ARM9E處理器的DSP運算能力 伴隨應用程序的多樣化和復雜化,諸如多媒體、音視頻功能在嵌入式系統里面也是全面開(kāi)花。這些應用需要相當的DSP處理能力;如果是在傳統的RISC架構上實(shí)現這些算法,所需的資源(頻率和存儲器等)會(huì )非常不經(jīng)濟。ARM9E處理器一個(gè)非常重要的優(yōu)勢就是擁有輕量級的DSP處理能力,以非常小的成本(CPU增加功能需要增加硬件)換來(lái)了非常實(shí)用的DSP性能。 因為CPU的DSP能力并不直接反映在像DMIPS這樣的評測指標中,同時(shí)像以前的ARM7處理器中也沒(méi)有類(lèi)似的概念;所以這一點(diǎn)對所有使用ARM9E處理器進(jìn)行開(kāi)發(fā)的人來(lái)說(shuō),都是需要注意的一個(gè)要點(diǎn)。 ARM9E的DSP擴展指令如表2所示,主要包括三個(gè)類(lèi)型。 1)單周期的16x16和32x16 MAC操作,因為數字信號處理中甚少32位寬的操作數,在32位寄存器中可以對操作數分段運算顯得非常有用。 2)對原有的算術(shù)運算指令增加了飽和處理擴展,所謂飽和運算,就是當運算結果大于一個(gè)上限或小于一個(gè)下限時(shí),結果就等于上限或是下限;飽和處理在音頻數據和視頻像素處理中普遍使用,現在一條單周期飽和運算指令就能夠完成普通RISC指令“運算-判斷-取值”這一系列操作。 3)前導零(CLZ)運算指令,提高了歸一化和浮點(diǎn)運算以及除法操作的性能。 以流行的MP3解碼程序為例。整個(gè)解碼過(guò)程中前端的三個(gè)步驟是運算量最大的,包括比特流的讀入(解包)、霍夫曼譯碼還有反量化采樣(逆變換)。ARM9E的DSP指令正好可以高效地完成這些運算。以44.1 KHz@128 kbps碼率的MP3音樂(lè )文件為例,ARM7TDMI需要占用20MHz以上的資源,而ARM926EJ則只要小于10MHz的資源(詳細數據可參考網(wǎng)站http://www.spiritdsp.com/mp3_arm.html),充分體現了ARM9E的DSP處理能力。 本文總結 在從ARM7到ARM9的平臺轉變過(guò)程中,有一件事情是非常值得慶幸的,即ARM9E能夠完全地向后兼容ARM7上的軟件;并且開(kāi)發(fā)人員面對的編程模型和架構基礎也保持一致。但是畢竟ARM9E中增加了很多新的特性,為了充分利用這些新的資源,把系統性能優(yōu)化好,需要我們對ARM9E做更多深入地了解。 作者:費浙平,技術(shù)行銷(xiāo)經(jīng)理,ARM中國公司 |