嵌入式Linux中Qt/Embedded的應用 |
發布時間: 2012/9/8 16:29:58 |
隨著嵌入式Linux應用的不斷發展,嵌入式處理器運算能力的不斷增強,越來越多的嵌入式設備開始采用較為復雜的GUI系統,手持設備中的GUI系統發展得非常迅速。傳統的GUI系統,如Microwindows等,由于項目規模較小、功能較為薄弱,缺乏等三方軟件開發的支持等諸多原因,在比較高級的手持或移動終端設備(如PDA、Smart-Phone、車載導航系統)中應用較少。-
1 Qt/Embedded的實現技術基礎分析 橫向來看,由于發布的版權問題,Qt/Embedded采用兩種方式進行發布:在GPL協議下發布的free版與專門針對商業應用的commercial版本。二者除了發布方式外,在源碼上沒有任何區別。縱向看來,當前主流的版本為Qtopia的2.x系列與最新的3.0x系列。其中2.0版本系統較多地應用于采用Qtopia作為高檔PDA主界面的應用中;3.x版本系列則應用于功能相對單一,但需要高級GUI圖形支持的場合,如Volvo公司的遠程公交信息系統。圖1為Qt/Embedded的實現結構。 3.x版本系列的Qt/Embedded相對于2.x版本系統增加了許多新的模塊,如SQL數據庫查詢模塊等。幾乎所有2.x版本中原有的類庫,在3.x版本中都得到極大程度的增強。這就極大地縮短了應用軟件的開發時間,擴大了Qt/Embedded的應用范圍。 在代碼設計上,Qt/Embedded巧妙地利用了C++獨有的機制,如繼承、多態、模板等,具體實現非常靈活。但其底層代碼由于追求與多種系統、多種硬件的兼容,代碼補丁較多,風格稍顯混亂。 1.1 Qt/Embedded的圖形引擎實現基礎 Qt/Embedded的底層圖形引擎基于framebuffer。Framebuffer是在Linux內核架構版本2.2以后推出的標準顯示設備驅動接口。采用mmap系統調用,可以將framebuffer的顯示緩存映射為可連續訪問的一段內存儲針。由于目前比較高級的ARM體系的嵌入式CPU中大多集成了LCD控制模塊,LCD控制模塊一般采用雙DMA控制器組成的專用DMA通道。其中一個DMA可以自動從一個數據結構隊列中取出并裝入新的參數,直到整個隊列中的DMA操作都已完成為止。另外一個DMA與畫面緩沖區相關,這部分由兩個DMA控制器交替執行,并每次都自動按照預定的規則改變參數。雖然使用了雙DMA,但這兩個DMA控制器的交替使用對于CPU來說是不可見的。CPU所獲得的只是由兩個DMA組成的一個“通道”而已。 Framebuffer驅動程序的實現分為兩個方面:一方面是對LCD及其相關部分的初始化,包括畫在緩沖區的創建和對DMA通道的設置;另外一方面是對畫面緩沖區的讀寫,具體到代碼為read、write、lseek等系統調用接口。至于將畫面緩沖區的內容輸出到LCD顯示屏上,則由硬件自動完成。對于軟件來說是透明的。當對于DMA通道和畫面緩沖區設置完成后,DMA開始正常工作,并將緩沖區中的內容不斷發送到LCD上。這個過程是基于DMA對于LCD的不斷刷新的。基于該特性,framebuffer驅動程序必須將畫面緩沖區的存儲空間(物理空間)重新映射到一個不加高緩存和寫緩存的虛擬地址區間中,這樣能才保證應用程序通過mmap將該緩存映射到用戶空間后,對于該畫面緩存的寫操作能夠實時的體現在LCD上。 在Qt/Embedded中,Qscreen類為抽象出的底層顯示設備基類,其中聲明了對于顯示設備的基本描述和操作方式,如打開、關閉、獲得顯示能力、創建GFX操作對象等。另外一個重要的基類是QGfx類。該類抽象出對于顯示設備的具體操作接口(圖形設備環境),如選擇畫刷、畫線、畫矩形、alpha操作等。以上兩個基類是Qt/Embedded圖形引擎的底層抽象。其中所有具體函數基本都是虛函數,Qt/Embedded對于具體的顯示設備,如Linux的framebuffer、Qt Virtual Framebuffer做的抽象接口類全都由此繼承并重載基類中的虛函數實現。圖2為Qt/Embedded中底層圖形引擎實現結構。 對于基本的framebuffer設備,Qt/Embedded用QlinuxFbScreen來處理。針對具體顯示硬件(如Mach卡、Voodoo卡)的加速特性,Qt/Embedded從QlinuxFbScreen和圖形設備環境模板類QgfxRaster繼承出相應子類,并針對相應硬件重載相關虛函數。 Qt/Embedded在體系上為C/S結構,任何一個Qt/Embedded程序都可以作為系統中唯一的一個GUI Server存在。當應用程序首次以系統GUI Server的方式加載時,將建立QWSServer實體。此時調用QWSServer::openDisplay()函數創建窗體,在QWSServer::openDisplay()中對QWSDisplay::Data中的init()加以調用;根據QgfxDriverFactory實體中的定義(QLinuxFbScreen)設置關鍵的Qscreen指針qt_screen并調用connect()打開顯示設備(dev/fb0)。在QWSServer中所有對于顯示設備的調用都由qt_screen發起。至此完成了Qt/Embedded中QWSServer的圖形發生引擎的創建。當系統中建立好GUI Server后,其它需要運行的Qt/Embedded程序在加載后采用共享內存及有名管道的進程通信方式,以同步訪問模式獲得對共享資源framebuffer設備的訪問權。
本文出自:億恩科技【www.laynepeng.cn】 |