嵌入式实验报告

上传人:jin****ng 文档编号:157526430 上传时间:2022-09-30 格式:DOCX 页数:24 大小:38.28KB
收藏 版权申诉 举报 下载
嵌入式实验报告_第1页
第1页 / 共24页
嵌入式实验报告_第2页
第2页 / 共24页
嵌入式实验报告_第3页
第3页 / 共24页
资源描述:

《嵌入式实验报告》由会员分享,可在线阅读,更多相关《嵌入式实验报告(24页珍藏版)》请在装配图网上搜索。

1、嵌入式实验报告一、实验目的1、了解嵌入式系统及其相关基础知识。2、了解宿主PC机与PXA270目标版,能正确连接宿主PC机与 PXA270 目标版。3、学会在宿主机上安装Linux操作系统RedHat9.0。、4、学会建立宿主PC机端的开发环境。5、学会配置宿主PC机端的超级终端。6、配置宿主PC机端的TFTP服务,并开通此服务。7、配置宿主PC机端的NFS服务,并开通此服务。8、学会简单Linux驱动程序的设计。二、实验内容(一)基本实验实验一到六为基础实验, 主要是为了在熟悉实验操作平台的同 时为后续实验搭建好软、硬件环境,配置好相关的协议、服务。其中实验一是各个硬件的互联,搭建好了实验的

2、硬件环境。实验 二是在宿主PC端安装虚拟机,提供了实验需要的Linux操作系统。 实验三是宿主 PC 端开发环境的安装与配置。实验四是配置宿主PC机端的超级终端,使PC机与PXA270目 标板之间可以通过串口通讯。在每次重启宿主PC机时,都需要重新 将超级终端挂载到虚拟机上,挂载之前须通过ifconfig命令查看该机 的IP地址,若其已经复位,须用命令:ifconfig ethO 192.168.0.100 up 重置宿主PC机的IP地址。挂载虚拟机的代码为:rootifconfig eth0 192.168.0.50 upmount -o nolock 192.168.0.100:/ /mn

3、t实验五是配置宿主PC机的TFTP服务。TFTP是简单文件传输 协议。每次重启宿主PC机时,都要重启该服务,重启命令为:service xinetd restart。实验六是配置宿主PC机端NFS服务ONFS是指网络文件系统, 它实现了文件在不同的系统间使用。当使用者想用远端档案时,只需 调用“mount ”就可以远端系统挂接在自己的档案系统之下。每次重启 宿主 PC 机时,也都要重启该服务,重启命令为:service nfs restartservice nfs restart(二)基本接口实验实验十二、简单设备驱动程序本次实验的目的是让我们动手实践一个简单的字符型设备驱动 程序,学习Lin

4、ux驱动程序构架,学习在应用程序中调用驱动。驱动程序代码及注释为:/ 头文件#include #include #include #include #include #include #include #define SIMPLE_HELLO_MAJOR 96/ 定义主设备号 HELLO DEVICE MAJOR#define OURS_HELLO_DEBUG/ 定义标识符#define VERSIONPXA2700EP-SIMPLE_HELLO-V1.00-060530 / 定义版本号void showversion(void)/显示版本的函数););printk(printk(t %s t

