作者:Alexander Kalmuk和Alexander Kalmuk
嵌入式系統有望為智能產品提供越來越多的功能。這可以通過Linux輕松實現,Linux為您所需要的每種情況提供軟件。但是Linux需要相當大的硬件資源,尤其是內存,因此目標平臺通常會很昂貴并且功耗很高。另一方面,現代微控制器(MCU)具有很多資源,足以應付許多智能任務。使用Embox RTOS之類的實時操作系統(RTOS),該操作系統允許在包括MCU在內的所有地方使用Linux軟件,開發人員可以更輕松地開發成本更低,功耗更低的智能設備。
在本文中,我們討論在運行Embox RTOS的嵌入式MCU上啟動基本的Qt應用程序。我們使用兩個基于Cortex-M7的單核板(216MHz):STM32F746g-Discovery和STM32F769i-Discovery,它們分別具有480×272和800×480屏幕分辨率的觸摸屏。
不久前,我們設法在STM32F746-Discovery [注1]上啟動了一個標準的Qt示例“ moveblocks”。但是我們想走得更遠,用觸摸屏啟動一個示例,我們選擇另一個標準示例``animatedtiles''。這是一個相當不錯的示例,即使在臺式機上也看起來很酷。它是交互式的,因此我們可以使用觸摸屏,并且看起來也像3D動畫。
我們想了解STM32 MCU是否可以提供足夠的性能。我們不確定CPU的速度是否足以使該渲染場景平滑,因為我們發現,即使是刷新800×480顯示器的屏幕也是一項昂貴的操作[注2]。
建筑
首先,讓我們將應用程序構建為Embox的一部分。最簡單的方法是為QEMU構建應用程序,這是一個開放源代碼模擬器。使用QEMU意味著在這種情況下,我們不需要照顧內存消耗。這將幫助我們確保所有必需的組件均可用。當在QEMU上啟動“動畫”時,我們可以輕松地將必要的組件添加到STM32的配置文件中。
首次在目標板上啟動
我們在目標板STM32F746G-Discovery上成功地啟動了“動畫”,但是我們注意到只繪制了屏幕的上半部分。當然,我們可以嘗試通過立即在板上進行調試來解決問題,但是有一種更簡單的方法:我們可以首先在Linux環境中啟動和調試示例。
在主機上調試
要運行此示例并調試您的應用程序,您需要Qt庫本身以及QVFB(它是提供虛擬屏幕的Qt應用程序)。您可以按照官方文檔中的說明構建QVFB。
然后,您可以使用所需的屏幕分辨率(對于STM32F746G-Discovery為480×272)啟動QVFB:
./qvfb-寬度480-高度272 -nocursor
您還應該使用嵌入式配置文件(即帶有“ -embedded”選項)來構建Qt庫。此選項旨在在沒有X11或現有圖形環境的情況下運行Qt,將改用QWS(Qt窗口系統)。此外,我們禁用了其他一些不必要的選項和模塊。產生的配置行如下:
./configure -opensource -confirm-license -debug \ -embedded -qt-gfx-qvfb -qvfb \ -no-javascript-jit -no-script -no-scripttools \ -no-qt3support -no-webkit -nomake演示- nomake的例子
最后,讓我們構建并啟動“動畫”。構建階段與Qt(qmake; make;)一樣。啟動應用程序時,應指定QVFB作為顯示:
./examples/animation/animatedtiles/animatedtiles -qws -display QVFb:0
屏幕的上半部分顯示了相同的圖片。我們在源代碼(examples / animation / animatedtiles / main.cpp)中發現,該應用程序以“ view-> show()”開頭,這意味著不處于全屏模式。之后,我們完全相信屏幕的唯一上半部分用于顯示應用程序。我們稍微修改了“動畫”代碼,并添加了“ -fullscreen”選項。
在STM32F746-發現上啟動
我們在Embox中構建了修改后的應用程序,并檢查它是否已成功在QEMU上運行。但是,當我們在目標板上啟動應用程序時,我們收到了“內存不足”錯誤。這意味著我們的配置中的堆大小不足以容納應用程序。我們決定在Linux中使用豐富的開發工具來解決問題,即估計所需的堆大小。
我們已經從valgrind開始了我們的應用程序。Valgrind是用于內存調試和性能分析的工具,Massif是堆分析器(它是Valgrind的一部分)。
$ valgrind --tool = massif --massif-out-file = animatedtiles.massif。/ examples / animation / animatedtiles / animatedtiles -qws -fullscreen $ ms_print animationtiles.massif> animationtiles.out
并發現該應用程序需要的堆大小約為2.7 MB。
我們在Embox配置中將堆大小設置為3 MB,然后再次開始演示。它已在全屏模式下成功運行。
在STM32F769I-Discovery上啟動。
我們還想在類似的板上嘗試該示例,但顯示更大。本示例使用的顯示分辨率為800×480的STM32F769I-Discovery。在這種情況下,僅16位彩色模式(800x480x2 = 768000)的幀緩沖區僅需要將近1MB,但是此板上有足夠的(16MB)外部SDRAM。因此,我們只需要估計堆的大小即可。
我們以新的分辨率(800×480)啟動了QVFb:
$。/ qvfb-寬度800-高度480 -nocursor&
并使用valgrind作為上一次:
$ valgrind --tool = massif --massif-out-file = animatedtiles.massif。/ examples / animation / animatedtiles / animatedtiles -qws -fullscreen $ ms_print animationtiles.massif> animationtiles.out
我們發現它大約需要6 MB。我們已經設置了6 MB的堆大小,并在STM32F769I板上成功啟動了“動畫時間”。
圖1:Embox RTOS下STM32F769I-DISCOVERY板上的QT動畫片段示例。(來源:Embox)
編輯:hfy
-
mcu
+關注
關注
146文章
17401瀏覽量
353304 -
嵌入式
+關注
關注
5097文章
19229瀏覽量
308850 -
嵌入式系統
+關注
關注
41文章
3634瀏覽量
129918
發布評論請先 登錄
相關推薦
嵌入式QT常見開發方式有哪些?
開發基本的嵌入式應用程序

基于Qt的嵌入式Linux通訊簿程序設計
嵌入式linux GUI-Qt解析
嵌入式linux應用開發之QT
嵌入式Linux應用程序開發-(1)第一個嵌入式QT應用程序

Qt應用程序出現卡頓的現象怎么解決呢
嵌入式Linux中讓應用程序自動啟動
在嵌入式系統中集成Rust和Qt的實踐

評論