嵌入式課程設計報告基于QT.doc_第1頁
嵌入式課程設計報告基于QT.doc_第2頁
嵌入式課程設計報告基于QT.doc_第3頁
嵌入式課程設計報告基于QT.doc_第4頁
嵌入式課程設計報告基于QT.doc_第5頁
已閱讀5頁,還剩18頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領

文檔簡介

湖北汽車工業(yè)學院Hubei Automotive Industrise institute課程設計說明書課程名稱: 嵌入式系統(tǒng) 設計題目: 數(shù)字相框 班號:T623-1 學號:20060230116專業(yè): 計算機科學與技術學生姓名 姜李陽 指導老師(簽字)起止日期 2009 年 12 月 28日 2010年 1月 10日一嵌入式課程設計概述1.1 課程設計實驗平臺簡介1、硬件:UP-TECHPXA270-S嵌入式實驗平臺、PC機Pentiumn500以上, 硬盤10G以上。2、軟件:PC機windows平臺虛擬機REDHAT LINUX 9.0MINICOMARM-LINUX開發(fā)環(huán)境3、嵌入式Linux開發(fā)平臺UP-TECHPXA270-S實驗儀器介紹。a、硬件配置UP-TECHPXA270的硬件配置如下表1所示:表1 UP-TECHPXA270-S的硬件配置配置名稱型號規(guī)格主CPUIntel XScale結(jié)構(gòu)芯片PXA270工作頻率520MHz輔CPULPC2119 ARM7TDMI-S擴展AD,CAN功能,擴展IO口以太網(wǎng)DM9000支持IEEE802.3的10M/100bps模式NOR FLASHIntel E28F128J3A16位,16MNAND FLASHK9F120864M內(nèi)存SDRAMHY56162032x264MLCDSHARP LQ080 TFT8寸真彩液晶屏,640X480分辨率觸摸屏GK80Burr Brown ADS7846USB主從接口飛利浦ISP1161四個USB主接口,一個USB從接口串口RS2322個通用串口視頻口VGA外接符合VGA標準的視頻輸出irDA紅外線HSDL3600 雙向Agilent兼容SIR和FIR協(xié)議調(diào)試接口JTAGJTAG燒寫Flash音頻編解碼器Cirrus Logic Crystal CS420120位數(shù)模轉(zhuǎn)換,18位立體聲模數(shù)轉(zhuǎn)換32位擴展總線接口GPIO 和UP-TECHARM2410-S平臺兼容CF卡接口PCMCIA總線支持SD卡接口MMC控制器支持IDE硬盤接口PCMCIA卡接口 b、UP-TECHPXA270-S開發(fā)平臺邏輯框圖如下圖1所示:圖1 UP-TECHPXA270-S開發(fā)平臺邏輯框圖二課程設計目的開設本課程設計的目的是,通過本課程設計,提高學生的分析問題、解決問題的能力,鞏固嵌入式系統(tǒng)的基本理論知識,進一步了解和掌握課程中所講授的概念,方法。同時通過本課程設計,全面綜合應用所學過的基礎知識,建立一個完整的嵌入式系統(tǒng)的開發(fā)過程的概念,并掌握其中的主要原理和方法本課程設計的目的是通過開發(fā)一個消費類電子產(chǎn)品數(shù)字相框,了解嵌入式產(chǎn)品開發(fā)的主要步驟,包括需求分析、系統(tǒng)結(jié)構(gòu)設計、圖形界面設計、驅(qū)動程序、功能優(yōu)化、系統(tǒng)測試等,從而培養(yǎng)學生獨立完成比較復雜的實際系統(tǒng)設計的能力。三課程設計內(nèi)容和要求3.1設計的內(nèi)容作為一個消費類電子產(chǎn)品,數(shù)碼相框整個系統(tǒng)要完成的基本功能大致如下:1、用戶界面友好,操作簡便。由于該產(chǎn)品的使用者大多是非專業(yè)人士,用戶界面是否清晰明了、操作是否簡捷方便成為用戶是否能迅速接受此產(chǎn)品的重要因素。2、數(shù)字相框的功能應包括以下方面:(1)在LCD屏上全屏循環(huán)顯示多幅圖像文件;(2)根據(jù)設定的時間間隔更新圖像;(3)顯示時間、日期;(4)通過按鈕進行操作;3.2 要求本課程設計要求學生根據(jù)實際應用的特點對產(chǎn)品進行完整的需求分析,形成比較完善的總體設計方案。同時,要求學生具備Linux操作系統(tǒng)下簡單的設備驅(qū)動程序開發(fā)、圖形用戶接口設計的能力。此外,還要求讀者掌握基本的系統(tǒng)功能及性能測試技術,從而具備比較全面的嵌入式應用系統(tǒng)開發(fā)能力。四總體設計主要步驟和方法根據(jù)數(shù)字相框的主要特點和設計功能那個要求,我們將課設分為以下幾個步驟:4.1、數(shù)字相框軟硬件平臺的選擇性能方面,由于數(shù)字圖像的解碼算法比較復雜,而且大量圖片需要從外部Flash存儲器中讀取,所以對嵌入式微處理器的性能要求比較高。外部接口方面,該芯片最好能在外圍直接支持CF卡的Compact Flash接口,還應提供按鈕、LCD顯示屏、觸摸屏、聲音輸出通道等。在本課程設計中,采用了Intel的PXA270作為微處理器,完全能滿足上述硬件平臺的要求。數(shù)字相框?qū)儆谙M類電子產(chǎn)品,對價格比較敏感,而嵌入式Linux操作系統(tǒng)上有比較豐富的軟件資源、驅(qū)動程序和開發(fā)工具,因此本課程設計采用嵌入式Linux作為軟件開發(fā)平臺。在Linux操作系統(tǒng)平臺上有多種嵌入式圖形界面開發(fā)工具可供使用,主要包括MicroWindows、MuniGUI、TinyX和Qt/Embedded等幾種。本課程設計將集中討論在Qt/Embedded系統(tǒng)上數(shù)字相框的實現(xiàn)技術,當然也可以通過其他圖形開發(fā)界面工具實現(xiàn)數(shù)字相框功能。4.2、數(shù)字相框的軟件總體設計數(shù)字相框軟件系統(tǒng)功能可以劃分為三個模塊:1)圖片瀏覽模塊,可以通過按鍵控制選定某個圖像或更新圖像頁(上一頁、下一頁)。2)播放模塊,對瀏覽界面選定的圖片進行循環(huán)播放。3)系統(tǒng)設置模塊,可設置循環(huán)播放更換頻率等。4.2.1、功能模塊組織架構(gòu)圖功能模塊圖片瀏覽模塊圖片播放模塊系統(tǒng)設置模塊圖片瀏覽模塊上一張圖片下一張圖片縮 小 圖 片擴 放 圖 片圖片播放模塊系統(tǒng)設置模塊快速播放圖片中速播放圖片慢速播放圖片4.3、基于Qt的圖形界面程序設計本設計中包括了瀏覽、循環(huán)播放和配置三個界面模塊。這些模塊之間需要進行通信,利用Qt提供的信號/槽機制很好地解決了這幾問題,每個模塊中都有自己定義的一些信號和槽,已發(fā)送給其他模塊或者從其他模塊接受到對應信號后作出響應。數(shù)字相框在初始化時會掃描指定目錄下(包括子目錄)的所有支持圖片文件,并將其存放在列表中,以備之后的瀏覽界面生成縮略圖。本系統(tǒng)使用Qt提供的QDir類實現(xiàn)遍歷目錄的功能,在遍歷目錄的同時通過設置文件類型過濾位來獲得指定文件,并使用一個雙向的字符串指針鏈表來記錄掃描得到的結(jié)果。五.詳細設計根據(jù)以上的分析,將程序分為2個部分:一部分為用戶界面層、一部分為功能模塊層。5.1用戶界面層代碼設計如下定義頭文件庫window.h作用于:該類中的函數(shù)、用于實現(xiàn)用戶界面層的工作按鈕添加信號觸發(fā)槽#ifndef WINDOW_H#define WINDOW_H#include #include class RenderArea;class Window : public QWidget Q_OBJECTpublic: Window(); RenderArea *renderArea; / RenderArea對象用于顯示圖片private:protected: void keyPressEvent(QKeyEvent *event); private slots:void start(); void start1(); void start2(); void predisplay(); void nextdisplay(); void big(); void small();#endif用戶層圖形界面與按鈕信號槽功能實現(xiàn)代碼:#include window.h#include #include renderarea.hWindow:Window() renderArea = new RenderArea; QPushButton *frontbutton=new QPushButton(pre); /“上一張圖片”按鈕 QPushButton *nextbutton=new QPushButton(next); /“下一張圖片”按鈕 QPushButton *startbutton=new QPushButton(Fstart); /“快速播放”按鈕 QPushButton *startbutton1=new QPushButton(Mstart);/“中速播放”按鈕 QPushButton *startbutton2=new QPushButton(Sstart);/“慢速播放”按鈕 QPushButton *b=new QPushButton(big);/“擴放圖片”按鈕 QPushButton *s=new QPushButton(small);/“縮小圖片”按鈕 QPushButton *exitbutton=new QPushButton(exit);/“退出”按鈕 QHBoxLayout *belowlayout=new QHBoxLayout;/水平布局 QHBoxLayout *belowlayout1=new QHBoxLayout; QVBoxLayout *mainlayout=new QVBoxLayout;/垂直布局 belowlayout-addStretch(); belowlayout-addWidget(frontbutton); belowlayout-addWidget(nextbutton); belowlayout-addStretch(); belowlayout-addWidget(startbutton); belowlayout-addWidget(startbutton1); belowlayout-addWidget(startbutton2); belowlayout-addStretch(); belowlayout-addWidget(b); belowlayout-addWidget(s); belowlayout-addStretch(); belowlayout-addWidget(exitbutton); belowlayout1-addWidget(renderArea); mainlayout-addLayout(belowlayout1); mainlayout-addLayout(belowlayout); this-setFocusPolicy(Qt:ClickFocus); frontbutton-setFocusPolicy(Qt:NoFocus); nextbutton-setFocusPolicy(Qt:NoFocus); startbutton-setFocusPolicy(Qt:NoFocus); startbutton1-setFocusPolicy(Qt:NoFocus); startbutton2-setFocusPolicy(Qt:NoFocus); b-setFocusPolicy(Qt:NoFocus); s-setFocusPolicy(Qt:NoFocus); this-setFocusPolicy(Qt:ClickFocus); exitbutton-setFocusPolicy(Qt:NoFocus); setLayout(mainlayout); setWindowTitle(tr(Digital photo frame); connect(frontbutton,SIGNAL(clicked(), this,SLOT( predisplay() ); /單擊按鈕觸發(fā)函數(shù) connect(nextbutton,SIGNAL(clicked(), this,SLOT(nextdisplay(); connect(startbutton,SIGNAL(clicked(), this,SLOT(start(); connect(startbutton1,SIGNAL(clicked(), this,SLOT(start1(); connect(startbutton2,SIGNAL(clicked(), this,SLOT(start2(); connect(b,SIGNAL(clicked(), this,SLOT(big(); connect(s,SIGNAL(clicked(), this,SLOT(small(); connect(exitbutton,SIGNAL(clicked(),this,SLOT(close();void Window:predisplay() renderArea-pre_area();void Window:nextdisplay() renderArea-fun_area();void Window:start() renderArea-Start(1);void Window:start1() renderArea-Start(2);void Window:start2() renderArea-Start(3);void Window:big() renderArea-Big();void Window:small() renderArea-Small();void Window:keyPressEvent(QKeyEvent *event) if ( event-key() = Qt:Key_Right) predisplay(); if ( event-key() = Qt:Key_Left) nextdisplay(); 效果圖如下:5.2.功能模塊實現(xiàn)代碼:#include #include #include #include #include #include renderarea.hRenderArea:RenderArea(QWidget *parent): QWidget(parent) i=0;/指針 dir=/home/Katrina/wisdom/fxy1/photo; /設置圖片默認路徑 QDir DIR; if(!DIR.exists(dir) return ; QDir picdir(dir); QStringList filters; filters *.bmp *.jpg *.png0) | (i=0) ) & ( (ilist.size()-1) ) ) /單擊按鈕則向下顯示一張圖片 i+; else if(i=(list.size()-1)/當圖片顯示到最后一張將指針指導第一張 i=0; update();void RenderArea:pre_area()/上一張圖片功能實現(xiàn)w=1;h=1; if( (list.size()=0)| list.size()=1) return; if( (i0) ) i-; else if(i=0) i=list.size()-1; update();void RenderArea:Start(int p)/循環(huán)播放圖片功能int sum=0;/控制速度if(p=1)sum=1000;/快速播放else if(p=2)sum=2000;/中速播放else sum=3000;/慢速播放QTime t;bool b=true;bool a=true;if(i=(list.size()-1)i=0;repaint();while(b)if(i!=(list.size()-1)while(a)if(t.elapsed()%sum= 0)/Qtime控制時間break;i+; else b=false;w=1;h=1;repaint();void RenderArea:Big()/擴放圖片功能 if(w0.1)/最小比例 w=w*0.9; h=h*0.9; update(); 效果圖:六.測試與調(diào)試程序的功能實現(xiàn)部分是使用Qt 中QDir、 QPixmap類實現(xiàn)的。通過QDir來獲得圖片的路徑,通過QPixmap使用QDir得到的路徑來顯示圖片。所以在程序調(diào)試過程中出現(xiàn)了2個問題6.1.文件路徑加載問題:QPixmap pixmap;/全局變量QFileInfoList list;/全局變量 QString dir=/home/Katrina/wisdom/fxy1/photo; QDir picdir(dir); QStringList filters;filters *.bmp *.jpg *.png*.gif; picdir.setNameFilters(filters); list = picdir.entryInfoList();QFileInfo fileInfo = list.at(i);QString path=fileInfo.filePath(); pixmap.load(path);問題如下:問題:當圖片顯示最后一張圖片繼續(xù)點下一張圖片按鈕的時候,圖片路勁是正確的,但窗口顯示的仍是最后一張圖片分析原因:因為QPixmap pixmap為全局變量,在圖片瀏覽功能時 pixmap.load(path)將所有的圖片路徑都加載進去,雖然指針iQFileInfo fileInfo = list.at(i) 控制圖片的路徑,用qDebug打印路徑是正確的,但QPixmap pixmap 一直取的是所有圖片中的最后一張圖片的路徑。解決的方案是:將QPixmap pixmap設置為局部變量,位置位于void RenderArea:paintEvent(QPaintEvent *)畫圖函數(shù)的作用域。void RenderArea:paintEvent(QPaintEvent *) QPainter painter(this);QFileInfo fileInfo = list.at(i); QString path=fileInfo.filePath(); QPixmap pixmap;pixmap.load(path);6.2.循環(huán)控制播放的問題QPixmap pixmap是通過觸發(fā)調(diào)用void RenderArea:paintEvent(QPaintEvent *)來將圖片顯示的,其中有2個函數(shù)方法可以:一個是update()、另一個是repaint();我用的是前者。出現(xiàn)問題如下:問題是:當圖片循環(huán)時指針i一直處于遞加的,但圖片的顯示是循環(huán)結(jié)束圖片由第一張直接顯示最后一張圖片分析原因:update()函數(shù)在循環(huán)控制的時候不管次數(shù)的多少,只在最后一次調(diào)用paintEvent所以當循環(huán)結(jié)束的時候update()才調(diào)用paintEvent顯示最后一張。解決方案:在循環(huán)控制的時候repaint()有多少次調(diào)用多少次,所以用repaint()代替update()6.3. 在PXA270-S 上的移植【交叉編譯器】:cross-3.4.1編譯前的一些準備工作:/usr/local/qt (源碼包存放的目錄)在終端中執(zhí)行:#mkdir /usr/local/armqt-embedded-linux-opensource-src-4.6.tar.gz解壓cross-3.4.1.tar.bz2#cd /usr/local/arm等待解壓完成。解壓完成之后會在這個目錄下生成一個usr目錄,進入該目錄,直到要進入3.4.1目錄時,把里面的3.4.1目錄剪切到/usr/local/arm下,刪除usr目錄由于剛才是在/usr/local/arm的目錄下安裝的cross-3.4.1,所以設置路徑為:PATH=/usr/local/arm/3.4.1/bin:$PATH,然后可以查看arm-linux-gcc的版本情況。在Linux里設置環(huán)境變量的方法(export PATH)然后在終端中進行以下操作:#arm-linux-gcc -v查看arm-linux-gcc的版本情況編譯及安裝qt-embedded-linux-opensource-src-4.61. 解壓文件將qt-embedded-linux-opensource-src-4.6.tar.gz復制到/root/local/qt目錄下進行解壓,解壓完成后,得到/usr/local/qt/qt-embedded-linux-opensource-src-4.6目錄。將qt-embedded-linux-opensource-src-4.6重命名為qt-embedded-linux-opensource-src-4.6-x86。再解壓一下qt-embedded-linux-opensource-src-4.6.tar.gz,并重命名為qt-embedded-linux-opensource-src-4.6-arm,在終端中進行操作:#cd /root/local/qt#tar zxvf qt-embedded-linux-opensource-src.tar.gz#mvqt-embedded-linux-opensource-src-4.6 qt-embedded-linux-opensource-src-4.6-x86#tar zxvf qt-embedded-linux-opensource-src.tar.gz#mv qt-embedded-linux-opensource-src-4.6 qt-embedded-linux-opensource-src-4.6-arm(這里,qt-embedded需要解壓兩次,一個重命名為qt-embedded-linux-opensource-src-4.6-x86,另一個為qt-embedded-linux-opensource-src-4.6-arm,根據(jù)他們的名字可以知道前者是適合x架構(gòu)的,后者適合arm架構(gòu)為什么需要兩個呢?如果有開發(fā)板的話,可以只編譯qt-embedded版本成arm架構(gòu)的就可以了,但是很多時候用qvfb的話,開發(fā)會方便很多,所以多編譯一個x86架構(gòu)的也不錯。這里是否有些疑問,qt-x11也是適合x86結(jié)構(gòu)的,這不是和qt-embedded重復了嗎?答案是這樣的,qt-embedded版本只能在嵌入式板子上面運行,編譯成x86架構(gòu)的程序也只能在x86的嵌入式板子上跑。前面說過,我們需要qvfb來開發(fā),但是qvfb只能執(zhí)行x86架構(gòu)的應用程序,所以需要讓qt-embedded生成關于x86的庫和其他文件。而將qt-embedded編譯成arm,又是為什么呢?道理很簡單,我最終的qt應用程序需要在arm架構(gòu)上面運行,當然需要這方面的庫,所以編譯成arm也就順理成章了。好了,現(xiàn)在簡單的總結(jié)一下,首先,使用qt-x11提供的庫和開發(fā)工具開發(fā)出qt應用程序,然后使用qt-embedded關于x86庫和工具再次編譯我們開發(fā)qt應用程序,這是所得到的可執(zhí)行文件就可以在qvfb上運行了,最后,使用qt-embeddedd的arm庫再次編譯就可以得到在arm上能運行的可執(zhí)行程序。很明顯,如果有開發(fā)板,第二步是可要可不要的(最好是要),如果沒有開發(fā)板的話,第三步也就沒必要了,這樣就不需要將qt-embedded編譯成適合arm架構(gòu)的。)2. 編譯及安裝qt-embedded-linux-opensource-src-4.6-x86進入/usr/local/qt/qt-embedded-linux-opensource-src-4.6-x86目錄,進行編譯安裝。在終端中進行如下操作:#cd /usr/local/qt/qt-embedded-linux-opensource-src-4.6-x86#./configure#make(或qmake)#make install(或qmake install)打開/etc/profile文件,在該文件的末尾加上以下語句:export PATH=/usr/local/Trolltech/QtEmbedded-4.6-arm/bin:$PATHexport QTDIR=/usr/local/Trolltech/QtEmbedded-4.6-armexport LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH保存后重啟。OK,qt-embedded-linux-opensource-src-4.6-arm也編譯好了。注意:如果在編譯的過程中出錯,在重新make前需要先執(zhí)行make clean,然后再./configure,再執(zhí)行make的操作。現(xiàn)在搭建的環(huán)境是交叉編譯的,如果不用交

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論