大地资源网视频在线观看新浪,日本春药精油按摩系列,成人av骚妻潮喷,国产xxxx搡xxxxx搡麻豆

您現(xiàn)在的位置:智能制造網(wǎng)>技術(shù)中心>Qt/Embedded在嵌入式Linux系統(tǒng)中的應(yīng)用

直播推薦

更多>

企業(yè)動態(tài)

更多>

推薦展會

更多>

Qt/Embedded在嵌入式Linux系統(tǒng)中的應(yīng)用

2009年03月24日 17:45:48人氣:1825來源:浙江啟揚智能科技有限公司

 
摘要:分析和討論qt/embedded的主流版本3.x系列的底層實現(xiàn)技術(shù);結(jié)合2.x版本系列和3.x版本系列,在兩種不同的硬件平臺(in pxa255開發(fā)系統(tǒng)與筆者自行設(shè)計的motorola mc9328 mx1開發(fā)系統(tǒng))上的移植過程,討論qt/embedded的底層設(shè)備接口與應(yīng)用移植技術(shù)。

   關(guān)鍵詞:

引言

隨著嵌入式linux應(yīng)用的不斷發(fā)展,嵌入式處理器運算能力的不斷增強,越來越多的嵌入式設(shè)備開始采用較為復(fù)雜的gui系統(tǒng),手持設(shè)備中的gui系統(tǒng)發(fā)展得非常迅速。傳統(tǒng)的gui系統(tǒng),如microwindows等,由于項目規(guī)模較小、功能較為薄弱,缺乏等三方軟件開發(fā)的支持等諸多原因,在比較的手持或移動終端設(shè)備(如pda、smart-phone、車載導(dǎo)航系統(tǒng))中應(yīng)用較少。

qt/embedded是的qt庫開發(fā)商trolltech公司開發(fā)的面向嵌入式系統(tǒng)的qt版本,開發(fā)人員多為kde項目的核心開發(fā)人員。許多基于qt的x window程序可以非常方便地移植到qt/embedded上,與x11版本的qt在zui大程度上接口兼容,延續(xù)了在x上的強大功能,在底層*摒棄了x lib,僅采用framebuffer作為底層圖形接口。qt/embedded類庫*采用c++封裝。豐富的控件資源和較好的可移植性是qt/embeddedzui為的一方面,使用x下的開發(fā)工具qt designer可以直接開發(fā)基于qt/embedded的ui(用戶操作接口)界面。越來越多的第三方軟件公司也開始采用qt/embedded開發(fā)嵌入式linux下的應(yīng)用軟件。其中非常的qt palmtop environment(qtopia)早期是一個第三方的開源項目,并已經(jīng)成功應(yīng)用于多款pda。trolltech公司針對smart-phone中的應(yīng)用需求,于2004年5月底發(fā)布了qtopia的phone版本。

1 qt/embedded的實現(xiàn)技術(shù)基礎(chǔ)分析

橫向來看,由于發(fā)布的版權(quán)問題,qt/embedded采用兩種方式進行發(fā)布:在gpl協(xié)議下發(fā)布的free版與專門針對商業(yè)應(yīng)用的commercial版本。二者除了發(fā)布方式外,在源碼上沒有任何區(qū)別。縱向看來,當(dāng)前主流的版本為qtopia的2.x系列與的3.0x系列。其中2.0版本系統(tǒng)較多地應(yīng)用于采用qtopia作為pda主界面的應(yīng)用中;3.x版本系列則應(yīng)用于功能相對單一,但需要gui圖形支持的場合,如volvo公司的遠程公交信息系統(tǒng)。圖1為qt/embedded的實現(xiàn)結(jié)構(gòu)。

3.x版本系列的qt/embedded相對于2.x版本系統(tǒng)增加了許多新的模塊,如sql數(shù)據(jù)庫查詢模塊等。幾乎所有2.x版本中原有的類庫,在3.x版本中都得到極大程度的增強。這就極大地縮短了應(yīng)用軟件的開發(fā)時間,擴大了qt/embedded的應(yīng)用范圍。

    在代碼設(shè)計上,qt/embedded巧妙地利用了c++*的機制,如繼承、多態(tài)、模板等,具體實現(xiàn)非常靈活。但其底層代碼由于追求與多種系統(tǒng)、多種硬件的兼容,代碼補丁較多,風(fēng)格稍顯混亂。

