《嵌入式实验报告.doc》由会员分享,可在线阅读,更多相关《嵌入式实验报告.doc(11页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、【精品文档】如有侵权,请联系网站删除,仅供学习与交流嵌入式实验报告.精品文档.重庆邮电大学研究生堂下考试答卷2013/2014 学年第2学期考试科目 嵌入式系统开发技术 姓 名 李 才 齐 年 级 2013级 专 业 仪器科学与技术 2014年 4 月 28 日一、【实验题目】实验题目:QT程序设计之数码管二、【实验目的】实验目的:1、学会开发板的挂载;2、掌握数码管驱动程序的编写方法;3、熟练并掌握QT程序设计的控制界面设计方法;4、学会对QT应用程序进行条件编译和下载;5、通过QT应用程序,可操控数码管进行加1计数或者减1计数。三、【实验步骤】1、先进行开发板的挂载:安装交叉编译器:将压缩
2、包cross-4.2.2-eabi.tar.bz2解压到/usr/local/arm目录下即可。编译UBOOT:将压缩包uboot1.1.6_FORLINX_6410.tgz解压到/forlinux目录下,并用make smdk6410_config进行配置,然后用make编译。编译Linux-2.6.28: 将压缩包linux2.6.28_FORLINX_6410.tgz解压到/forlinux录下,用make menuconfig命令,依次进入Device Drivers-Graphics support-Support for frame buffer drivers-Select LE
3、D Type目录下,选择液晶屏类型,分辨率为640480。按Esc推出并保存。然后用make zImage命令编译内核。在电脑上查看设备端口号,并用超级终端建立连接。在ubuntu上配置IP地址为172.24.58.11并重启开发板,在超级终端界面中快速按下空格键,输入setenv bootargsroot=/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保存配
4、置。重启开发板,超级终端界面显示如下即挂载成功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目录,使用make clean清除以前的编译信息。 输入/fatfish/
5、4.4.3/builddir/sdk/ qtopiacore/target/bin/qmake指定编译器SDK包中的qmake工具路径。使用gedit Makefile编辑Makefile文件,在Makefile的CFLAGS和CXXFLAGS两栏的等号后面添加-fno-rtti,并保存退出。输入export PATH=/usr/local/arm/ 4.3.2/bin:$PATH检查当前交叉编译工具是版本4.3.2,然后使用make生成目标文件,如图所示: 编译完成后,进入/forlinux/root/startThread/bin/文件夹会发现里边生成了一个名为startThread的文件
6、,该文件即是QT程序操作界面的文件,用file startThread命令查看该文件信息,会发现在第一行中间显示有ARM字样即成功编译。使用cp startThread /forlinux/root/timu1将该文件复制到/folinux/ root目录下自己新建的timu1的文件夹中。再进入timu_1文件夹,用make clean命令清除以前的编译文件,然后使用make编译文件夹中的文件。使用ls查看该文件夹,发现生成了SEG.o和SEG.ko两个文件,这两个文件即是数码管的驱动程序。用cp SEG.o SEG.ko /forlinux/root/timu1将这两个文件复制到自己的文件夹
7、下。如下图所示:3、超级终端的配置: 如下如所示,进入timu1文件夹,使用insmod SEG.ko命令加载新的数码管驱动程序,输入cat /proc/devices查看设备号,在下面的输出信息中找到SEG的设备号为222。用mknod /dev/SEG c 222 0建立新的设备,再用ls /dev/SEG查看一下新设备是否已正确安装。并使用lsmod查看一下在线的设备信息中是否为SEG。若正确显示如下图,则表示设备已正确安装,输入calibrate进行屏幕校准。校准完成后,在超级终端输入一下配置信息export PATH=/opt/Qtopia4.4.3/bin:/sbin:/usr/s
8、bin:/bin:/usr/binexport QPEDIR=/opt/Qtopia4.4.3export QTDIR=/opt/Qtopia4.4.3export QT_QWS_FONTDIR=/opt/Qtopia4.4.3/lib/fonts/export QWS_DISPLAY=LinuxFb:mmWidth76:mmHeight44:1export QWS_MOUSE_PROTO=Tslib:/dev/input/event1export TSLIB_CALIBFILE=/etc/pointercalexport TSLIB_CONFFILE=/usr/local/tslib/etc
9、/ts.confexport TSLIB_CONSOLEDEVICE=noneexport TSLIB_FBDEVICE=/dev/fb0export TSLIB_PLUGINDIR=/usr/local/tslib/lib/tsexport TSLIB_ROOT=/usr/local/tslibexport TSLIB_TSDEVICE=/dev/input/event1export TSLIB_TSEVENTTYPE=H3600export QT_PLUGIN_PATH=/opt/Qtopia4.4.3/plugins:/opt/Qtopia4.4.3/ qt_pluginsexport
10、LD_LIBRARY_PATH=/opt/Qtopia4.4.3/lib如下如所示:配置完成后输入./startThread qws &即可运行程序。到此实验完成。这时,开发板显示如下图所示,并且按下start和stop数码管就会开始和停止计数。四、【程序分析】1、对话框主要代码分析:int fd=-1; /设置文件描述符初始值为-1ThreadDlg:ThreadDlg(QWidget *parent) : QDialog(parent) fd = :open(/dev/SEG, O_RDONLY); / 打开设备,若能打开,将设/备值赋给设备描述符 if (fd 0) qDebug()se
11、tEnabled(false); buttonBox = new QDialogButtonBox; buttonBox-addButton(startButton, QDialogButtonBox:ActionRole);buttonBox-addButton(stopButton, QDialogButtonBox:ActionRole);buttonBox-addButton(quitButton, QDialogButtonBox:RejectRole);/设置按下按键的链接属性,使按键按下后执行相应的程序 connect(startButton, SIGNAL(clicked(),
12、 this, SLOT(start(); connect(quitButton, SIGNAL(clicked(), this, SLOT(close();connect(stopButton, SIGNAL(clicked(), this, SLOT(stop(); /设置输出界面相关属性 QVBoxLayout *mainLayout = new QVBoxLayout; mainLayout-addWidget(buttonBox); setLayout(mainLayout); setWindowTitle(tr(start Thread);2、界面主函数代码分析void WorkTh
13、read:run() jishu=0; /设定计数初值为0 while(true) if(jishu=1000)/如果计数值等于1000,将值重/新赋值为0,重新开始计数 jishu=0; if(pnum=1) num+; printf(%dn,num);/在屏幕上打印出计数结果 ioctl(fd,0,(num); jishu+;/计数值每次自动加1五、【程序结果】实验完成后,运行程序,并在开发板上点击start后,电脑超级终端上显示结果如下图所示:运行中的开发板显示情况如下图所示:按下start后,屏幕上从0开始每次加1显示,数码管上同时显示计数的情况,即从0开始依次加1。按下stop后,计
14、数暂停,再按start后,计数继续进行。六、【总结】在这次试验中,遇到了一些不太清楚的问题,通过查阅资料将其弄清楚。遇到的问题主要有一下几个:1、/fatfish/4.4.3/builddir/sdk/ qtopiacore/target/bin/qmake这一条命令的作用?答:这条命令主要作用是指定编译器SDK包中的qmake工具路径,确保qmake命令能够正确执行。2、export PATH=/usr/local/arm/ 4.3.2/bin:$PATH这条命令是什么意思?答:检查当前交叉编译工具是版本4.3.2,确保使用正确的编译工具对程序进行编译。3、用file startThread
15、命令查看文件信息,在第一行中间显示有ARM字样才表示成功编译,这个具体ARM代表什么意思?答:显示ARM表示该程序当前能够在ARM平台上运行。4、mknod命令是什么意思,如何使用?答:mknnod命令用于创建一个新的设备文件,当一个新的设备驱动完成后,要加载该设备就需要使用mknod命令。mknod /dev/SEG c 222 0中,/dev/SEG表示设备路径,c表示创建一个新的设备,222表示主设备号,0表示次设备号。5、屏幕校准完成后,在超级终端输入的一系列配置信息是什么意思?如:export PATH=/opt/Qtopia4.4.3/bin:/sbin:/usr/sbin:/bi
16、n:/usr/binexport QPEDIR=/opt/Qtopia4.4.3答:这些表示设置环境变量,包括编译器版本,触屏环境变量,按键环境变量,库文件变量等一系列的环境变量的设定。通过这次试验,我熟练的掌握了开发板的挂载流程,掌握了数码管驱动程序如何进行编译和加载,同时掌握了QT程序设计的控制界面设计方法,并且试验了如何对QT应用程序进行条件编译和下载,最后通过QT应用程序,操控数码管进行加1计数。虽然在这个过程中遇到了一些挫折,比如开发板挂载不上,编译无法通过等问题,但经过细心检查和仔细思考后,都把这些问题解决了,让自己在实验的过程中学到了很多以前看PDF上的文档中学习不到的东西,这次
17、的实验让我受益良多。附录(程序代码):1、startThread主函数代码:extern unsigned int num;extern int fd;extern int pnum;#include workThread.h#include dialog.h#include #include #include #include #include #include #include void WorkThread:run() jishu=0; while(true) if(jishu=1000) jishu=0; if(pnum=1) num+; printf(%dn,num); ioctl(
18、fd,0,(num); jishu+;2、对话框代码#include #include #include #include #include #include #include #include #include #include workThread.h#include dialog.hint pnum=0;unsigned int num=0;int fd=-1;ThreadDlg:ThreadDlg(QWidget *parent) : QDialog(parent) fd = :open(/dev/SEG, O_RDONLY); / 打开设备 if (fd 0) qDebug()set
19、Enabled(false); buttonBox = new QDialogButtonBox; buttonBox-addButton(startButton, QDialogButtonBox:ActionRole);buttonBox-addButton(stopButton, QDialogButtonBox:ActionRole); buttonBox-addButton(quitButton, QDialogButtonBox:RejectRole); connect(startButton, SIGNAL(clicked(), this, SLOT(start(); conne
20、ct(quitButton, SIGNAL(clicked(), this, SLOT(close(); connect(stopButton, SIGNAL(clicked(), this, SLOT(stop(); QVBoxLayout *mainLayout = new QVBoxLayout; mainLayout-addWidget(buttonBox); setLayout(mainLayout); setWindowTitle(tr(start Thread);void ThreadDlg:start() pnum=1; for(int i=0;iMAXSIZE;i+)thre
21、adVectori = new WorkThread();for(int i=0;istart(QThread:LowestPriority);stopButton-setEnabled(true);startButton-setEnabled(false);void ThreadDlg:stop()for(int i=0;iterminate();threadVectori-wait();startButton-setEnabled(true);stopButton-setEnabled(false);3、数码管驱动主程序SEG.c#include #include #include #in
22、clude #include #include #include #include #include #include #include #include #include #include #include #include #define SEG_MAJOR 222#define DEVICE_NAME SEGstatic unsigned int code=0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x7F,0xFF;/串并转换void HC595_senddata(unsigned char dat)unsigned int i
23、;for(i=0;i8;i+) /发送一个八位数据if(dati)&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
24、_GPM(1), 1);/*操控数码管,对数字进行显示*/static void set_SEG_bit(unsigned long dat)unsigned char tmp; /num_LED,num_GPK分别对应片选与位选unsigned int i,j=1;for(i=0;ii);/设置片选writel(tmp, S3C64XX_GPKDAT);HC595_senddata(0x80i);HC595_senddata(0x00);/消除余晖j=j*10;static int SEG_open(struct inode *inode,struct file *filp)unsigned
25、 int tmp; /*将GPM(0)NLED1,SI端口设置为输出将GPM(1)NLED2,RCK端口设置为输出将GPM(2)NLED3,SCK端口设置为输出tmp = readl(S3C64XX_GPMCON); tmp = (tmp & (0xfff) ) | (0x111); /set the GPIO output mode writel(tmp, S3C64XX_GPMCON); /*将GPK端口设置为输出*/tmp = readl(S3C64XX_GPKCON); tmp = (tmp & (0xffffffff) | (0x11111111); /set the GPIO ou
26、tput mode writel(tmp, S3C64XX_GPKCON); return 0; int SEG_release(struct inode *inode, struct file *filp) printk(SEG_releasen); return 0; int SEG_ioctl(struct inode *inode,struct file *filp, unsigned int bit,unsigned long dat)set_SEG_bit(dat);/数码管显示return 0;static struct file_operations oper_struct=.
27、owner=THIS_MODULE,.open=SEG_open,.ioctl=SEG_ioctl,.release = SEG_release, int _init SEG_init(void)int tmp;tmp=register_chrdev(SEG_MAJOR,DEVICE_NAME,&oper_struct);if(tmp0)printk(module_init error !n);return tmp;return 0;static void _exit SEG_exit(void)unregister_chrdev(SEG_MAJOR,DEVICE_NAME);module_init(SEG_init);module_exit(SEG_exit);MODULE_AUTHOR(UP-TECH); MODULE_DESCRIPTION(UP-MAGIC SEG Driver);MODULE_LICENSE(GPL);
限制150内