5、n,VERSION);printk(/* read:用于在指定文件描述符中读取数据 file :是文件指针buf :读取数据缓存区count :请求传输的字节数f_ops :文件当前偏移量 当读取标识符OURS_HELLO_DEBUG时,打印信息,然后返回count*/ssize_t SIMPLE_HELLO_read (struct file * file ,char * buf, size_t count, loff_t * f_ops) #ifdef OURS_HELLO_DEBUGprintk(SIMPLE_HELLO_read-kernel-n);#endifreturn count

6、;/* write:用于向打开的文件写数据file :是文件指针buf :写入数据缓存区count :求传输的字节数f_ops :文件当前偏移量当读取标识符OURS_HELLO_DEBUG时,打印信息,然后返回count*/ssize_t SIMPLE_HELLO_write (struct file * file ,const char * buf, size_t count, loff_t * f_ops) #ifdef OURS_HELLO_DEBUG printk(SIMPLE_HELLO_write-kernel-n);#endifreturn count;/* ioctl:对设备的

7、I/O通道进行管理的函数inode:设备节点flip :打开的一个文件cmd :驱动程序的特殊命令编号data :接收剩余参数*/ssize_t SIMPLE_HELLO_ioctl (struct inode * inode ,struct file * file, unsigned int cmd, long data) #ifdef OURS_HELLO_DEBUG printk(SIMPLE_HELLO_ioctl-kernel-n);#endifreturn 0;/*open:打开函数inode :打开文件所对应的i节点,获取从设备号flip :打开的一个文件open()方法最重要的

8、是调用了宏MOD_INC_USE_COUNT,这个宏主要用来使驱动程序使用计数器,避免不正确卸载程序*/ssize_t SIMPLE_HELLO_open (struct inode * inode ,struct file * file) #ifdef OURS_HELLO_DEBUG printk(SIMPLE_HELLO_open-kernel-n);#endifMOD_INC_USE_COUNT;return 0; /* released :关闭函数Inode :打开文件所对应的i节点,主要获取从设备号flip :打开的一个文件release()方法最重要的是调用了宏MOD_DEC_I

9、NC_USE_COUNT,这个宏主要用来减少驱动程序使用计数器*/ssize_t SIMPLE_HELLO_release (struct inode * inode ,struct file * file) #ifdef OURS_HELLO_DEBUGprintk(SIMPLE_HELLO_release-kernel-n);#endifMOD_DEC_INC_USE_COUNT;return 0;struct file_operations HELLO_ops =/ SIMPLE_HELLO 设备向系统注册open:SIMPLE_HELLO_open,read:SIMPLE_HELLO_

10、read,write:SIMPLE_HELLO_write,ioctl:SIMPLE_HELLO_ioctl,release:SIMPLE_HELLO_release,;/* INIT :驱动程序初始化devfs_register_chrdev (SIMPLE_HELLO_MAJOR,hello_serial_ctl, & HELLO_ops 最为主要 devfs_register_chrdev注册设备驱动程序,包括主设备号、驱动程序名、结构体指针*/static int _init HW_ HELLO_init(void)int ret = -ENODEV;ret = devfs_regis

11、ter_chrdev(SIMPLE_HELLO_MAJOR, hello_serial_ctl,& HELLO_ops);showversion();if(ret0)printk(pxa270 init_module failed with %d n-kernel-,ret);elseprintk(pxa270 hello_driver register success!-kernel-n);return ret;static int _init pxa270_ HELLO_init(void)模块初始化函数,调用 HW_ HELLO_init 函数int ret = -ENODEV;#ifd

12、ef OURS_HELLO_DEBUG printk(pxa270_ HELLO_init-kernel-n);#endifret = HW_ HELLO_init();if (ret)return ret;return 0;/*模块卸载函数devfs_unregister_chrdev (SI MPLE_HELLO_MAJOR,hello _ctl最为主要devfs_unregister_chrdev卸载设备驱动程序,包括主设备号、驱动程序名*/static void _exit cleanup_ HELLO_ctl(void)#ifdef OURS_HELLO_DEBUG printk(c

13、leanup_HELLO_ctl-kernel-n);#endifdevfs_unregister_chrdev (SIMPLE_HELLO_MAJOR,IIhello_ctl );MODULE_DESCRIPTION(simple hello driver module);/描述信息MODULE_AUTHOR(liduo);/驱动程序作者姓名MODULE_LICENSE(GPL);module_init(pxa270_HELLO_init);/指定驱动程序初始化函数module_exit(cleanup _HELLO_ctl);/指定驱动程序卸载函数Makefile 文件代码:#TOPDIR

