嵌入式Linux下Qt/Embedded應(yīng)用關(guān)鍵技術(shù)研究
隨著后PC時(shí)代的到來(lái),嵌入式系統(tǒng)的性能有了大幅度的提高,應(yīng)用范圍也越來(lái)越廣,當(dāng)初的一些簡(jiǎn)單的人機(jī)交互接口已經(jīng)無(wú)法滿足人們的要求,在嵌入式系統(tǒng)中也逐漸出現(xiàn)了圖形用戶界面(Graphic User Interface,GUI),特別是在一些消費(fèi)類產(chǎn)品中。嵌入式系統(tǒng)中的GUI就是在嵌入式系統(tǒng)中為特定的硬件設(shè)備或環(huán)境而設(shè)計(jì)的圖形用戶界面系統(tǒng),由于受到目前嵌入式系統(tǒng)本身特點(diǎn)的影響,并受其發(fā)展限制,所以嵌入式系統(tǒng)中的GUI應(yīng)該有如下特點(diǎn)[1]:
1)占用的存儲(chǔ)空間以及運(yùn)行時(shí)占用資源少。
2)運(yùn)行速度以及響應(yīng)速度快。
3)可靠性高。
4)便于移植和定制。
Linux有開(kāi)放的源碼、高效穩(wěn)定的內(nèi)核、良好的開(kāi)發(fā)環(huán)境以及支持多種硬件平臺(tái)等特點(diǎn),而且由于Linux的可配置性和模塊化,一個(gè)Linux內(nèi)核經(jīng)過(guò)配置和裁減可以只占用幾百K左右的存儲(chǔ)空間,使其在嵌入式系統(tǒng)中也得到廣泛應(yīng)用[2]。
QT/Embedded是一個(gè)用于嵌入式系統(tǒng)的圖形用戶界面系統(tǒng),能夠高效、穩(wěn)定地運(yùn)行于嵌入式 Linux系統(tǒng)下,能為用戶提供可靠的交互功能。
本文就旨在于對(duì)這樣的嵌入式GUI QT/Embedded應(yīng)用中的一些關(guān)鍵問(wèn)題進(jìn)行研究。
1 嵌入式Linux操作系統(tǒng)
嵌入式操作系統(tǒng)目前主要有Vxwork、pSOS、Palm OS、Neculeus 和 Windows CE。但這些專用操作系統(tǒng)都是商業(yè)化產(chǎn)品,其價(jià)格昂貴,不適合低端嵌入式產(chǎn)品開(kāi)發(fā)。而且,源代碼的封閉性在很大程度上限制了開(kāi)發(fā)者的開(kāi)發(fā)。嵌入式 Linux操作系統(tǒng)彌補(bǔ)了這些不足,Linux操作系統(tǒng)是遵循GPL公約,并且有運(yùn)行穩(wěn)定、源碼開(kāi)放的特點(diǎn),被認(rèn)為是未來(lái)嵌入式操作系統(tǒng)的最佳選擇。
2 QT/Embedded的特點(diǎn)和結(jié)構(gòu)
QT/Embedded是著名的QT庫(kù)開(kāi)發(fā)商Trolltech公司開(kāi)發(fā)的面向嵌入式系統(tǒng)的Qt版本[3]。許多基于Qt的 X Window程序可以非常方便地移植到Qt/Embedded上,僅采用Framebuffer作為底層圖形接口。Qt/Embedded類庫(kù)完全采用 C++封裝。豐富的控件資源和較好的可移植性是Qt/Embedded最為優(yōu)秀的一方面,使用X下的開(kāi)發(fā)工具Qt Designer可以直接開(kāi)發(fā)基于Qt/Embedded的UI(用戶操作接口)界面。下圖為Qt/Embedded的實(shí)現(xiàn)結(jié)構(gòu)。
圖1 Qt/Embedded的實(shí)現(xiàn)結(jié)構(gòu)
Qt/Embedded在代碼設(shè)計(jì)上,巧妙地利用了C++的面向?qū)ο髾C(jī)制,如繼承、多態(tài)、模板等,具體實(shí)現(xiàn)非常靈活。
3 關(guān)鍵技術(shù)
3.1 Qt/Embedded的圖形引擎實(shí)現(xiàn)
Qt/Embedded的底層圖形引擎基于Framebuffer。Framebuffer是在Linux內(nèi)核架構(gòu)版本2.2以后新推出的標(biāo)準(zhǔn)顯示設(shè)備驅(qū)動(dòng)接口。采用mmap系統(tǒng)調(diào)用,可以將Framebuffer的顯示緩存映射為可連續(xù)訪問(wèn)的一段內(nèi)存空間。由于目前比較高級(jí)的ARM體系的嵌入式 CPU中大多集成了LCD控制模塊,LCD控制模塊一般采用雙DMA控制器組成的專用DMA通道。其中一個(gè)DMA可以自動(dòng)從一個(gè)數(shù)據(jù)結(jié)構(gòu)隊(duì)列中取出并裝入新的參數(shù),直到整個(gè)隊(duì)列中的DMA操作都已完成為止。另外一個(gè)DMA與畫(huà)面緩沖區(qū)相關(guān)。雖然使用了雙DMA,但這兩個(gè)DMA控制器的交替使用對(duì)于CPU來(lái)說(shuō)是不可見(jiàn)的,CPU所獲得只是由兩個(gè)DMA組成的一個(gè)通道而已。
Framebuffer驅(qū)動(dòng)程序的實(shí)現(xiàn)分為兩個(gè)方面:一方面是對(duì)LCD及其相關(guān)部分的初始化,包括緩沖區(qū)的創(chuàng)建和對(duì)DMA通道的設(shè)置;另外一方面是對(duì)畫(huà)面緩沖區(qū)的讀寫(xiě),有read、write、lseek等系統(tǒng)調(diào)用接口。對(duì)于將畫(huà)面緩沖區(qū)的內(nèi)容輸出到LCD顯示屏上,由硬件自動(dòng)完成,對(duì)于軟件來(lái)說(shuō)是透明的。當(dāng)對(duì)于DMA通道和畫(huà)面緩沖區(qū)設(shè)置完成后,DMA開(kāi)始正常工作,并將緩沖區(qū)中的內(nèi)容不斷發(fā)送到LCD上。這個(gè)過(guò)程是基于DMA對(duì)于LCD的不斷刷新。
在Qt/Embedded中,Qscreen類是抽象出的底層顯示設(shè)備基類,它聲明了對(duì)于顯示設(shè)備的基本描述和操作方式,如打開(kāi)、關(guān)閉、獲得顯示能力等。另外還有一個(gè)重要的基類是QGfx類,此類抽象出對(duì)于顯示設(shè)備的具體操作接口,如選擇畫(huà)刷、畫(huà)線、畫(huà)矩形等。這兩個(gè)基類是Qt/Embedded圖形引擎的底層抽象,其中所有具體函數(shù)基本上都是虛函數(shù),Qt/Embedded對(duì)于具體的顯示設(shè)備,如Linux的Framebuffer、Qt Virtual Framebuffer做的抽象接口類全都由此繼承并重載虛函數(shù)實(shí)現(xiàn)。
linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)
評(píng)論