1.1 qt/embedded的圖形引擎實現(xiàn)基礎(chǔ)

qt/embedded的底層圖形引擎基于framebuffer。framebuffer是在linux內(nèi)核架構(gòu)版本2.2以后推出的標準顯示設(shè)備驅(qū)動接口。采用mmap系統(tǒng)調(diào)用,可以將framebuffer的顯示緩存映射為可連續(xù)訪問的一段內(nèi)存儲針。由于目前比較的arm體系的嵌入式cpu中大多集成了lcd控制模塊,lcd控制模塊一般采用雙dma控制器組成的dma通道。其中一個dma可以自動從一個數(shù)據(jù)結(jié)構(gòu)隊列中取出并裝入新的參數(shù),直到整個隊列中的dma操作都已完成為止。另外一個dma與畫面緩沖區(qū)相關(guān),這部分由兩個dma控制器交替執(zhí)行,并每次都自動按照預(yù)定的規(guī)則改變參數(shù)。雖然使用了雙dma,但這兩個dma控制器的交替使用對于cpu來說是不可見的。cpu所獲得的只是由兩個dma組成的一個“通道”而已。

framebuffer驅(qū)動程序的實現(xiàn)分為兩個方面:一方面是對lcd及其相關(guān)部分的初始化,包括畫在緩沖區(qū)的創(chuàng)建和對dma通道的設(shè)置;另外一方面是對畫面緩沖區(qū)的讀寫,具體到代碼為read、write、lseek等系統(tǒng)調(diào)用接口。至于將畫面緩沖區(qū)的內(nèi)容輸出到lcd顯示屏上,則由硬件自動完成。對于軟件來說是透明的。當(dāng)對于dma通道和畫面緩沖區(qū)設(shè)置完成后,dma開始正常工作,并將緩沖區(qū)中的內(nèi)容不斷發(fā)送到lcd上。這個過程是基于dma對于lcd的不斷刷新的。基于該特性,framebuffer驅(qū)動程序必須將畫面緩沖區(qū)的存儲空間(物理空間)重新映射到一個不加高緩存和寫緩存的虛擬地址區(qū)間中,這樣能才保證應(yīng)用程序通過mmap將該緩存映射到用戶空間后,對于該畫面緩存的寫操作能夠?qū)崟r的體現(xiàn)在lcd上。

在qt/embedded中,qscreen類為抽象出的底層顯示設(shè)備基類,其中聲明了對于顯示設(shè)備的基本描述和操作方式,如打開、關(guān)閉、獲得顯示能力、創(chuàng)建gfx操作對象等。另外一個重要的基類是qgfx類。該類抽象出對于顯示設(shè)備的具體操作接口(圖形設(shè)備環(huán)境),如選擇畫刷、畫線、畫矩形、alpha操作等。以上兩個基類是qt/embedded圖形引擎的底層抽象。其中所有具體函數(shù)基本都是虛函數(shù),qt/embedded對于具體的顯示設(shè)備,如linux的framebuffer、qt virtual framebuffer做的抽象接口類全都由此繼承并重載基類中的虛函數(shù)實現(xiàn)。圖2為qt/embedded中底層圖形引擎實現(xiàn)結(jié)構(gòu)。

圖2

    在圖2中,對于基本的framebuffer設(shè)備,qt/embedded用qlinuxfbscreen來處理。針對具體顯示硬件(如mach卡、voodoo卡)的加速特性,qt/embedded從qlinuxfbscreen和圖形設(shè)備環(huán)境模板類qgfxraster繼承出相應(yīng)子類,并針對相應(yīng)硬件重載相關(guān)虛函數(shù)。