14、:=$(shell cd .; pwd) TOPDIR:=.KERNELDIR=/pxa270_linux/linux INCLUDEDIR=$(KERNELDIR)/include CROSS_COMPILE=arm-linux-AS =$( CROSS_COMPILE)asLD =$( CROSS_COMPILE)ldCC =$( CROSS_COMPILE)gccCPP =$( CC) -EAR =$( CROSS_COMPILE)arNM =$( CROSS_COMPILE)nmSTRIP =$( CROSS_COMPILE)stripOBJCOPY=$( CROSS_COMPILE)

15、objcopyOBJDUMP=$( CROSS_COMPILE)objdumpCFLAGS+=-I.CFLAGS+=-Wall -O -D_KERNEL_ -DMODULE -l$(INCLUDEDIR)TARGET = pxa270_hello_drv.omodules: $(TARGET)all: $(TARGET)pxa270_hello_drv.o:pxa270_hello_drv.c$(CC) -c $(CFLAGS) $A -o $clean:rm -f *.o * core .dependMakefile文件的内容用于执行编译工作,一个 Makefile文件包括: 由make 工

16、具创建的目标体(target),通常是目标文件或可执行文件; 要创建目标体 所依赖的文件(dependency_file创建每个目标需要运行的命令( command)。以上两个文件编辑完成后后,用 make modules 编译驱动程序, 编写测试文件simple_test_driver.c,然后GCC编辑器编译测试程序 生成测试文件。成功生成测试文件后用超级终端开始挂载,加载驱动 程序,使用命令./test测试,观察测试结果,实验完成。实验十三、CPU GPIO驱动程序设计本实验是让我们在linux系统中插入自己的驱动程序,调用它。实现用CPU GPIO控制外部LED,利用PXA270核心板

17、上的LED验 证我们的工作。驱动程序代码:驱动程序代码与实验十二无大区别,下面列出需要补充的代码补充代码(1):#ifdef OURS_GPIO_LED_DEBUG printk(SIMPLE_GPIO_LED_write-kernel-n);#endifreturn count;补充代码(2):#ifdef OURS_GPIO_LED_DEBUG printk(SIMPLE_GPIO_LED_open-kernel-n);#endif MOD_INC_USE_COUNT;return 0;补充代码(3):open: SIMPLE_GPIO_LED_open, read: SIMPLE_GPI

18、O_LED_read, write: SIMPLE_GPIO_LED_write, ioctl: SIMPLE_GPIO_LED_ioctl, release: SIMPLE_GPIO_LED_release,Makefile 文件: 将实验十二相关代码作如下修改即可: TARGET = pxa270_gpio_led_drv.omodules: $(TARGET)all: $(TARGET)pxa270_gpio_led_drv.o:pxa270_gpio_led_drv.c $(CC) -c $(CFLAGS) $八-o $编译运行和实验十二相同,不再赘述。作业题代码:原测试文件中是让LE

19、D灯亮一秒灭一秒。作业中要求将LED灯改为亮 7 秒,灭 5 秒的效果。修改代码如下:while(1) ioctl(fd, LED_OFF);sleep(5);/ 灭 5 秒ioctl(fd,LED_ON);sleep(7); / 亮7 秒实验十四、中断实验本实验是让我们学习中断的相关概念,以及Linux系统是如何处理中断的,并且学会编写获取和处理外中断的驱动程序。驱动程序代码:补充代码(1):););printk(printk(t %s tn,VERSION);printk(补充代码(2):#ifdef OURS_INT_DEBUG printk(SIMPLE_INT_read-kernel

20、-n);#endif return count;补充代码(3):#ifdef OURS_INT_DEBUG printk(SIMPLE_INT_write-kernel-n);#endif return count;补充代码(4):open: SIMPLE_INT_open,read: SIMPLE_INT_read,write: SIMPLE_INT_write,ioctl: SIMPLE_INT_ioctl,release: SIMPLE_INT_release,Makefile 文件如实验十三做相应修改,不再赘述。本实验不需要测试程序。因为中断是一个异步的外部事件,要求 每到中断发生的时

21、候,系统都需要响应,所以不需要测试程序,系统 也会自动响应中断的。驱动程序编译成功后,直接用超级终端挂载,按目标版键盘上方 的 SW2 键就会触发中断。实验十五、数码管显示驱动实验本实验中,我们要编驱动程序以实现在Linux系统下控制LED数码管的显示。驱动程序代码: 补充代码(1):););printk( printk(t %s tn,VERSION);printk(补充代码(2):#ifdef OURS_SERIAL_LED_DEBUG printk(SIMPLE_SERIAL_LED_read-kernel-n);#endifreturn count;补充代码(3):#ifdef OUR

22、S_ SERIAL_LED_DEBUG printk(SIMPLE_ SERIAL_LED_write-kernel-n);#endifreturn count;补充代码(4):#ifdef OURS_ SERIAL_LED _DEBUG printk(SIMPLE_ SERIAL_LED _ioctl-kernel-n);#endifreturn 0;补充代码(5):#ifdef OURS_ SERIAL_LED _DEBUG printk(SIMPLE_ SERIAL_LED _open-kernel-n);#endif MOD_INC_USE_COUNT;return 0;补充代码(6)

23、:#ifdef OURS_ SERIAL_LED _DEBUG printk(SIMPLE_ SERIAL_LED _release-kernel-n);#endif MOD_DEC_INC_USE_COUNT;return 0;补充代码(7):open:SIMPLE_ SERIAL_LED _open,read:SIMPLE_ SERIAL_LED _read,write:SIMPLE_ SERIAL_LED _write,ioctl:SIMPLE_ SERIAL_LED _ioctl,release: SIMPLE_ SERIAL_LED _release,补充代码(8):int ret

24、= -ENODEV;ret = devfs_register_chrdev(SIMPLE_SERIAL_LED_MAJOR, serial_led_ctl,& SERIAL_LED _ops);showversion();if(ret=0;count-)/ 倒序显示数字 data0 = bufcount; ret=write(fd,data,1); sleep(1);2、 实现目标板上LED数码管循环显示数字2、4、6、8、0或8、6、 4、 2、 0。将原测试程序相关代码修改如下:while(1)/ 只循环显示偶数 for(count=0;count9;count=count+2) data

25、0 = bufcount; ret=write(fd,data,1); sleep(1); 实验十六、LED点阵驱动程序设计本实验要求我们学会编写驱动程序,实现在Linux系统下控制LED点阵显示,并在此基础上稍加改进,实现对LED的控制。驱动程序代码: 补充代码(1):););printk( printk(t %s tn,VERSION);printk(补充代码(2):#ifdef OURS_LED_DEBUG printk(SIMPLE_LED_read-kernel-n);#endif return count;补充代码(3):#ifdef OURS_LED_DEBUG printk(S

26、IMPLE_LED_ioctl-kernel-n);#endifreturn 0;补充代码(4):open:SIMPLE_LED_open,read:SIMPLE_LED_read,write:SIMPLE_LED_write,ioctl:SIMPLE_LED_ioctl,release:SIMPLE_LED_release,补充代码(5):int ret = -ENODEV;#ifdef OURS_LED_DEBUG printk(pxa270_LED_init-kernel-n);#endifret = HW_ LED_init();if (ret)return ret;return 0;

27、补充代码(6):#ifdef OURS_LED_DEBUGprintk(cleanup_LED_ctl-kernel-n);#endifdevfs_unregister_chrdev (SIMPLE_LED_MAJOR, led_ctl );Makefile 程序仍然可以用前一个实验的,只要把相关函数名改了就可以,此处不再赘述。作业题代码:原测试程序中有如下代码:for (i=1;i=8;i+) buf0=c;buf1=r;/ rowfor (j=1;j=8;j+)write(fd,buf,2);printf (buf0,buf1: %x,%xn,buf0,buf1);usleep(20000

28、0);/ sleep 0.2 secondc = c1;buf0=c;/ columnc = 1;r = r1;通过 for 循环嵌套,列向量左移8次后行向量才移1位,实现了点阵 横向逐行扫描。作业题代码:1、 作业题要求实现按横的方向隔行顺序扫描LED点阵数码管,修改上段代码如下;for (i=1;i=4;i+)/ 修改外层循环次数为 4 buf0=c; buf1=r;for (j=1;j=8;j+) write(fd,buf,2);printf (buf0,buf1: %x,%xn,buf0,buf1);usleep(200000);/ sleep 0.2 secondc = c1;buf

