跳轉到主要內容

模擬器

構建TouchGFX UI通常涉及大量的圖形細節,以匹配UI的規範。

為了加快開發過程,在實驗和除錯應用程式時,有一個快速的周轉時間很重要。 燒錄一個開發板通常需要相當長一段時間,所以每次對應用程式進行小的改動都會減慢開發速度。 為了緩解這種情況,TouchGFX PC模擬器是一個很好的開發工具。

您只需對PC編譯應用程式並在PC上運行應用程式。 除了Board Bring Up程式碼和抽象層(這是對PC(而不是開發板)的),執行的程式碼與目標硬體上運行的程式碼完全相同。 這意味著可以像在目標硬體上一樣精確地測試小部件的位置安排、交互、動畫、狀態機等。 如果願意,甚至可以使用Visual Studio這樣的IDE除錯自己的程式碼。 當然,像性能分析和與真正的後端系統進行交互這樣的事情必須在開發上進行。

模擬器範例

如何運行

使用TouchGFX Designer

如要從TouchGFX Designer內部啟動模擬器,只需按下右上角的“Run Simulator(運行模擬器)”按鈕,或者按下 鍵盤上的F5

從TouchGFX Designer啟動模擬器

使用TouchGFX Environment

如要使用TouchGFX環境啟動模擬器,請遵循以下步驟:

  1. 打開TouchGFX Environment
  2. 導航到TouchGFX應用程式所在位置
    1. 對於僅模擬器專案,範例C:/TouchGFXProjects/MyApplication_1
    2. 對於目標專案,範例C:/TouchGFXProjects/MyApplication_1/TouchGFX/
  3. 運行指令make -f simulator/gcc/Makefile -j6以編譯模擬器
  4. 運行指令./build/bin/simulator.exe以啟動模擬器

如果對TouchGFX應用程式進行了更改,請運行步驟3和步驟4。

模擬器功能

除了捕捉滑鼠輸入,TouchGFX模擬器還包括其他有用的功能,如下所列:

快速鍵特徵
F1啟用/禁用指標座標的顯示以及該座標上像素的RGB顏色(十六進位)。
F2啟用/禁用突出顯示無效區域。
F3擷取螢幕並將圖片置於screenshots資料夾中。
CTRL + F3對接下來的50幀進行截圖並將圖片置於screenshots資料夾中。
SHIFT + F3截圖並將圖片置於剪貼板中。
F4如果使用模擬器皮膚 - 啟用/禁用模擬器皮膚。
如果 使用模擬器皮膚 - 啟用/禁用視窗邊框。
鍵盤上的F5通過呼叫FrontendApplication::changeToStartScreen()將應用程式直接發送回啟動畫面。
F9通過阻止向應用程式發送時鐘信號來暫停模擬器。 再次按下F9可恢復正常執行。
F10當(按下F9)模擬器暫停後,可以通過按下F10發送一個時鐘信號到應用程式,從而對應用程式進行“單步作業”。
ESC關閉模擬器。

僅可通過模擬器運行的程式碼

如果您有一些程式碼只能在使用TouchGFX模擬器時運行, 可以在您的C++程式碼中使用#ifdef SIMULATOR

#ifdef SIMULATOR
// Your simulator specific user code here
#endif

從模擬器列印

如果要在執行模擬器時將除錯文字輸出到控制台,可以使用touchgfx_printf函數:

#include <touchgfx/Utils.hpp>

int i = 0;
touchgfx_printf("Application is running through simulator! \n");
touchgfx_printf("Print our value for integer i = %i \n", i);

記得要包括Utils.hpp檔案,以取得函數宣告。

在實際應用程式(適用於Cortex-M)中,touchgfx_printf定義為空巨集。 因此,它將不會產生程式碼,且可視需要用於目標程式碼中。 此處不需使用#ifdef SIMULATOR。

鎖定和解鎖影像緩衝區

如果您編寫直接操作影像緩衝區的程式碼,重要的是要在將像素寫入影像緩衝區記憶體之前鎖定影像緩衝區,同樣重要的是記住要在寫入影像緩衝區之後解鎖影像緩衝區。

鎖定影像緩衝區

使用該程式碼片段鎖定影像緩衝區:

uint16_t* RESTRICT buf = HAL::getInstance()->lockFrameBuffer();

由於歷史原因,返回值是指向影像緩衝區的16位指標。 將指針強制轉換為適當的指針類型,以便更輕鬆地存取影像緩衝區。

解鎖影像緩衝區

使用以下程式碼解鎖使用後的影像緩衝區:

HAL::getInstance()->unlockFrameBuffer();

忘記解鎖影像緩衝區

如果忘記解鎖影像緩衝區,則硬體在影像緩衝區變得可用之前會一直等待並且暫時凍結。 為了幫助檢測這種情況,如果TouchGFX框架要求鎖定影像緩衝區,而影像緩衝區仍然處於鎖定狀態,就會收到一個報錯資訊。 報錯資訊就像Microsoft Visual Studio所提示的:

影像緩衝區未解鎖時的Window對話方塊

對於控制台程式,報錯資訊就像這樣:

影像緩衝區未解鎖時的控制台列印輸出

類比硬體影像緩衝區,尺寸與顯示器不同

有些設置的顯示器尺寸可能小於實際硬體的影像緩衝區。 該問題也可以由模擬器處理,並在呼叫touchgfx_generic_init()之後在檔模擬器/main.cpp中配置。

傳遞給touchgfx_generic_init()的寬度和高度定義了顯示器和影像緩衝區的大小,但是如果硬體影像緩衝區有不同的尺寸,只需在呼叫touchgfx_generic_init()之後呼叫setFrameBufferSize()來指定實際影像緩衝區的大小,例如,SIM_WIDTH=800和SIM_HEIGHT=480:

touchgfx::HAL& hal = touchgfx::touchgfx_generic_init<touchgfx::HALSDL2>(dma, lcd, tc, SIM_WIDTH, SIM_HEIGHT, 0, 0);
hal.setFrameBufferSize(832, 480); // Hardware framebuffer is wider

使用不同的畫面播放速率模擬硬體

int CALLBACK WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
...
setupSimulator(argc, argv, hal);
((touchgfx::HALSDL2*)&hal)->setVsyncInterval(25);

...
}

setVsyncInterval( interval )將會變更2個畫面之間的間隔時間,為了找到正確的值,應使用1000/YOUR_FRAME_RATE=interval

40fps=(1000/40)=25ms

預設值為60fps = (1000/60) ~16,66 ms