qt/embedded在體系上為c/s結(jié)構(gòu),任何一個qt/embedded程序都可以作為系統(tǒng)中*的一個gui server存在。當(dāng)應(yīng)用程序以系統(tǒng)gui server的方式加載時,將建立qwsserver實體。此時調(diào)用qwsserver::opendisplay()函數(shù)創(chuàng)建窗體,在qwsserver::opendisplay()中對qwsdisplay::data中的init()加以調(diào)用;根據(jù)qgfxdriverfactory實體中的定義(qlinuxfbscreen)設(shè)置關(guān)鍵的qscreen指針qt_screen并調(diào)用connect()打開顯示設(shè)備(dev/fb0)。在qwsserver中所有對于顯示設(shè)備的調(diào)用都由qt_screen發(fā)起。至此完成了qt/embedded中qwsserver的圖形發(fā)生引擎的創(chuàng)建。當(dāng)系統(tǒng)中建立好gui server后,其它需要運行的qt/embedded程序在加載后采用共享內(nèi)存及有名管道的進程通信方式,以同步訪問模式獲得對共享資源framebuffer設(shè)備的訪問權(quán)。

1.2 qt/embedded的事件驅(qū)動基礎(chǔ)

qt/embedded中與用戶輸入事件相關(guān)的信號,是建立在對底層輸入設(shè)備的接口調(diào)用之上的。qt/embedded中的輸入設(shè)備,分為鼠標類與鍵盤類。以3.x版本系列為例,其中鼠標設(shè)備的抽象基類為qwsmouse handler,從該類又重新派生出一些具體的鼠標類設(shè)備的實現(xiàn)類。該版本系列的qt/embedded中,鼠標類設(shè)備的派生結(jié)構(gòu)如圖3所示。

與圖形發(fā)生引擎加載方式類似的,在系統(tǒng)加載構(gòu)造qwsserver時,調(diào)用qwsserver::openmouse與qwsserver::openkeyboard函數(shù)。這兩個函數(shù)分別調(diào)用qmousedriverfactory::cr-eate()與qkbddriverfactory::cr-eate()函數(shù)。這時會根據(jù)linux系統(tǒng)的環(huán)境變量qws_mouse_proto與qws_keyboard獲得鼠標類設(shè)備和鍵盤類設(shè)備的設(shè)備類型和設(shè)備節(jié)點。打開相應(yīng)設(shè)備并返回相應(yīng)設(shè)備的基類句柄指針給系統(tǒng),系統(tǒng)通過將該基類指令強制轉(zhuǎn)換為對應(yīng)的具體子類設(shè)備指針,獲得對具體鼠標類設(shè)備和鍵盤類設(shè)備的調(diào)用操作。

值得注意的是,雖然幾乎鼠標類設(shè)備的功能上基本一致,但由于觸摸屏和鼠標底層接口并不一樣,會造成對上層接口的不一致。舉例來講,從鼠標驅(qū)動接口中幾乎不會得到位置信息,一般只會讀到相對移動量。另外,鼠標的移動速度也需要考慮在內(nèi),而觸摸屏接口則幾乎是清一色的位置信息和壓力信息。針對此類差別,qt/embedded將同一類設(shè)備的接口部分也給予區(qū)別和抽象,具體實現(xiàn)在qmousedriverinterface類中。鍵盤類設(shè)備也存在類似問題,同樣引入了qkbddriver inteface來解決。具體實現(xiàn)此處暫不多述。

2 qt/embedded的移植與應(yīng)用

針對qt/embedded的實現(xiàn)特點,移植該嵌入式gui系統(tǒng)一般分為以下幾個步驟:

①設(shè)計硬件開發(fā)平臺,并移植linux操作系統(tǒng);

②采用靜態(tài)鏈接進linux內(nèi)核的方式,根據(jù)該平臺顯示設(shè)備的顯示能力,開發(fā)framebuffer驅(qū)動程序;

③開發(fā)針對該平臺的鼠標類設(shè)備驅(qū)動程序,一般為觸摸屏或usb鼠標;

④開發(fā)針對該平臺的鍵盤類設(shè)備驅(qū)動程序,一般為板載按鈕或usb鍵盤(該部分可選);