29、0=c;c = 1;r = r2;/ 行向量每次移 2 位 ,实现隔行扫描2、 作业题要求实现按竖的方向顺序扫描LED点阵数码管,修改原测试程序代码如下:for (i=1;i=8;i+)/外层循环次数不变仍为8 buf0=c; buf1=r;for (j=1;j=8;j+)write(fd,buf,2);printf (buf0,buf1: %x,%xn,buf0,buf1);r = 1;c = c1;usleep(200000);/ sleep 0.2 secondr= r1;buf1=r;/ 修改内循环为对行向量移位/ 修改外循环为对列向量移位实验十七、AD驱动实验本实验要求我们学会编写驱

30、动程序对模拟量输入进行采集,并转换为数字量显示在超级终端上,从而实现AD转换。驱动程序代码:补充代码(1):););printk( printk(t %s tn,VERSION);printk(补充代码(2):#ifdef OURS_ADCTL_DEBUG printk(SIMPLE_ADCTL_read-kernel-n);#endif return count;补充代码(3):#ifdef OURS_ADCTL_DEBUG printk(SIMPLE_ADCTL_write-kernel-n);#endifreturn count;补充代码(4):#ifdef OURS_ADCTL_DEB

31、UG printk(SIMPLE_ADCTL_open-kernel-n);#endif MOD_INC_USE_COUNT;return 0;补充代码(5):#ifdef OURS_ADCTL_DEBUG printk(SIMPLE_ADCTL_release-kernel-n);#endif MOD_DEC_INC_USE_COUNT;return 0;补充代码(6):open: read:SIMPLE_ADCTL_open,SIMPLE_ADCTL_read,write:SIMPLE_ADCTL_write,ioctl:SIMPLE_ADCTL_ioctl,release:SIMPLE_

32、ADCTL_release,补充代码(7):int ret = -ENODEV;ret = devfs_register_chrdev(SIMPLE_ADCTL_MAJOR, adctl_serial_ctl,& ADCTL_ops); showversion();if(ret0)printk(pxa270 init_module failed with %d n-kernel-,ret);else printk(pxa270 adctl_driver register success!-kernel-n);return ret;补充代码(8):int ret = -ENODEV;#ifdef

33、 OURS_ADCTL_DEBUGprintk(pxa270_ ADCTL_init-kernel-n);#endifret = HW_ ADCTL_init();if (ret)return ret;return 0;补充代码(9):#ifdef OURS_ADCTL_DEBUGprintk(cleanup_ADCTL_ctl-kernel-n);#endifdevfs_unregister_chrdev (SIMPLE_ADCTL_MAJOR, adctl_ctl );Makefile 文件可以用前一个程序的文件,只要将相应部分的代码修改 即可,此处不再赘述。作业题代码:for(i=0;i

34、50;i+) Val0 = ioctl(fd,UCB_ADC_INP_AD1,0);usleep(100);Val1 = ioctl(fd,UCB_ADC_INP_AD0,0);usleep(500000);作业题要求将UCB_ADC_INP_ADO换成其他通道,但由于AD通道只有AD0和AD1,故只是将原测试程序代码中的AD0与AD1对换。实验十八、DA驱动实验本实验要求我们编写驱动程序,实现将数字信号转换成模拟信号并在示波器上显示出模拟信号波形,即实现DA转换。驱动程序代码: 补充代码(1)头文件#include #include #include #include #include #i

35、nclude #include #include补充代码(2):););printk( printk(t %s tn,VERSION);printk(补充代码(3):#ifdef OURS_DA_DEBUG printk(SIMPLE_DA_read-kernel-n);#endif return count;补充代码(4):#ifdef OURS_DA_DEBUG printk(SIMPLE_DA_write-kernel-n);#endif return count;补充代码(5):#ifdef OURS_DA_DEBUG printk(SIMPLE_DA_ioctl-kernel-n);

36、#endif return 0;补充代码(6):#ifdef OURS_DA_DEBUG printk(SIMPLE_DA_open-kernel-n);#endifMOD_INC_USE_COUNT;return 0;补充代码(7):open: SIMPLE_DA_open,read: SIMPLE_DA_read,write: SIMPLE_DA_write,ioctl: SIMPLE_DA_ioctl,release: SIMPLE_DA_release,补充代码(8):int ret = -ENODEV;ret = devfs_register_chrdev(SIMPLE_DA_MAJ

37、OR, da_serial_ctl,& DA_ops); showversion();if(ret0)printk(pxa270 init_module failed with %d n-kernel-,ret);elseprintk(pxa270 DA_driver register success!-kernel-n);补充代码(9):int ret = -ENODEV;#ifdef OURS_DA_DEBUGprintk(pxa270_ DA_CTL_init-kernel-n);#endifret = HW_ DA_CTL_init();if (ret)return ret;retur

