XX邮电大学研究生堂下考试答卷考试科目嵌入式系统开发技术一、【实验题目】实验题目: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目录下,并用make smdk6410_config进行配置,然后用make编译。
③编译Linux-2.6.28: 将压缩包linux2.6.28_FORLINX_6410.tgz解压到/forlinux录下,用make menuconfig命令,依次进入DeviceDrivers->Graphics support->Support for frame buffer drivers->Select LED Type目录下,选择液晶屏类型,分辨率为640×480。
按Esc推出并保存。
然后用make zImage命令编译内核。
④在电脑上查看设备端口号,并用超级终端建立连接。
在ubuntu上配置IP地址为172.24.58.11并重启开发板,在超级终端界面中快速按下空格键,输入setenv bootargs"root=/dev/nfsnfsroot=172.24.58.11:/forlinux/root ip=172.24.58.22:172.24.58.11:172.24.58.1:255.255.255.0::eth 0: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目录,使用make clean清除以前的编译信息。
②输入/fatfish/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的文件,该文件即是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将这两个文件复制到自己的文件夹下。
如下图所示:3、超级终端的配置:①如下如所示,进入timu1文件夹,使用insmod SEG.ko命令加载新的数码管驱动程序,输入cat /proc/devices查看设备号,在下面的输出信息中找到SEG的设备号为222。
②用mknod /dev/SEG c 222 0建立新的设备,再用ls/dev/SEG查看一下新设备是否已正确安装。
并使用lsmod 查看一下在线的设备信息中是否为SEG。
若正确显示如下图,则表示设备已正确安装,输入calibrate进行屏幕校准。
③校准完成后,在超级终端输入一下配置信息exportPATH='/opt/Qtopia4.4.3/bin:/sbin:/usr/sbin:/bin:/usr/bin' export QPEDIR='/opt/Qtopia4.4.3'export QTDIR='/opt/Qtopia4.4.3'export QT_QWS_FONTDIR='/opt/Qtopia4.4.3/lib/fonts/' exportQWS_DISPLAY='LinuxFb:mmWidth76:mmHeight44:1' export QWS_MOUSE_PROTO='Tslib:/dev/input/event1' export TSLIB_CALIBFILE='/etc/pointercal'export TSLIB_CONFFILE='/usr/local/tslib/etc/ts.conf'export TSLIB_CONSOLEDEVICE='none'export TSLIB_FBDEVICE='/dev/fb0'export TSLIB_PLUGINDIR='/usr/local/tslib/lib/ts'export TSLIB_ROOT='/usr/local/tslib'export TSLIB_TSDEVICE='/dev/input/event1'export TSLIB_TSEVENTTYPE='H3600'exportQT_PLUGIN_PATH='/opt/Qtopia4.4.3/plugins:/opt/Qtopia4.4.3/ qt_plugins'export LD_LIBRARY_PATH='/opt/Qtopia4.4.3/lib' 如下如所示:④配置完成后输入./startThread –qws &即可运行程序。
到此实验完成。
这时,开发板显示如下图所示,并且按下start 和stop数码管就会开始和停止计数。
四、【程序分析】1、对话框主要代码分析:int fd=-1; //设置文件描述符初始值为-1 ThreadDlg::ThreadDlg(QWidget *parent): QDialog(parent){fd = ::open("/dev/SEG", O_RDONLY); // 打开设备,若能打开,将设//备值赋给设备描述符if (fd < 0){qDebug()<<"Can't open /dev/SEG\n"; //若无法打开设备,显示//Can'topen/dev/SEG }//设置界面上按键的的名称及属性startButton = new QPushButton(tr("start"));quitButton = new QPushButton(tr("quit"));stopButton = new QPushButton(tr("stop"));stopButton->setEnabled(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()));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 WorkThread::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后,计数继续进行。
六、【总结】在这次试验中,遇到了一些不太清楚的问题,通过查阅资料将其弄清楚。