⑤根據(jù)framebuffer驅(qū)動程序接口,選擇并修改qt/embedded中的qlinuxfbscreen和qgfxraster類;

⑥根據(jù)鼠標類設(shè)備驅(qū)動程序,實現(xiàn)該類設(shè)備在qt/embedded中的操作接口;

⑦根據(jù)鍵盤類設(shè)備驅(qū)動程序,實現(xiàn)該類設(shè)備在qt/embedded中的操作接口(該部分可選);

⑧根據(jù)需要選擇qt/embedded的配置選項,交叉編譯qt/embedded的動態(tài)庫;

⑨交叉編譯qt/embedded中的example測試程序,在目標平臺上運行測試。

framebuffer設(shè)備驅(qū)動程序提供出的接口是標準的,除了注意endian問題外,配置qt/embedded時選擇相應(yīng)的色彩深度支持即可,因此該部分的移植難點就在于framebuffer驅(qū)動程序的實現(xiàn)。qt/embedded部分的qwsserver打開/dev/中的framebuffer設(shè)備后讀出相應(yīng)的顯示能力(屏幕尺寸、顯示色彩深度),模板qgfxraster將根據(jù)色彩深度在用戶空間設(shè)備創(chuàng)建出與顯示緩存同樣大小的緩沖作為雙緩沖,并采用正確方式進行顯示。

    2.1 在pxa255平臺上移植和應(yīng)用    3.x中鍵盤接口基類們于src/embedded/qkbd_qws.cpp中,為qwskeyboardhandler。實現(xiàn)i2c總線擴展出的16鍵鍵盤接口類方式與觸摸屏類似,此處不多述。需要注意的是,qt/embedded提供了事件過濾器(key event filter)的接口,在鍵盤點擊事件從qwsserver截獲并發(fā)送到相應(yīng)的client之前會經(jīng)過函數(shù)qwsserver::keyboardfilter。在此函數(shù)中可以按照自身需求生成新的鍵盤點擊事件,而后利用qwsserver::sendkeyevent()發(fā)送新的點擊事件到client中。利用該方式可以將各種鍵盤點擊無法輸入的unicode字符轉(zhuǎn)換出來,從而可以在較少的按鍵鍵盤上實現(xiàn)多unicode字符輸入法。qt/embedded 3.x鍵盤接口的移植與鼠標設(shè)備接口類似,此處不多述。

在筆者參與設(shè)計的某smart-phone開發(fā)平臺中,gui系統(tǒng)實現(xiàn)方案采用了qt/embedded 2.3.7和qtopia 1.7.0(基于qt/embedded 2.x系列的手持套件),硬件平臺采用了基于in xscale pxa255處理器的嵌入式開發(fā)系統(tǒng)。該開發(fā)系統(tǒng)采用640×480分辨率的tft lcd和pxa255內(nèi)部lcd控制模塊作為顯示設(shè)備,ads7846n作為外部電阻式觸摸屏控制器;另外,采用了五方向按鍵作為板載鍵盤。由于該系統(tǒng)采用了isp1161作為usb host控制器,較好地支持了usb接口的鍵盤和鼠標,操作系統(tǒng)為arm linux 2.4.19。參考linux 2.4.19內(nèi)核目錄drivers/input部分,可以按照標準內(nèi)核中input device接口設(shè)計實現(xiàn)觸摸屏和鍵盤,在實現(xiàn)了基于isp1161的ehci驅(qū)動程序后,移植標準的usb接口的人機界面設(shè)備驅(qū)動hid和usb鍵盤、鼠標的驅(qū)動程序后,可以獲得對于該類設(shè)備的調(diào)用接口。此過程不屬本文討論范疇,此處暫不多述。

qt/embedded 2.x系列對于輸入設(shè)備的底層接口與3.x系列不同,觸摸屏設(shè)備和鍵盤設(shè)備需要根據(jù)具體的驅(qū)動程序接口在qt/embedded中設(shè)備實現(xiàn)對應(yīng)的設(shè)備操作類。其中對應(yīng)于鼠標類設(shè)備的實現(xiàn)位于src/kernel/qmouse_qws.cpp中。由于觸摸屏在實現(xiàn)原理上存在著a/d量化誤差的問題,因此所有的觸摸屏接口實現(xiàn)類需要從特殊的qcalibratedmousehandler繼承,并獲得校正功能。

