嵌入式實驗報告-10_第1頁
嵌入式實驗報告-10_第2頁
嵌入式實驗報告-10_第3頁
嵌入式實驗報告-10_第4頁
嵌入式實驗報告-10_第5頁
已閱讀5頁,還剩11頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

重慶郵電大學研究生堂下考試答卷2013/2014學年第2學期考試科目嵌入式系統(tǒng)開發(fā)技術姓名李才齊年級2013級專業(yè)儀器科學與技術2014年4月28日一、【實驗題目】 實驗題目:QT程序設計之數碼管二、【實驗目的】實驗目的:1、學會開發(fā)板的掛載;2、掌握數碼管驅動程序的編寫方法;3、熟練并掌握QT程序設計的控制界面設計方法;4、學會對QT應用程序進行條件編譯和下載;5、通過QT應用程序,可操控數碼管進行加1計數或者減1計數。三、【實驗步驟】1、先進行開發(fā)板的掛載:①安裝交叉編譯器:將壓縮包cross-4.2.2-eabi.tar.bz2解壓到/usr/local/arm目錄下即可。②編譯UBOOT:將壓縮包uboot1.1.6_FORLINX_6410.tgz解壓到/forlinux目錄下,并用makesmdk6410_config進行配置,然后用make編譯。③編譯Linux-2.6.28:將壓縮包linux2.6.28_FORLINX_6410.tgz解壓到/forlinux錄下,用makemenuconfig命令,依次進入DeviceDrivers->Graphicssupport->Supportforframebufferdrivers->SelectLEDType目錄下,選擇液晶屏類型,分辨率為640×480。按Esc推出并保存。然后用makezImage命令編譯內核。④在電腦上查看設備端口號,并用超級終端建立連接。在ubuntu上配置IP地址為172.24.58.11并重啟開發(fā)板,在超級終端界面中快速按下空格鍵,輸入setenvbootargs"root=/dev/nfsnfsroot=172.24.58.11:/forlinux/rootip=172.24.58.22:172.24.58.11:172.24.58.1:255.255.255.0::eth0:console=ttySAC0,115200"后按下回車,并輸入saveenv保存配置。⑤重啟開發(fā)板,超級終端界面顯示如下即掛載成功2、QT程序及數碼管驅動程序的生成:①把題目一所使用的timu1和startThread兩個文件夾放在共享文件夾下,分別用cp–r/mnt/hgfs/share/timu1/forlinux/root/和cp–r/mnt/hgfs/share/startThread/forlinux/root/將兩個文件夾復制到/forlinux/root/工作目錄下,輸入cd/forlinux/root/startThread/src進入startThread文件夾里面的src目錄,使用makeclean清除以前的編譯信息。②輸入/fatfish/4.4.3/builddir/sdk/qtopiacore/target/bin/qmake指定編譯器SDK包中的qmake工具路徑。使用geditMakefile編輯Makefile文件,在Makefile的CFLAGS和CXXFLAGS兩欄的等號后面添加-fno-rtti,并保存退出。輸入exportPATH=/usr/local/arm/4.3.2/bin:$PATH檢查當前交叉編譯工具是版本4.3.2,然后使用make生成目標文件,如圖所示:③編譯完成后,進入/forlinux/root/startThread/bin/文件夾會發(fā)現里邊生成了一個名為startThread的文件,該文件即是QT程序操作界面的文件,用filestartThread命令查看該文件信息,會發(fā)現在第一行中間顯示有ARM字樣即成功編譯。使用cpstartThread/forlinux/root/timu1將該文件復制到/folinux/root目錄下自己新建的timu1的文件夾中。再進入timu_1文件夾,用makeclean命令清除以前的編譯文件,然后使用make編譯文件夾中的文件。使用ls查看該文件夾,發(fā)現生成了SEG.o和SEG.ko兩個文件,這兩個文件即是數碼管的驅動程序。用cpSEG.oSEG.ko/forlinux/root/timu1將這兩個文件復制到自己的文件夾下。如下圖所示:3、超級終端的配置:①如下如所示,進入timu1文件夾,使用insmodSEG.ko命令加載新的數碼管驅動程序,輸入cat/proc/devices查看設備號,在下面的輸出信息中找到SEG的設備號為222。②用mknod/dev/SEGc2220建立新的設備,再用ls/dev/SEG查看一下新設備是否已正確安裝。并使用lsmod查看一下在線的設備信息中是否為SEG。若正確顯示如下圖,則表示設備已正確安裝,輸入calibrate進行屏幕校準。③校準完成后,在超級終端輸入一下配置信息exportPATH='/opt/Qtopia4.4.3/bin:/sbin:/usr/sbin:/bin:/usr/bin'exportQPEDIR='/opt/Qtopia4.4.3'exportQTDIR='/opt/Qtopia4.4.3'exportQT_QWS_FONTDIR='/opt/Qtopia4.4.3/lib/fonts/'exportQWS_DISPLAY='LinuxFb:mmWidth76:mmHeight44:1'exportQWS_MOUSE_PROTO='Tslib:/dev/input/event1'exportTSLIB_CALIBFILE='/etc/pointercal'exportTSLIB_CONFFILE='/usr/local/tslib/etc/ts.conf'exportTSLIB_CONSOLEDEVICE='none'exportTSLIB_FBDEVICE='/dev/fb0'exportTSLIB_PLUGINDIR='/usr/local/tslib/lib/ts'exportTSLIB_ROOT='/usr/local/tslib'exportTSLIB_TSDEVICE='/dev/input/event1'exportTSLIB_TSEVENTTYPE='H3600'exportQT_PLUGIN_PATH='/opt/Qtopia4.4.3/plugins:/opt/Qtopia4.4.3/qt_plugins'exportLD_LIBRARY_PATH='/opt/Qtopia4.4.3/lib'如下如所示:④配置完成后輸入./startThread–qws&即可運行程序。到此實驗完成。這時,開發(fā)板顯示如下圖所示,并且按下start和stop數碼管就會開始和停止計數。四、【程序分析】1、對話框主要代碼分析:intfd=-1;//設置文件描述符初始值為-1ThreadDlg::ThreadDlg(QWidget*parent):QDialog(parent){fd=::open("/dev/SEG",O_RDONLY);//打開設備,若能打開,將設 //備值賦給設備描述符if(fd<0){qDebug()<<"Can'topen/dev/SEG\n";//若無法打開設備,顯示//Can'topen/dev/SEG}//設置界面上按鍵的的名稱及屬性startButton=newQPushButton(tr("start"));quitButton=newQPushButton(tr("quit"));stopButton=newQPushButton(tr("stop")); stopButton->setEnabled(false);buttonBox=newQDialogButtonBox;buttonBox->addButton(startButton,QDialogButtonBox::ActionRole); buttonBox->addButton(stopButton,QDialogButtonBox::ActionRole);buttonBox->addButton(quitButton,QDialogButtonBox::RejectRole);//設置按下按鍵的鏈接屬性,使按鍵按下后執(zhí)行相應的程序connect(startButton,SIGNAL(clicked()),this,SLOT(start()));connect(quitButton,SIGNAL(clicked()),this,SLOT(close()));connect(stopButton,SIGNAL(clicked()),this,SLOT(stop()));//設置輸出界面相關屬性QVBoxLayout*mainLayout=newQVBoxLayout;mainLayout->addWidget(buttonBox);setLayout(mainLayout);setWindowTitle(tr("startThread"));}2、界面主函數代碼分析 voidWorkThread::run(){jishu=0;//設定計數初值為0while(true){if(jishu==1000) //如果計數值等于1000,將值重 //新賦值為0,重新開始計數{jishu=0;if(pnum==1)num++;printf("%d\n",num); //在屏幕上打印出計數結果}ioctl(fd,0,(num));jishu++; //計數值每次自動加1}}五、【程序結果】 實驗完成后,運行程序,并在開發(fā)板上點擊start后,電腦超級終端上顯示結果如下圖所示: 運行中的開發(fā)板顯示情況如下圖所示:按下start后,屏幕上從0開始每次加1顯示,數碼管上同時顯示計數的情況,即從0開始依次加1。按下stop后,計數暫停,再按start后,計數繼續(xù)進行。六、【總結】 在這次試驗中,遇到了一些不太清楚的問題,通過查閱資料將其弄清楚。遇到的問題主要有一下幾個:1、/fatfish/4.4.3/builddir/sdk/qtopiacore/target/bin/qmake這一條命令的作用?答:這條命令主要作用是指定編譯器SDK包中的qmake工具路徑,確保qmake命令能夠正確執(zhí)行。2、exportPATH=/usr/local/arm/4.3.2/bin:$PATH這條命令是什么意思?答:檢查當前交叉編譯工具是版本4.3.2,確保使用正確的編譯工具對程序進行編譯。3、用filestartThread命令查看文件信息,在第一行中間顯示有ARM字樣才表示成功編譯,這個具體ARM代表什么意思? 答:顯示ARM表示該程序當前能夠在ARM平臺上運行。4、mknod命令是什么意思,如何使用?答:mknnod命令用于創(chuàng)建一個新的設備文件,當一個新的設備驅動完成后,要加載該設備就需要使用mknod命令。mknod/dev/SEGc2220中,/dev/SEG表示設備路徑,c表示創(chuàng)建一個新的設備,222表示主設備號,0表示次設備號。5、屏幕校準完成后,在超級終端輸入的一系列配置信息是什么意思?如:exportPATH='/opt/Qtopia4.4.3/bin:/sbin:/usr/sbin:/bin:/usr/bin'exportQPEDIR='/opt/Qtopia4.4.3'答:這些表示設置環(huán)境變量,包括編譯器版本,觸屏環(huán)境變量,按鍵環(huán)境變量,庫文件變量等一系列的環(huán)境變量的設定。通過這次試驗,我熟練的掌握了開發(fā)板的掛載流程,掌握了數碼管驅動程序如何進行編譯和加載,同時掌握了QT程序設計的控制界面設計方法,并且試驗了如何對QT應用程序進行條件編譯和下載,最后通過QT應用程序,操控數碼管進行加1計數。雖然在這個過程中遇到了一些挫折,比如開發(fā)板掛載不上,編譯無法通過等問題,但經過細心檢查和仔細思考后,都把這些問題解決了,讓自己在實驗的過程中學到了很多以前看PDF上的文檔中學習不到的東西,這次的實驗讓我受益良多。附錄(程序代碼):1、startThread主函數代碼:externunsignedintnum;externintfd;externintpnum;#include"workThread.h"#include"dialog.h"#include<QTextEdit>#include<QDebug>#include<stdio.h>#include<stdlib.h>#include<unistd.h>#include<sys/ioctl.h>#include<time.h>voidWorkThread::run(){jishu=0;while(true){if(jishu==1000){jishu=0;if(pnum==1)num++;printf("%d\n",num);}ioctl(fd,0,(num));jishu++;}}2、對話框代碼#include<qcheckbox.h>#include<unistd.h>#include<stdlib.h>#include<sys/types.h>#include<sys/stat.h>#include<sys/ioctl.h>#include<fcntl.h>#include<QDebug>#include<QtGui>#include"workThread.h"#include"dialog.h"intpnum=0;unsignedintnum=0;intfd=-1;ThreadDlg::ThreadDlg(QWidget*parent):QDialog(parent){fd=::open("/dev/SEG",O_RDONLY);//打開設備if(fd<0){qDebug()<<"Can'topen/dev/SEG\n";}startButton=newQPushButton(tr("start"));quitButton=newQPushButton(tr("quit"));stopButton=newQPushButton(tr("stop"));stopButton->setEnabled(false);buttonBox=newQDialogButtonBox;buttonBox->addButton(startButton,QDialogButtonBox::ActionRole); buttonBox->addButton(stopButton,QDialogButtonBox::ActionRole);buttonBox->addButton(quitButton,QDialogButtonBox::RejectRole);connect(startButton,SIGNAL(clicked()),this,SLOT(start()));connect(quitButton,SIGNAL(clicked()),this,SLOT(close()));connect(stopButton,SIGNAL(clicked()),this,SLOT(stop()));QVBoxLayout*mainLayout=newQVBoxLayout;mainLayout->addWidget(buttonBox);setLayout(mainLayout);setWindowTitle(tr("startThread"));}voidThreadDlg::start(){pnum=1;for(inti=0;i<MAXSIZE;i++) { threadVector[i]=newWorkThread(); } for(inti=0;i<MAXSIZE;i++) { threadVector[i]->start(QThread::LowestPriority); } stopButton->setEnabled(true); startButton->setEnabled(false);}voidThreadDlg::stop(){ for(inti=0;i<MAXSIZE;i++) { threadVector[i]->terminate(); threadVector[i]->wait(); } startButton->setEnabled(true); stopButton->setEnabled(false);}3、數碼管驅動主程序SEG.c#include<linux/module.h>#include<linux/kernel.h>#include<linux/fs.h>#include<linux/init.h>#include<linux/miscdevice.h>#include<linux/delay.h>#include<asm/irq.h>#include<mach/hardware.h>#include<linux/cdev.h>#include<linux/device.h>#include<linux/gpio.h>#include<plat/gpio-cfg.h>#include<plat/regs-gpio.h>#include<asm/uaccess.h>#include<linux/delay.h>#include<asm/io.h>#defineSEG_MAJOR222#defineDEVICE_NAME"SEG"staticunsignedintcode[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x7F,0xFF};//串并轉換voidHC595_senddata(unsignedchardat){ unsignedinti; for(i=0;i<8;i++)//發(fā)送一個八位數據 { if(((dat<<i)&0x80)==0) gpio_set_value(S3C64XX_GPM(0),0); //第i位為0時,Qn發(fā)送0; else gpio_set_value(S3C64XX_GPM(0),1); //否則發(fā)送1; gpio_set_value(S3C64XX_GPM(2),0); //SCK的上升沿,將數據送進移位寄存器; gpio_set_value(S3C64XX_GPM(2),1); } gpio_set_value(S3C64XX_GPM(1),0); //LCK的上升沿,將數據送進移位寄存器; gpio_set_value(S3C64XX_GPM(1),1); }/*操控數碼管,對數字進行顯示*/staticvoidset_SEG_bit(unsignedlongdat){ unsignedchartmp;//num_LED,num_GPK分別對應片選與位選 unsignedinti,j=1; for(i=0;i<=7;i++) { tmp=readl(S3C64XX_GPKDAT); //設置數碼管的數字 tmp=dat%(j*10)/j; //取位 if(i==4) tmp=code[tmp]&code[10]; else tmp=code[tmp]; writel(tmp,S3C64XX_GPKDAT); HC595_senddata((0x80>>i)); //設置片選 writel(tmp,S3C64XX_GPKDAT); HC595_senddata((0x80>>i)); HC595_senddata((0x00)); //消除余暉 j=j*10; }}staticintSEG_open(structinode*inode,structfile*filp){ unsignedinttmp; /* 將GPM(0){NLED1,SI}端口設置為輸出 將GPM(1){NLED2,RCK}端口設置為輸出 將GPM(2){NLED3,SCK}端口設置為輸出 */ tmp=readl(S3C64XX_GPM

溫馨提示

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

評論

0/150

提交評論