從外部 RAM 執行圖形處理
本節介紹如何計算以下所示典型設定的圖形效能。此範例是 1024x600 像素的高解析度 24 位元 RGB-TFT 顯示器,具有儲存在外部 32 位元 SDRAM 中的 16bpp 影像緩衝區。圖形資產儲存在外部 OSPI NOR 快閃記憶體中。
目的
- 為開發人員提供逐步概述,以便進一步瞭解和評估圖形使用者介面應用程式的系統效能。
- 檢查定義的指定系統是否足以維持所選的顯示器及其要求。
- 瞭解在定義的子系統內可以發展出多麼複雜的 GUI。
The last section discusses the hybrid double buffer strategy which can help reduce the load on the external memory bandwidth in some cases.
步驟 1:顯示器規格
STM32H7S78 Discovery Kit 上使用的顯示器是 MB1860。 Discovery Kit 的 BoM 連結請點選此處。 Discovery Kit 上的顯示器解析度為 800px x 480px,低於本範例中使用的解析度。範例的顯示器規格如下所示:
- 顯示高度:600px
- 顯示寬度:1024px
- 顯示刷新率:60Hz
- 顯示器消隱區域*:通常為約 10%
*顯示器消隱涵蓋非作用中像素的總和。主要貢獻是為 LTDC 提供前後沿 (porches)。
步驟 2:顯示器要求和像素時脈計算
在此步驟中,我們需要計算顯示器要求,以瞭解我們的 MCU 和記憶體選擇是否能夠在所需的規格下操作顯示器。
根據上述指定的顯示尺寸,我們知道像素總數為:
pixel height x pixel width = 600px x 1024px = 614,400px
顯示器的更新率為 (1000ms/60 = 16ms) 60Hz,因此 LTDC 需要大約每 16ms 擷取影像緩衝區並將其傳送到顯示器。接著,可以透過以下公式找到保持顯示器以 60Hz (平均值,無消隱) 更新所需的系統 (RAM) 頻寬:
顯示像素 x 更新頻率 x 影像緩衝區色深 (RGB565)
614,400px x 60Hz x 16bpp = 589,824,000bit/s = 589.82Mbit/s
透過以下計算可以找到以 60Hz 的頻率更新顯示器所需的像素時脈。
(total number of pixels x refresh rate x (blanking% / 100 + 1)) / 1,000,000.
(614,400px x 60Hz x (10 / 100 + 1)) / 1,000,000 = 40.55 MHz pixel clock
Caution
請勿超過 LTDC 支援的最大像素時脈,這點很重要。請參閱「LTDC 應用說明,AN4861」(https://www.st.com/resource/en/application_note/an4861-lcdtft-display-controller-ltdc-on-stm32-mcus-stmicroelectronics.pdf),以概略瞭解不同設定下支援的最大像素時脈。有關 STM32H7R/S 最大像素時脈的概述請見表 13。
有關 STM32H7R/S 最大像素時脈的概述請見「LTDC 應用說明」表 13,截圖如下。
步驟 3:影像緩衝區和記憶體策略
在這個範例中,我們使用一個外部 32 位元 SDRAM 連接到一個執行頻率為 100MHz 的 32 位元寬 FMC 介面,採用雙重影像緩衝區策略。或者,開發人員也可以使用 16 位元 SDRAM、4/8/16 位元序列 RAM (如 Hyper RAM 和 200MHz DTR 的序列 PSRAM)。
對於所有外部記憶體,都需要一些額外的週期來啟動操作,在這個範例中,我們假設 SDRAM 的運作效率約為 80%。
步驟 4:影像緩衝區效能
目前後緩衝區位於不同的 RAM 庫時,理論 RAM 吞吐量由以下公式得出:
interface width x interface frequency = Mbit/s
32bit x 100MHz = 3,200Mbit/s = 400MB/s
但是,此吞吐量是以 RAM 達到 100% 的效率為基礎。如果我們考慮步驟 3 中估算的效率,則實際吞吐量為:
3,200Mbit/s x 0.8 = 2,560Mbit/s = 320MB/s
步驟 5:計算顯示器更新後的剩餘頻寬
Earlier we saw that the display required 589.82Mbit/s, and that our external RAM has a throughput of 2,560Mbit/s. 現在,讓我們檢查螢幕渲染/動畫還剩下多少頻寬。
2,560Mbit/s – 589.82Mbit/s = 1,970.18Mbit/s = 246.27MB/s
Overall, the example system can keep the display updated and on top of this there is also ~1,970Mbit/s remaining bandwidth for extra animations and more UI layers.
步驟 6:UI 渲染效能 (GUI FPS)
在這個 UI 案例中,我們的目標是 60FPS GUI 渲染。亦即系統必須在 16 毫秒內渲染並傳輸新影格。此外,我們可以接受將一些進階 UI 動畫的影格率降至 30FPS,以確保始終流暢的使用者體驗。
讓我們計算每個影像緩衝區切片的影像緩衝區效能,也就是我們可以在每個影格 (每 16 毫秒) 內渲染多少 Mbit。 First, we use the remaining framebuffer bandwidth (1,970Mbit/s) and divide by 60FPS.
1,970Mbit/s / 60FPS = 32.8Mbit/frame (approximately every 16ms at 60FPS).
This means that the RAM throughput is 32.8Mbit per 16ms to render and update the UI.
在最一開始的設定示意圖中,步驟 2 展示了用於變更/更新 UI 的可能額外渲染。由於影像緩衝區是 16bpp,因此影像緩衝區上的所有操作都是以 16bpp 完成。因此,在影像緩衝區中寫入像素將獲取 16 位元 SDRAM 頻寬。如果某個像素需要混合,NeoChrom GPU 將首先從影像緩衝區讀取該像素。像素混合 (修改) 後,將寫回至影像緩衝區。這表示系統需要為讀取-修改-寫入操作傳輸兩次 16 位元,因此使用 16 位元 + 16 位元 = 32 位元的 SDRAM 頻寬,如下圖所示。
我們現在可以計算出每影格內可以對多少個像素執行一次操作:
32.8Mbit/frame / 16bpp = 2.05Mpixels
為了提供參考點,我們計算每影格內可以進行多少次全螢幕操作:
2.05Mpixels / 614,000px = 3.34 times
這表示我們可以,舉例而言,繪製一個全螢幕框,然後將其與另一個框混合 (16bpp 寫入 + 16bpp 讀取 + 16bpp 寫入)。可以進一步與覆蓋螢幕 34% / 2 = 17% 的第三個框混合。
如步驟 6 開頭所提到,對於一些進階 UI 動畫,我們可以接受降至 30FPS。亦即我們擁有比 60FPS 多兩倍的可用頻寬,使得每影格內可以進行以下數量的全螢幕操作:
3.34 x 2 = 6.68 times
我們無法明確知道每影格內可以執行多少次全螢幕操作,因為這受到 UI 的複雜性很大的影響。此外,重要的是要考慮是否需要外部 RAM 用於影像緩衝區以外的其他用途。然而,對於許多應用程式來說,合理的原則是至少應該在 3 次以上。
To compare with a concrete example, the STM32H7S78-DK runs an 800x480 RGB TFT display, with 16bit framebuffers in external 16bit serial PSRAM at 200MHz DTR (800MB/s theoretically if 100% efficient). 這種類型的記憶體協定最初使用更多的週期,導致與 SDRAM 相比記憶體初始化效率較低 (請參閱 AN6062 進一步瞭解序列 RAM 的效能)。上述範例和計算顯示,在此解析度下,即使是最複雜的 UI 也可以在保持 60 FPS 的同時進行渲染。
另一份參考資料是 TouchGFX 示範,展示具有 2 種不同 RAM 和快閃記憶體頻率的複雜 UI。
Further reading
- [AN6062:STM32H7Rx/7Sx 系統架構與效能簡介] (https://www.st.com/resource/en/application_note/an6062-introduction-to-stm32h7rx7sx-system-architecture-and-performance-stmicroelectronics.pdf)
- [AN4861:STM32 MCU 上的 LCD-TFT 顯示器控制器 (LTDC) 簡介] (https://www.st.com/resource/en/application_note/an4861-lcdtft-display-controller-ltdc-on-stm32-mcus-stmicroelectronics.pdf)
- [STM32H7S78-DK 影片] (https://www.youtube.com/watch?v=Ho_lXv0RQqo&t)
- [可修改 RAM 和快閃記憶體頻率的 TouchGFX 示範影片] (https://www.youtube.com/watch?v=qYx2ngj6yhs&t)
附註
值得注意的是,上述計算並沒有考慮可用的運算能力,而只關注 RAM 頻寬。此外,計算是基於對 RAM 效率的假設。雖然這些假設並非任意的,但仍然是假設。
儘管存在這些限制,範例中的程序仍可作為可能效能的指標。
Hybrid Double Buffer Strategy
It is possible to reduce the load on the external memory interface by changing the framebuffer strategy to the hybrid double buffer strategy.
With this strategy all rendering is performed in small buffers in internal RAM. The completed rendering is then copied to the external RAM using a DMA operation.
This limits the accesses to external RAM to a single (burst) write operation. The drawback of the strategy is that it requires large (defaults to 64KB) buffers in internal RAM.
Read more about framebuffer strategies here.
Quality of Service
Some MCUs have Quality of Service (QoS) settings to control priorities on the internal bus matrix. When this feature is available, and when framebuffers are stored in external RAM, it is recommended to prioritize the LTDC to avoid LTDC underruns. An example for STM32H7R/S can be found here.
詞彙表
- 讀取-修改-寫入:讀取、修改,然後寫回至記憶體位置的流程。
- 像素時脈:像素傳輸到顯示器的頻率,決定了螢幕的刷新率和解析度,並定義了顯示器控制器向顯示面板傳送像素資料的速度。
- 影像緩衝區:RAM 中的一個區域,包含驅動顯示器的點陣圖。影像緩衝區儲存像素值,由顯示器控制器讀取。渲染操作在影像緩衝區上執行。
- 消隱:顯示器消隱涵蓋非作用中像素的總和。主要貢獻是為 LTDC 提供前後沿 (porches)。
- FMC:彈性記憶體控制器。管理 CPU 與各類型記憶體 (如 SRAM、NOR、NAND 和 SDRAM) 間介面的硬體元件。在此範例中,其用於外部 SDRAM。
- XSPI:可擴充的 SPI 介面。 SPI 的進階版本,支援更高的資料速率和附加功能,可增強與週邊裝置的通訊。在此範例中,其用於外部 NOR 快閃記憶體。更多資訊請參閱維基。
- 記憶體協定額外負荷:管理記憶體和處理器間通訊和資料傳輸所需的額外時間和資源,包括錯誤檢查、交握和定址等任務。這些額外負荷會影響系統整體效能。
- DTR:雙倍傳輸速率。資料在時脈的上升沿和下降沿進行傳輸。頻寬因此變成雙倍。