qt/embedded 2.x中對于鍵盤響應(yīng)的實現(xiàn)函數(shù)位于src/kernel/qkeyboard_qws.cpp中。在qkeyboard_qws.h中,定義了鍵盤類設(shè)備接口的基類qwskeyboardhandler,移植時需要根據(jù)鍵盤驅(qū)動程序從該類派生出實現(xiàn)類,實現(xiàn)鍵盤事件處理函數(shù)processkeyevent(),并在qwsserver::newkeyboardhandler函數(shù)中注冊自己的鍵盤類設(shè)備即可。其中對于點擊鍵的鍵碼定義在qt/embedded的命名空間——src/kernel/qnamespace.h中。

圖4為筆者在該smart-phone開發(fā)平臺上移植qt/embedded 2.3.7和qtopia 1.7.0后顯示的截圖。

2.2 在mc9328平臺上移植和應(yīng)用

在某車載導(dǎo)航輔助系統(tǒng)的開發(fā)平臺設(shè)計中,采用了qt/embedded 3.3.2版本作為其gui系統(tǒng)的實現(xiàn)方案。硬件平臺采用自行設(shè)計的以motorola mc9328 mx1為核心的開發(fā)系統(tǒng)。該系統(tǒng)采用cpu內(nèi)部lcd控制器和240×320分辨率的16 bpp tft lcd作為顯示設(shè)備,采用i2c總線擴展出16按鍵以及mx1集成的asp模塊和電阻觸摸屏。操作系統(tǒng)為arm linux 2.4.18。

qt/embedded 3.x版本系統(tǒng)中與底層硬件接口相關(guān)部分的源碼位于src/embedded/目標中。該部分包含三類設(shè)備的接口:framebufer、鼠標與鍵盤。參照該目標中相關(guān)設(shè)備的具體接口代碼,根據(jù)自身硬件臺增添接口即可。

由于系統(tǒng)lcd的岔道率為240×320,物理尺寸較小,在實現(xiàn)其于該系統(tǒng)的framebuffer驅(qū)動程序時并沒有將其本身與linux字符控制臺設(shè)備掛靠,因此framebuffer并不具備text模式的工作方式。在移植qt/embedded時,無需作framebuffer設(shè)備的工作方式轉(zhuǎn)換。正確配置色彩顯示支持后,qt/embedded能夠在lcd顯示出正確的圖形。由于該平臺的顯示系統(tǒng)為縱向320行,在設(shè)計時考慮到人對于非手持設(shè)備的視覺習(xí)慣為寬度大于高度的觀察方式,為了符合這種習(xí)慣性的觀察方式,在移植qt/embedded時采用了transformed的旋轉(zhuǎn)圖形顯示方式在軟件上實現(xiàn)了顯示方向的轉(zhuǎn)換變化。

鼠標設(shè)備接口這一基類qwsmousehandler的實現(xiàn)位于src/embedded/qmouse_qws.cpp中。與2.x版本系列不同的是,3.x中所有的linux觸摸屏示例接口代碼均實現(xiàn)在src/embedded/qmouselinuxtp_qws.cpp中的qwslinuxtpmousehandler類中。其中對于不同型號的觸摸屏的接口實現(xiàn)代碼,采用不同的宏定義和預(yù)編譯的方式將它們分隔開。筆者還通過從qwslinuxtpmousehandler中繼承自身觸摸屏接口類,替代原有的qwslinuxtpmousehandlerprivate類,而在qwslinuxtpmousehandler生成自身觸摸屏接口對象的方式,較好地將移植部分的代碼與原有比較混亂的代碼分隔開來。

圖4

 

3 總結(jié)

