相關(guān)閱讀:如何實(shí)現(xiàn)高性能的DSP處理(上) Blackfin 的存儲(chǔ)器體系 為了使第一部分的討論更加透明化,現(xiàn)在對(duì)Blackfin的存儲(chǔ)器結(jié)構(gòu)加以描述。Blackfin的存儲(chǔ)系統(tǒng)也提供一些“按鈕”,以便開(kāi)發(fā)者可以將其打開(kāi)從而提高系統(tǒng)性能。我們將要討論怎樣才能最充分地利用這些“按鈕”。 Blackfin有三級(jí)存儲(chǔ)結(jié)構(gòu)。第1級(jí)(L1)存儲(chǔ)器離內(nèi)核最近,其工作速率為處理器的內(nèi)核時(shí)鐘頻率(Blackfin典型頻率為600MHz),并為指令和數(shù)據(jù)提供單周期存取操作。典型的L1存儲(chǔ)器可存儲(chǔ)幾十KB,還可根據(jù)SRAM 或 cache進(jìn)行調(diào)配。 芯片內(nèi)部的第2級(jí)(L2)存儲(chǔ)器位于芯片內(nèi)部但離處理器內(nèi)核較遠(yuǎn)。對(duì)該存儲(chǔ)器中指令和數(shù)據(jù)的訪問(wèn)可能要用幾個(gè)周期。芯片內(nèi)部L2級(jí)存儲(chǔ)器容量一般為幾百KB,典型的有128KB和256KB。 芯片外部L2級(jí)存儲(chǔ)器位于芯片外部,因此所提供的存取操作也最為耗時(shí)。它工作頻率為系統(tǒng)時(shí)鐘,該時(shí)鐘頻率通常為133MHz。但是芯片外部L2級(jí)存儲(chǔ)器容量往往很大,典型的有幾百兆字節(jié)。 中斷處理 大多數(shù)嵌入式系統(tǒng)都含有中斷,因此適當(dāng)?shù)靥幚碇袛喾浅V匾R话阈枰私鈨蓚(gè)問(wèn)題:每個(gè)中斷服務(wù)程序耗費(fèi)多少時(shí)間,以及一個(gè)中斷服務(wù)程序是否正在阻止其他關(guān)鍵代碼的執(zhí)行。如果系統(tǒng)支持中斷嵌套,例如能夠中斷一個(gè)正在執(zhí)行的低優(yōu)先權(quán)的中斷,就還有必要知道如何實(shí)現(xiàn)最好的嵌套中斷。 在Blackfin中,如果一個(gè)中斷正在執(zhí)行,其他中斷默認(rèn)是關(guān)閉的。然而,開(kāi)發(fā)者可以通過(guò)將正在運(yùn)行的中斷服務(wù)子程序(ISR)的返回地址存入堆棧中來(lái)激活一個(gè)更高優(yōu)先權(quán)的中斷(即嵌套中斷)。中斷嵌套保證了優(yōu)先權(quán)高的中斷不會(huì)被優(yōu)先權(quán)低的中斷阻止。為了使這一過(guò)程更加簡(jiǎn)單,ADI公司提供了一個(gè)“回調(diào)管理器”,它能保證中斷被的及時(shí)響應(yīng),且不會(huì)被阻止優(yōu)先權(quán)高的中斷。與DMA優(yōu)先權(quán)類似,Blackfin開(kāi)發(fā)者也可以為中斷指定優(yōu)先權(quán)以滿足開(kāi)發(fā)需求。 存儲(chǔ)器注意事項(xiàng) 首先討論指令放置,也就是應(yīng)該把寫(xiě)好的指令放在存儲(chǔ)器的哪個(gè)地方?前面已經(jīng)討論過(guò)要盡可能地將程序代碼放置在最快速運(yùn)行的存儲(chǔ)區(qū)中這一思想,當(dāng)整個(gè)應(yīng)用程序都能放置于內(nèi)部存儲(chǔ)器時(shí),所有工作就變得十分簡(jiǎn)單。但遺憾的是,情況通常并非如此,很有可能要將程序代碼配置在內(nèi)部存儲(chǔ)器和外部可通過(guò)緩存訪問(wèn)的存儲(chǔ)器。 這一過(guò)程應(yīng)如何入手處理呢?首先就是應(yīng)該確定關(guān)鍵程序代碼段的長(zhǎng)度(以字節(jié)為單位),所謂“關(guān)鍵”,是指執(zhí)行最頻繁的程序代碼子集。而利用軟件仿真或程序代碼評(píng)測(cè)工具是一個(gè)很好的辦法,它可以確定哪部分程序代碼執(zhí)行最為頻繁,這一部分程序代碼應(yīng)放入最快速的內(nèi)部SRAM存儲(chǔ)器(即L1存儲(chǔ)器)。 ADI公司提供了一款名為PGO鏈接器的配置工具,可以實(shí)現(xiàn)該功能。該工具在VisualDSP++開(kāi)發(fā)環(huán)境下運(yùn)行,實(shí)現(xiàn)了鏈接時(shí)間配置導(dǎo)引優(yōu)化(PGO)。它能將應(yīng)用程序的運(yùn)行配置與程序優(yōu)化技術(shù)結(jié)合起來(lái),從而得到最有效的代碼布局(如圖3)。程序代碼被劃分為越小的函數(shù),該工具就越能靈活地將執(zhí)行最頻繁的程序放在最快的存儲(chǔ)器。一種極端情況是,如果你的程序代碼只包含一個(gè)函數(shù),且大小超出了內(nèi)部存儲(chǔ)器容量,該工具只能將整個(gè)模塊都放在外部存儲(chǔ)器。 當(dāng)關(guān)鍵程序代碼太大,不能完全配置到內(nèi)部L1存儲(chǔ)器時(shí)怎么辦?某些處理器上還有片內(nèi)L2存儲(chǔ)器,雖然L2比L1存儲(chǔ)器慢,但仍比外部存儲(chǔ)器快得多。如果片內(nèi)L2存儲(chǔ)器可用,它就是關(guān)鍵程序代碼的第二配置目的地。要是片內(nèi)存儲(chǔ)空間還不夠用,就必須使用外部存儲(chǔ)器,并將其定義為可高速緩存。 作為另一重要的存儲(chǔ)器配置技術(shù),如果你使用設(shè)置代碼,比如執(zhí)行一次性設(shè)置程序的庫(kù)函數(shù),你可能需要一個(gè)引導(dǎo)過(guò)程將該程序代碼導(dǎo)入片內(nèi)存儲(chǔ)器,然后執(zhí)行該程序代碼,最后將你的應(yīng)用程序載入并覆蓋初始引導(dǎo)程序代碼。這樣將使在L1存儲(chǔ)器中運(yùn)行的程序代碼數(shù)在穩(wěn)定的應(yīng)用中達(dá)到最大。 同樣在一些操作系統(tǒng)中,如uClinux,整個(gè)操作系統(tǒng)和相應(yīng)的應(yīng)用程序都駐留在可高速緩存的外部存儲(chǔ)器中。 如果可能,盡量將程序代碼分配到一個(gè)沒(méi)有用作其他用途的外部存儲(chǔ)區(qū),例如處理器連接到有四個(gè)內(nèi)部存儲(chǔ)塊的DDRSDRAM,就可以選擇一個(gè)存儲(chǔ)區(qū)來(lái)專門(mén)存放程序代碼。如果能確定大部分關(guān)鍵程序代碼在內(nèi)部SRAM存儲(chǔ)區(qū)和(或)高速緩存中,那么你可以更加靈活地使用這種配置建議。如需測(cè)定cache的命中率是否足夠,可以了解處理器提供的選項(xiàng)和工具套件。例如,VisualDSP++就在它的模擬環(huán)境中提供了一個(gè)Cache查看應(yīng)用程序(如圖2),而B(niǎo)lackfin處理器中同樣有性能監(jiān)控寄存器可用于計(jì)算命中率。 數(shù)據(jù)傳送注意事項(xiàng) 現(xiàn)在將注意力轉(zhuǎn)向數(shù)據(jù)傳送。一般來(lái)講,對(duì)需要按照精確時(shí)間間隔運(yùn)行才可以維持系統(tǒng)的處理流的數(shù)據(jù)傳輸,采用基于寄存器的(“自動(dòng)緩存”)DMA傳輸是最佳選擇;诿枋龇腄MA方式也可配置為類似自動(dòng)緩存DMA操作方式,這對(duì)于音頻和視頻數(shù)據(jù)流需要同步輸出的系統(tǒng)十分有用。描述符規(guī)定傳輸?shù)氖鞘裁,以及?shù)據(jù)的來(lái)源和/或目的地。如果可能,描述符應(yīng)放入內(nèi)部存儲(chǔ)器,這樣可在訪問(wèn)該信息時(shí),DMA控制器讀取的效率達(dá)到最高。 現(xiàn)考慮一個(gè)涉及像素解碼及顯示的視頻應(yīng)用。假定一個(gè)并行的視頻端口提供時(shí)鐘和數(shù)據(jù)驅(qū)動(dòng)到LCD控制面板或視頻解碼器。每個(gè)數(shù)據(jù)幀都必須放置在存儲(chǔ)器中,這樣便于視頻端口輸出,DMA通道就可以從該存儲(chǔ)緩沖區(qū)中及時(shí)讀取數(shù)據(jù),從而保持顯示屏的完美顯示。從處理器外部來(lái)看,如果DMA通道被拖延而視頻端口的FIFO空閑,顯示“毛刺”將會(huì)發(fā)生。主要因?yàn)闆](méi)有可用的新數(shù)據(jù)時(shí),舊的數(shù)據(jù)將被重復(fù)顯示。但從處理器的角度來(lái)看,視頻端口將出現(xiàn)下溢。當(dāng)然,這種情況可以通過(guò)使能錯(cuò)誤/狀態(tài)中斷而被檢測(cè)出來(lái)。 對(duì)于一個(gè)視頻顯示系統(tǒng),至少需要兩個(gè)(通常會(huì)更多)緩沖區(qū)進(jìn)行操作。理由有以下幾點(diǎn)。首先,當(dāng)向某一緩沖區(qū)寫(xiě)入數(shù)據(jù)時(shí),同時(shí)視頻端口可以從另一個(gè)緩存器讀取數(shù)據(jù)進(jìn)行顯示。之所以稱為“多個(gè)緩沖區(qū)”,是因?yàn)榇罅刻幚砗蟮臄?shù)據(jù)幀都將通過(guò)它發(fā)送出去。如果可能,應(yīng)盡可能當(dāng)數(shù)據(jù)還在L1存儲(chǔ)器中時(shí)就完成對(duì)數(shù)據(jù)的所有處理,而且,也最好采用存儲(chǔ)器到存儲(chǔ)器的DMA傳輸通道將處理后的數(shù)據(jù)傳送到外部存儲(chǔ)器。 應(yīng)該將視頻緩沖區(qū)放在外部存儲(chǔ)器的哪里呢?所有操作都有取舍,要視具體情況而定,但這里可以給出一個(gè)經(jīng)驗(yàn)性方法:如果顯示刷新率和像素處理率為系統(tǒng)中的最高速率,則應(yīng)該將輸入和輸出緩沖區(qū)分別放在不同的外部DRAM存儲(chǔ)區(qū)中,這樣能保證在DRAM中頁(yè)面的打開(kāi)和關(guān)閉數(shù)達(dá)到最少。外部存儲(chǔ)控制器能夠跨越相互分離的存儲(chǔ)區(qū)跟蹤哪些行是打開(kāi)的,因此,可以盡可能利用這一功能。如果顯示的幀與幀之間沒(méi)有多大變化,則可以將輸入和輸出緩沖區(qū)放在同一存儲(chǔ)區(qū)中。 還有一點(diǎn):如果一個(gè)系統(tǒng)中的視頻附有音頻同步,則盡量將聲音源數(shù)據(jù)放入內(nèi)部存儲(chǔ)器(L1或片上L2存儲(chǔ)器)中,這可以減少其與視頻數(shù)據(jù)流在輸入和輸出外存儲(chǔ)器時(shí)產(chǎn)生“擁擠”,從而避免外圍設(shè)備出現(xiàn)欠運(yùn)轉(zhuǎn)或超負(fù)荷運(yùn)轉(zhuǎn)。 |