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