隨著嵌入式處理器運算能力的不斷提高,對外設(shè)支持的不斷豐富,嵌入式linux系統(tǒng)的應(yīng)用也逐漸增多。qt/embedded延續(xù)了qt在桌面系統(tǒng)的所有功能,豐富的api接口和基于組件的編程模型使得嵌入式linux系統(tǒng)中的應(yīng)用程序開發(fā)更加便捷。由于qt/embedded本身面向的手持設(shè)備和移動設(shè)備,將成為未來嵌入式系統(tǒng)的主要gui

全年征稿/資訊合作 聯(lián)系郵箱:1271141964@qq.com

免責(zé)聲明

  • 凡本網(wǎng)注明"來源:智能制造網(wǎng)"的所有作品,版權(quán)均屬于智能制造網(wǎng),轉(zhuǎn)載請必須注明智能制造網(wǎng),http://www.xashilian.com。違反者本網(wǎng)將追究相關(guān)法律責(zé)任。
  • 企業(yè)發(fā)布的公司新聞、技術(shù)文章、資料下載等內(nèi)容,如涉及侵權(quán)、違規(guī)遭投訴的,一律由發(fā)布企業(yè)自行承擔(dān)責(zé)任,本網(wǎng)有權(quán)刪除內(nèi)容并追溯責(zé)任。
  • 本網(wǎng)轉(zhuǎn)載并注明自其它來源的作品,目的在于傳遞更多信息,并不代表本網(wǎng)贊同其觀點或證實其內(nèi)容的真實性,不承擔(dān)此類作品侵權(quán)行為的直接責(zé)任及連帶責(zé)任。其他媒體、網(wǎng)站或個人從本網(wǎng)轉(zhuǎn)載時,必須保留本網(wǎng)注明的作品來源,并自負版權(quán)等法律責(zé)任。
  • 如涉及作品內(nèi)容、版權(quán)等問題,請在作品發(fā)表之日起一周內(nèi)與本網(wǎng)聯(lián)系,否則視為放棄相關(guān)權(quán)利。

<
更多 >

工控網(wǎng)機器人儀器儀表物聯(lián)網(wǎng)3D打印工業(yè)軟件金屬加工機械包裝機械印刷機械農(nóng)業(yè)機械食品加工設(shè)備制藥設(shè)備倉儲物流環(huán)保設(shè)備造紙機械工程機械紡織機械化工設(shè)備電子加工設(shè)備水泥設(shè)備海洋水利裝備礦冶設(shè)備新能源設(shè)備服裝機械印染機械制鞋機械玻璃機械陶瓷設(shè)備橡塑設(shè)備船舶設(shè)備電子元器件電氣設(shè)備


我要投稿
  • 投稿請發(fā)送郵件至:(郵件標題請備注“投稿”)1271141964.qq.com
  • 聯(lián)系電話0571-89719789
工業(yè)4.0時代智能制造領(lǐng)域“互聯(lián)網(wǎng)+”服務(wù)平臺
智能制造網(wǎng)APP

功能豐富 實時交流

智能制造網(wǎng)小程序

訂閱獲取更多服務(wù)

微信公眾號

關(guān)注我們

抖音

智能制造網(wǎng)

抖音號:gkzhan

打開抖音 搜索頁掃一掃

視頻號

智能制造網(wǎng)

公眾號:智能制造網(wǎng)

打開微信掃碼關(guān)注視頻號

快手

智能制造網(wǎng)

快手ID:gkzhan2006

打開快手 掃一掃關(guān)注
意見反饋
關(guān)閉
企業(yè)未開通此功能
詳詢客服 : 0571-87858618
主站蜘蛛池模板: 彩票| 东山县| 犍为县| 富源县| 大悟县| 如皋市| 理塘县| 巢湖市| 丽江市| 阜宁县| 临清市| 屏东市| 龙门县| 永寿县| 密云县| 平顶山市| 克拉玛依市| 兴仁县| 宁城县| 临邑县| 揭东县| 朝阳县| 兰溪市| 铅山县| 湘阴县| 广元市| 志丹县| 麟游县| 元阳县| 清涧县| 东源县| 方正县| 托克托县| 石台县| 旅游| 天水市| 财经| 沙雅县| 安龙县| 南昌县| 南汇区|