版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
重庆邮电大学研究生堂下考试答卷2013/2014学年第2学期考试科目嵌入式系统开发技术姓名李才齐年级2013级专业仪器科学与技术2014年4月28日一、【实验题目】 实验题目:QT程序设计之数码管二、【实验目的】实验目的:1、学会开发板的挂载;2、掌握数码管驱动程序的编写方法;3、熟练并掌握QT程序设计的控制界面设计方法;4、学会对QT应用程序进行条件编译和下载;5、通过QT应用程序,可操控数码管进行加1计数或者减1计数。三、【实验步骤】1、先进行开发板的挂载:①安装交叉编译器:将压缩包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并重启开发板,在超级终端界面中快速按下空格键,输入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保存配置。⑤重启开发板,超级终端界面显示如下即挂载成功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/文件夹会发现里边生成了一个名为startThread的文件,该文件即是QT程序操作界面的文件,用filestartThread命令查看该文件信息,会发现在第一行中间显示有ARM字样即成功编译。使用cpstartThread/forlinux/root/timu1将该文件复制到/folinux/root目录下自己新建的timu1的文件夹中。再进入timu_1文件夹,用makeclean命令清除以前的编译文件,然后使用make编译文件夹中的文件。使用ls查看该文件夹,发现生成了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&即可运行程序。到此实验完成。这时,开发板显示如下图所示,并且按下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);//设置按下按键的链接属性,使按键按下后执行相应的程序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}}五、【程序结果】 实验完成后,运行程序,并在开发板上点击start后,电脑超级终端上显示结果如下图所示: 运行中的开发板显示情况如下图所示:按下start后,屏幕上从0开始每次加1显示,数码管上同时显示计数的情况,即从0开始依次加1。按下stop后,计数暂停,再按start后,计数继续进行。六、【总结】 在这次试验中,遇到了一些不太清楚的问题,通过查阅资料将其弄清楚。遇到的问题主要有一下几个:1、/fatfish/4.4.3/builddir/sdk/qtopiacore/target/bin/qmake这一条命令的作用?答:这条命令主要作用是指定编译器SDK包中的qmake工具路径,确保qmake命令能够正确执行。2、exportPATH=/usr/local/arm/4.3.2/bin:$PATH这条命令是什么意思?答:检查当前交叉编译工具是版本4.3.2,确保使用正确的编译工具对程序进行编译。3、用filestartThread命令查看文件信息,在第一行中间显示有ARM字样才表示成功编译,这个具体ARM代表什么意思? 答:显示ARM表示该程序当前能够在ARM平台上运行。4、mknod命令是什么意思,如何使用?答:mknnod命令用于创建一个新的设备文件,当一个新的设备驱动完成后,要加载该设备就需要使用mknod命令。mknod/dev/SEGc2220中,/dev/SEG表示设备路径,c表示创建一个新的设备,222表示主设备号,0表示次设备号。5、屏幕校准完成后,在超级终端输入的一系列配置信息是什么意思?如:exportPATH='/opt/Qtopia4.4.3/bin:/sbin:/usr/sbin:/bin:/usr/bin'exportQPEDIR='/opt/Qtopia4.4.3'答:这些表示设置环境变量,包括编译器版本,触屏环境变量,按键环境变量,库文件变量等一系列的环境变量的设定。通过这次试验,我熟练的掌握了开发板的挂载流程,掌握了数码管驱动程序如何进行编译和加载,同时掌握了QT程序设计的控制界面设计方法,并且试验了如何对QT应用程序进行条件编译和下载,最后通过QT应用程序,操控数码管进行加1计数。虽然在这个过程中遇到了一些挫折,比如开发板挂载不上,编译无法通过等问题,但经过细心检查和仔细思考后,都把这些问题解决了,让自己在实验的过程中学到了很多以前看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++)//发送一个八位数据 { if(((dat<<i)&0x80)==0) gpio_set_value(S3C64XX_GPM(0),0); //第i位为0时,Qn发送0; else gpio_set_value(S3C64XX_GPM(0),1); //否则发送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. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年酒店营业部年工作总结(3篇)
- 外科院感科工作总结(2篇)
- 初中八年级数学《全等三角形的判定(5)》教学设计
- 2026年南京水务集团有限公司人员招聘考试备考题库及详细答案解析
- 2026年茂名市烟草专卖局人员招聘考试备考试题及详细答案解析
- 2025下半年中储粮油脂有限公司招聘笔试历年参考题库附带答案详解
- 高三数学一轮复习:同角三角函数的基本关系与诱导公式教学设计
- 高二德育班会教学设计:冬季防火风险识别与应急决策能力培养
- 2025医师定期考核考试题库及参考答案
- 小学信息技术四年级《拼图美化照片》教学设计
- 2025中国红十字会救护员培训理论考试试题及答案
- Unit 4 Plants around us-Part A Let's talk 课件(内嵌视频)2026-2027学年人教PEP版英语三年级上册
- 2027年中国邮政集团有限公司秋季校园招聘笔试模拟试题及答案详解
- 光伏发电项目逆变器调试方案
- 西梅制干、分级技术规范
- AQ 3026-2026《化工企业设备检修作业安全规范》宣贯解读课件
- 安全工作联动工作制度
- 小红书 2026家生活情绪需求洞察白皮书
- 雨课堂学堂在线学堂云《漫游插画星(昆明理工)》单元测试考核答案
- 24J113-1 内隔墙-轻质条板(一)
- 2026年中核科技行测笔试题库
评论
0/150
提交评论