38、n 0;补充代码(10):#ifdef OURS_DA_DEBUGprintk(cleanup_DA_ctl-kernel-n);#endifdevfs_unregister_chrdev (SIMPLE_DA_MAJOR, da_ctl );补充代码(11):MODULE_DESCRIPTION(simple da driver module);MODULE_AUTHOR(phy);MODULE_LICENSE(GPL);module_init(pxa270_DA_init);module_exit(cleanup _DA_ctl);Makefile 文件可以继续用前面程序 Mekefile

39、 的代码,只需要将相应 部分的代码修改即可,在此不再赘述。作业题代码:作业题要求我们编写一个输出三角波的程序,由于原测试程序中 已有产生正弦波和方波的代码,此处我们只要将原测试程序中产生正 弦波的代码改成产生三角波的代码即可。原正弦波代码:x=sin(j/POINT)*(2*M_PI); 改成产生三角波的代码为: x=(j/POINT)*(5*M_PI); 至此我们的嵌入式实验已全部完成。三、实验总结在本次嵌入式实验中,我们首先在老师的指导下了解了嵌入式系 统,初步接触了 Linux 环境。我们的实验板是 OURS-PXA270-EP , 它是一款基于INTEL XSCALE PXA270处理

40、器,针对高校嵌入式系 统教学和实验科研的平台。这款设备主要包括核心板与底板两个部分, 核心板主要集成了高速的PXA270 CPU,配套的存储器,网卡等设备; 底板主要是各种类型的接口与扩展口。了解了实验的平台后,在接下来的基本实验中我们学会了嵌入式开发系统硬件环境的搭建、Linux操作系统RedHat9的安装、软件环境的搭建,以及配置超级终端,配置通讯服务。这些实验内容只要按 照实验指导书上的步骤一步一步做即可,不会出现难以解决的问题, 一般都会做的很顺利。基本试验之后就是基本接口实验,在做该部分的实验之前,我们 需要重启基本实验中我们配置好的服务,重新挂载我们配置好的超级 终端。该部分实验主要是要我们学会简单驱动程序的编写,其实按照 书上的要求做,也不是很难,但是,该部分实验要输入的代码比较多, 在输入的时候很容易出现格式错误,所以需要十二分的细心。基本接口实验每个实验后面的作业题应该是实验中较难的部分 了,但是只要看懂了书上已给出的测试程序的代码,再在此基础上修 改即可,一般只需修改一两行代码,只要认真做就不是特别困难。

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!