嵌入式系统实验实验报告.docx
- 文档编号:14971008
- 上传时间:2023-06-28
- 格式:DOCX
- 页数:33
- 大小:1.62MB
嵌入式系统实验实验报告.docx
《嵌入式系统实验实验报告.docx》由会员分享,可在线阅读,更多相关《嵌入式系统实验实验报告.docx(33页珍藏版)》请在冰点文库上搜索。
嵌入式系统实验实验报告
嵌入式系统实验实验报告
一、实验目的
1.基本实验
搭建PXA270嵌入式LINUX开发软硬件环境;安装LINUX操作系统;安装与配置建立宿主机端交叉编译调试开发环境;配置宿主机PC机端的minicom(或超级终端)、TFTP服务、NFS服务,使宿主PC机与PXA270开发板可以通过串口通讯,并开通TFTP和NFS服务。
2.人机接口
键盘驱动;LCD控制;触摸屏数据采集与控制实验;
3.应用实验
完成VGA显示;Web服务器实验;网络文件传输实验;多线程应用实验。
4.扩展应用实验
完成USB摄像头驱动与视频采集;GPS实验;GSM/GPRS通讯;视频播放移植;USB蓝牙设备无线通讯;NFS文件服务器;蓝牙视频文件服务器。
5.QT实验
完成基本嵌入式图形开发环境搭建;“Helloworld!
”QT初探;创建一个窗口并添加按钮;对象通信:
Signal和Slot;菜单和快捷键;工具条和状态栏;鼠标和键盘事件;对话框;QT的绘图;俄罗斯方块;基于QT的GSM手机在嵌入式LINUX下的设计与实现。
二、实验内容
1.人机接口实验
实验一十九键盘驱动实验
▪实验目的:
矩阵键盘驱动的编写
▪实验内容:
矩阵键盘驱动的编写
▪作业要求:
完成键盘加减乘除运算
▪实验作业源码及注释:
#include
#include
#include
#include
#include
#include
#defineDEVICE_NAME“/dev/keyboard”
intmain(void){
intfd;
intret;
unsignedcharbuf[1];
inti,f,j;
doublex;
inta[2]={0};
charpre_scancode=0xff;
fd=open(DEVICE_NAME,O_RDWR);
if(fd==-1)printf(“opendevice%serror\n”,DEVICE_NAME);
else{
buf[0]=0xff;
i=0;f=0;
while
(1){
read(fd,buf,1);
if(buf[0]!
=pre_scancode)//判断是否放开按键
if(buf[0]!
=0xff){//判断是否键入
pre_scancode=buf[0];
usleep(50000);
switch(buf[0]){
case0x12:
{//按下enter
switch(f){//判断运算符
case1:
{j=i;i=(i+1)%2;x=a[i]+a[j];printf(“%d+%d=%d”,a[i],a[j],x);break;}//加法
case2:
{j=i;i=(i+1)%2;x=a[i]-a[j];printf(“%d-%d=%d”,a[i],a[j],x);break;}//减法
case3:
{j=i;i=(i+1)%2;x=a[i]*a[j];printf(“%d*%d=%d”,a[i],a[j],x);break;}//乘法
case4:
{j=i;i=(i+1)%2;x=a[i]/a[j];printf(“%d/%d=%d”,a[i],a[j],x);break;}//除法
defauit:
}
f=0;break;
}
case0x13:
{f=1;i=(i+1)%2;break;}//键入运算符
case0x14:
{f=2;i=(i+1)%2;break;}
case0x15:
{f=3;i=(i+1)%2;break;}
case0x16:
{f=4;i=(i+1)%2;break;}
default:
a[i]=buf[0];//存入数据
}
}
}
ret=close(fd);
}
return0;
}
▪实验结果:
实验效果图
实验二十LCD控制实验
▪实验目的:
了解LCD的基本原理
▪实验内容:
使用总线方式驱动LCD模块,体会与QT下LCD显示的差别
▪作业要求:
在目标板的LCD上显示彩色竖条纹或彩色圆环。
▪实验作业源码及注释:
#include
#include
#include
#include
#include
#defineDEVICE_NAME"/dev/fb"
#defineVERSION"PXA2700EP-LCD-V1.00-060530"
voidshowversion(void)
{
printf("*********************************************\n");
printf("\t%s\t\n",VERSION);
printf("*********************************************\n\n");
}
intmain(void)
{
intfd;
intret;
inti,j,r,R;
unsignedshortbuf[640*480];
showversion();
printf("\nstarttest_lcdtest\n\n");
fd=open(DEVICE_NAME,O_RDWR);
printf("fd=%d\n",fd);
if(fd==-1)
{
printf("opendevice%serror\n",DEVICE_NAME);
}
else
{
for(i=0;i<640*480;i++)
{
buf[i]=0x0001;
}
ret=write(fd,buf,sizeof(buf));
usleep(500000);
close(fd);
fd=open(DEVICE_NAME,O_RDWR);
//竖条纹算法:
通过横坐标分布进行填色
for(r=0;r<640*480;r++){
i=r%640;
if(i>=0&&i<60)buf[r]=0x0001;
if(i>=60&&i<120)buf[r]=0xf800;
if(i>=120&&i<180)buf[r]=0x07ef;
if(i>=180&&i<240)buf[r]=0x001f;
if(i>=240&&i<300)buf[r]=0xffe0;
if(i>=300&&i<360)buf[r]=0x07ff;
if(i>=360&&i<420)buf[r]=0xf81f;
if(i>=420&&i<=480)buf[r]=0xffff;
}
/*
//圆环算法:
通过离圆心半径分布进行填色
for(r=0;r<640*480;r++){
i=r%640;
j=r/640;
R=(i-320)*(i-320)+(j-480)*(j-480);
if(R>=0&&R<2500)buf[r]=0x0001;
if(R>=2500&&R<10000)buf[r]=0xf800;
if(R>=10000&&R<22500)buf[r]=0x07ef;
if(R>=22500&&R<40000)buf[r]=0x001f;
if(R>=40000&&R<62500)buf[r]=0xffe0;
if(R>=62500&&R<90000)buf[r]=0x07ff;
if(R>=90000&&R<122500)buf[r]=0xf81f;
if(R>=122500&&R<=160000)buf[r]=0xffff;
}
*/
ret=write(fd,buf,sizeof(buf));
getchar();
}
return0;
}
▪实验结果:
实验效果图
实验二十一触摸屏数据采集与控制
▪实验目的:
通过实验掌握触摸屏的设计与控制方法
▪实验内容:
编程实现触摸屏到LCD坐标的校准以及坐标采集和计算
随着使用电脑作为信息来源的与日俱增,触摸屏以其易于使用、坚固耐用、反应速度快、节省空间等优点,使得系统设计师们越来越多的感到使用触摸屏的确具有相当大的优越性。
通过此试验,我们学习了触摸屏原理,并通过编写测试程序验证了触摸屏的工作过程。
学习它,掌握它是非常必要的。
2.应用程序实验
实验二十二VGA显示实验
▪实验目的:
了解VGA接口的标准和特点
▪实验内容:
编程实现图像通过VGA接口在显示器上输出
通过本实验的操作,VGA设备成功启动,在液晶屏和显示器上可以看到完全同步的画面。
由于两者格式和刷新频率的差别,实验中做了折中处理,可能显示效果没有达到最优。
实验二十三Web服务器实验
▪实验目的:
学习在PXA270开发板上的SOCKET网络编程
▪实验内容:
SOCKET进行通讯编程
学习使用socket进行通讯编程的过程,了解一个实际的网络通讯应用程序整体设计,阅读HTTP协议的相关内容,学习几个重要的网络函数的使用方法。
读懂HTTPD.C源代码。
在此基础上增加一些其他功能。
在宿主PC机上使用浏览器测试嵌入式WEB服务器的功能。
通过此实验,我们实现了嵌入式Web服务器的基本功能。
实验二十五多线程应用实验
▪实验目的:
学习pthread库函数的使用
▪实验内容:
熟悉ptread库函数的使用,掌握共享锁和信号量的使用方法。
▪作业要求:
利用多线程技术实现键盘控制在LCD液晶屏上显示的可移动的图形。
▪实验作业源码及注释:
#include
#include
#include
#include"pthread.h"
#include
#include
#include
#defineDEVICE_NAME"/dev/fb"
#defineBUFFER_SIZE16
structprodcons{
intbuffer[BUFFER_SIZE];/*theactualdata*/
pthread_mutex_tlock;/*mutexensuringexclusiveaccesstobuffer*/
intreadpos,writepos;/*positionsforreadingandwriting*/
pthread_cond_tnotempty;/*signaledwhenbufferisnotempty*/
pthread_cond_tnotfull;/*signaledwhenbufferisnotfull*/
};
voidinit(structprodcons*b)
{
pthread_mutex_init(&b->lock,NULL);
pthread_cond_init(&b->notempty,NULL);
pthread_cond_init(&b->notfull,NULL);
b->readpos=0;
b->writepos=0;
}
voidput(structprodcons*b,intdata)
{
pthread_mutex_lock(&b->lock);
while((b->writepos+1)%BUFFER_SIZE==b->readpos){
printf("waitfornotfull\n");
pthread_cond_wait(&b->notfull,&b->lock);
}
b->buffer[b->writepos]=data;
b->writepos++;
if(b->writepos>=BUFFER_SIZE)b->writepos=0;
pthread_cond_signal(&b->notempty);
pthread_mutex_unlock(&b->lock);
}
intget(structprodcons*b)
{
intdata;
pthread_mutex_lock(&b->lock);
while(b->writepos==b->readpos){
printf("waitfornotempty\n");
pthread_cond_wait(&b->notempty,&b->lock);
}
data=b->buffer[b->readpos];
b->readpos++;
if(b->readpos>=BUFFER_SIZE)b->readpos=0;
pthread_cond_signal(&b->notfull);
pthread_mutex_unlock(&b->lock);
returndata;
}
structprodconsbuffer;
//键盘输入线程
void*producer(void*data)
{
intfd;
intret;
unsignedcharbuf[2];
//inti;
//doublex;
charpre_scancode=0x44;
fd=open("/dev/keypad",O_RDWR);
//printf("fd=%d\n",fd);
if(fd==-1){
printf("opendevice%serror\n",DEVICE_NAME);
}
else{
buf[0]=0x22;
while
(1){
read(fd,buf,1);
if(buf[0]!
=pre_scancode)
{
if(buf[0]!
=0x44)
{
printf("key=%x\n",buf[0]);
put(&buffer,buf[0]);
}
}
pre_scancode=buf[0];
//sleep
(1);
usleep(50000);
}
//close
ret=close(fd);
//printf("ret=%d\n",ret);
//printf("closekeypad_drivertest\n");
}
}
//LCD显示线程
void*consumer(void*data)
{
intd;
intret;
intfd;
inti;
intj;
unsignedshortbuf[640*480];
fd=open("/dev/fb",O_RDWR);
if(fd==-1)
{
printf("opendevice%serror\n",DEVICE_NAME);
}
else
{
while
(1)
{
d=get(&buffer);
printf("getnumis%d\n",d);
for(i=0;i for(j=640*480*i/d;j<640*480*(i+1)/d;j++) buf[j]=0x0001+i*1000; ret=write(fd,buf,sizeof(buf)); ret=close(fd); ret=open("/dev/fb",O_RDWR); } } } intmain(void) { pthread_tth_a,th_b; void*retval; init(&buffer); pthread_create(&th_a,NULL,producer,0); pthread_create(&th_b,NULL,consumer,0); /*Waituntilproducerandconsumerfinish.*/ pthread_join(th_a,&retval); pthread_join(th_b,&retval); return0; } ▪实验结果: 实验效果图 实验效果图 3.扩展应用实验 实验二十六扩展应用实验 ▪实验目的: 了解摄像头驱动程序,学习视频采集 ▪实验内容: 进行视频采集 ▪实验结果: 实验效果图 实验二十七GPS实验 ▪实验目的: 在LINUX下接收GPS模块信息 ▪实验内容: 接受GPS原始信息 ▪实验结果: 实验效果图 实验二十八GSM/GPRS通讯实验 ▪实验目的: 掌握GSM/GPRS基本概念 ▪实验内容: 测试GSM/GPRS膜酷似是否工作;读取SIM卡的ID,拨打电话测试,接受电话测试,发送接受短信息。 实验二十九视频播放器移植 ▪实验目的: 了解视频播放器原理,会进行视频播放器移植 ▪实验内容: 移植MPlayer的程序,并对其进行编译,移植到PXA270开发板上,在开发板上视频播放 ▪实验结果: 实验效果图 实验三十USB蓝牙设备无线通讯实验 ▪实验目的: 了解在PXA270平台上实现USB蓝牙设备驱动程序的基本原理。 ▪实验内容: 了解USB蓝牙设备,以及USB蓝牙设备应用程序的编写。 实验三十二蓝牙视频文件服务器实验 ▪实验目的: 了解在PXA270平台上实现USB蓝牙设备的原理,了解LINUX蓝牙文件服务器配置的基本过程。 ▪实验内容: USB蓝牙文件服务器配置及文件传输。 ▪实验结果: 实验效果图 4.QT程序设计 在QT环境下的图形界面应用程序设计-计算器。 CCounter类 顶层对话框建立按键通信 显示、反馈信号 流程图: 程序: >>>CCounter.h<<< /******************************************************** *文件名: CCounter.cpp *类名: CCounter *功能: 计算器 *作者: WNX *时间: 2011年10月17日 *版本: 0.01 ********************************************************/ #ifndef_CCELLPHONE_H_ #define_CCELLPHONE_H_ #include #include #include #include #include #include #include"CDigitalButton.h"//包含自定义头文件 #defineiWidthDigital50//数字按钮宽度 #defineiHeightDigital50//数字按钮高度 #defineiWidthOther100//其它按钮宽度 #defineiHeightOther40//其它按钮高度 #definecAppWidth(iWidthDigital*4)//总宽度 #definecAppHeight(iWidthDigital*4+iHeightOther*2)//总高度 #defineiWidthOn100//On按钮宽度 #defineiWidthCancel100//Cancel按钮宽度 #defineDisLenth5 #definecDigital1//没用到 #definecErro2 #definecCall3 classCCounter: publicQDialog { Q_OBJECT//Neverforgetitwhenusingsignal&slot public: CCounter(QWidget*parent=0,constchar*name=0,boolmodal=true);//重载构造函数,默认模态 ~CCounter(); protected: QLCDNumber*m_pLCD; CDigitalButton*m_pDigitalBtn[11]; QPushButton*m_pOn; QPushButton*m_pCancel; QPushButton*AddButton; QPushButton*SubButton; QPushButton*MulButton; QPushButton*DivButton; QPushButton*EqlButton; QStringm_strLCD; intm_stateLCD; protected: voidInitConnect(void);//初始化Signal/Slot的连接 voidInitButton(void);//初始化各个按钮 publicslots: //定义插槽 voidClearLCDNumber(); voidAddLCDNumber(constQString&str); voidDeleteLCDNumber(); voidCulculate(); voidIncCounter(); voidSubCounter(); voidMulCounter(); voidDivCounter(); signals: //定义信号 voidLCDChanged(constQString&str); private: int
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 嵌入式 系统 实验 报告