[计算机软件及应用]嵌入式实验报告llisa.doc

上传人:音乐台 文档编号:1991938 上传时间:2019-01-29 格式:DOC 页数:38 大小:179.50KB
返回 下载 相关 举报
[计算机软件及应用]嵌入式实验报告llisa.doc_第1页
第1页 / 共38页
[计算机软件及应用]嵌入式实验报告llisa.doc_第2页
第2页 / 共38页
[计算机软件及应用]嵌入式实验报告llisa.doc_第3页
第3页 / 共38页
亲,该文档总共38页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《[计算机软件及应用]嵌入式实验报告llisa.doc》由会员分享,可在线阅读,更多相关《[计算机软件及应用]嵌入式实验报告llisa.doc(38页珍藏版)》请在三一文库上搜索。

1、一、 相关知识根据IEEE(国际电机工程师协会)的定义,嵌入式系统是“Devices Used to Control,Monitor or Assist the Operation of Equipment,Machinery or Plants。”即控制、监视或者辅助装置、机器和设备运行的装置。目前国内一个普遍被认同的定义是: 以应用为中心、以计算机技术为基础、软件硬件可裁剪、适应应用系统对功能、可靠性、成本、体积、功耗严格要求的专用计算机系统。可以这样认为,嵌入式系统是一种专用的计算机系统,作为装置或设备的一部分。通常,嵌入式系统是一个控制程序存储在ROM中的嵌入式处理器控制板。事实上,所

2、有带有数字接口的设备,如手表、微波炉、录像机、汽车等,都使用嵌入式系统,有些嵌入式系统还包含操作系统,但大多数嵌入式系统都是是由单个程序实现整个控制逻辑。嵌入式系统是计算机软件和硬件的综合体,可涵盖机械或其他的附属装置。所以嵌入式系统可以笼统地分为硬件和软件两部分。嵌入式系统的构架可以分成四个部分:处理器、存储器、输入输出(I/O)和软件(由于多数嵌入式设备的应用软件和操作系统都是紧密结合的,在这里我们对其不加区分,这也是嵌入式系统和通用PC系统的最大区别)。嵌入式系统的组成如下图所示。本学期的实验采用英特尔公司于2003年底推出的PXA270嵌入式处理器。PXA270更适合传统PDA,手持P

3、C,平板电脑,智能手机市场。它最初出现在PDA(比如惠普HP4700)和智能手机(如MOTO E680)上。因此它的扩展接口相当丰富,扩展接口有SD/SDIO/MMC、CF/PCMCIA、CMOS/CCD CAMERA、蓝牙、USB1.1、OTG等。许多厂商选择PXA270作为PMP处理器,是源于它wireless MMX技术和SpeedStep动态电源管理技术。SpeedStep技术原用于英特尔移动处理器,这种技术用通俗的语言表述就是系统需要多高的主频,它就调节到多高的频率,系统不需要时,它就将处理器主频调节到最低,绝不浪费一点点。SpeedStep技术可以将PXA270的主频在26MHz6

4、24MHz(最高)之间自由调节。也就是说,在系统完全空闲时,PXA270可以运行在26MHz的主频下,此时它的功耗将低于0.1毫安。其实,嵌入式系统并不是一个新生的事物,从八十年代起,国际上就有一些IT组织、公司,开始进行商用嵌入式系统和专用操作系统的研发。这其中涌现了一些著名的嵌入式系统:Windows CE、VxWorks、pSOS、QNX、Palm OS、OS-9、LynxOS、Linux等。本学期实验采用Linux环境。从应用上讲,Linux 一般有内核、Shell、文件结构和实用工具四个主要部分,Linux的基本思想有两点:第一,一切都是文件;第二,每个软件都有确定的用途。Linux

5、操作系统不但具有广泛性、灵活性以及高度可设定性等特点,而且主要因为免费、开源和与Unix高度相通而受到计算机爱好者的喜爱。二、 实验内容1、基本实验实验二 RedHat 9的安装此实验完成了在宿主PC端虚拟机的安装,提供了实验所需的Linux操作系统。实验三 建立主机开发环境此实验完成了宿主PC端开发环境的安装与配置。实验四 配置 minicom此实验使宿主PC机与PXA270目标板之间可以通过串口通讯,之后的实验将使用超级终端来监视并控制目标板的工作状态。在每次重启宿主PC机时,须通过ifconfig命令查看该机的IP地址,若其已经复位,则须用命令:ifconfig eth0 192.168

6、.0.100 up重置宿主PC机的IP地址。实验五 配置 TFTP此实验为宿主PC机配置了TFTP服务。TFTP(Trivial File Transfer Protocol)是简单文件传输协议,由于特定开发环境的制约,这一服务是必须的。在配置完成后,每次重启宿主PC机时,都须先输入命令:service xinetd restart,以启动TFTP服务。实验六 配置NFS服务此实验为宿主PC机配置了NFS服务。NFS(Network File System)指网络文件系统,它实现了文件在不同的系统间使用。当我们想用远端档案时,只需调用“mount”就可以远端系统挂接在自己的档案系统之下。每次重

7、启宿主PC机时,都须先输入命令:service nfs restart,以启动nfs服务。实验七HelloWorld此实验通过用c语言编写的简单程序HelloWorld,测试前面几个实验是否成功配置好环境,从超级终端可以看到HelloWorld程序的运行结果。2、基本接口实验(驱动实验)实验十二 简单设备驱动程序本次实验的任务是编写一个字符型设备驱动程序,并学习在应用程序中调用驱动。指导书中提供了本次实验所要用到的程序源代码。由于字符型设备驱动程序的骨架都是相同的,所以,看懂本实验的源代码,学习并模仿其编写方法,对于后续实验有着非常重要的意义。接下来,我将详细分析一下实验十二提供的程序代码。源

8、代码及其注释如下:/ 读入头文件#include #include #include #include #include #include #include / 定义主设备号HELLO DEVICE MAJOR#define SIMPLE_HELLO_MAJOR96/ 定义标识符#define OURS_HELLO_DEBUG / 定义版本号#define VERSION PXA2700EP-SIMPLE_HELLO-V1.00-060530 /*显示版本*/void showversion(void)printk(*);printk(t %s tn,VERSION);printk(*);/*

9、 - 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;/* - WRITE用于向打开的文件写数据,写操

10、作从文件当前偏移量开始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_DEBUGprintk(SIMPLE_HELLO_write-kernel-n);#endifreturn count;/* - IOCTL设备驱动程序中对设备的I/O通道进

11、行管理的函数inode:设备节点flip:打开的一个文件cmd:驱动程序的特殊命令编号data:接收剩余参数-*/ssize_t SIMPLE_HELLO_ioctl (struct inode * inode ,struct file * file, unsigned int cmd, long data)#ifdef OURS_HELLO_DEBUGprintk(SIMPLE_HELLO_ioctl-kernel-n);#endifreturn 0;/*-OPEN打开函数Inode:打开文件所对应的i节点,主要获取从设备号flip:打开的一个文件open()方法最重要的是调用了宏MOD_I

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

13、UNT,这个宏主要用来减少驱动程序使用计数器-*/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;/ - SIMPLE_HELLO设备向系统注册-struct file_operations HELLO_ops =open:SIMPLE_HELLO_open,read:SIMPLE_HELLO_read,wr

14、ite: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_register_chrdev

15、(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; /*-模块初始化函数,调用HW_ HELLO_init 函数-*/static int _init pxa270_ HELLO_init(void) int ret = -ENODEV;#ifdef

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

17、leanup_HELLO_ctl-kernel-n);#endifdevfs_unregister_chrdev (SIMPLE_HELLO_MAJOR, hello_ctl );MODULE_DESCRIPTION(simple hello driver module);/一些描述信息MODULE_AUTHOR(liduo);/驱动作者MODULE_LICENSE(GPL);module_init(pxa270_HELLO_init);/指定驱动程序初始化函数module_exit(cleanup _HELLO_ctl);/指定驱动程序卸载函数对Makefile文件进行修改:TARGET =

18、 pxa270_hello_drv.omodules: $(TARGET)all: $(TARGET)pxa270_hello_drv.o:pxa270_hello_drv.c$(CC) -c $(CFLAGS) $ -o $install:install -d $(INSTALLDIR)install -c $(TARGET).o $(INSTALLDIR)clean:rm -f *.o * core .dependMake工程管理器读入Makefile文件的内容执行编译工作,一个Makefile文件包括: 由make工具创建的目标体(target),通常是目标文件或可执行文件; 要创建目标

19、体所依赖的文件(dependency_file); 创建每个目标需要运行的命令(command)以上两个文件编辑后,用make modules编译驱动程序,编写测试文件simple_test_driver.c,然后GCC编辑器编译测试程序生成测试文件,进入超级终端开始挂载,加载驱动程序,使用命令./test测试,实验完成。实验十三 CPU GPIO 驱动程序设计本次实验要编写PXA270 GPIO的驱动及应用程序并在LINUX 系统中插入自己的驱动程序,调用它,实现用CPU GPIO控制外部LED,利用PXA270核心板上的LED验证我们的工作。1、补充代码补充代码(1)/ - WRITE -

20、ssize_t SIMPLE_GPIO_LED_write (struct file * file ,const char * buf, size_t count, loff_t * f_ops) #ifdef OURS_GPIO_LED_DEBUG printk(SIMPLE_GPIO_LED_write -kernel-n); #endif return count;补充代码(2)/ - OPEN -ssize_t SIMPLE_GPIO_LED_open (struct inode * inode ,struct file * file) #ifdef OURS_GPIO_LED_DEB

21、UG printk(SIMPLE_GPIO_open -kernel-n); #endif MOD_INC_USE_COUNT; return 0;补充代码(3)/ -struct file_operations GPIO_LED_ctl_ops =open:SIMPLE_GPIO_LED_open,read:SIMPLE_GPIO_LED_read,write:SIMPLE_GPIO_LED_write,ioctl:SIMPLE_GPIO_LED_ioctl,release:SIMPLE_GPIO_LED_release,;2、实验作业编写一个程序,使得目标板的核心板上的LED闪烁产生亮7秒

22、、灭5秒的效果。测试程序代码修改如下:while(1)Ioctl(fd,LED_OFF);sleep(7);Ioctl(fd,LED_ON);Sleep(5);3、实验总结通过本次实验,我们对驱动程序的设计编写有了进一步的了解,熟悉了GPIO端口,同时自己设计编写了小程序,更加清楚知道如何操作和控制GPIO端口来实现我们的目的。实验十四 中断实验在理论课中,我们学习了许多中断方面的知识,包括中断向量、中断优先级、中断过程等。在PXA270系统里,中断控制器分外部设备和 PXA270X 处理器设备产生的两个层次的中断,前者是初级的中断源,后者是次级中断源,大量的次级中断源通常被映射为一个初级中断

23、源。在此实验中,我们要编写一个中断程序,利用目标板上的按键SW2来产生中断,使得当每次按下此按键时,在超级终端上打印出响应的信息。1、补充代码补充代码(1)void showversion(void)printk(*n);printk(t%stn,VERSION);printk(*nn); 补充代码(2)/ - READ -ssize_t SIMPLE_INT_read (struct file * file ,char * buf, size_t count, loff_t * f_ops)#ifdef OURS_INT_DEBUGprintk(SIMPLE_INT_read -kernel

24、-n);#endifreturn count;补充代码(3)/ - WRITE -ssize_t SIMPLE_INT_write (struct file * file ,const char * buf, size_t count, loff_t * f_ops)#ifdef OURS_INT_DEBUGprintk(SIMPLE_INT_write -kernel-n);#endifreturn count;补充代码(4)/ -struct file_operations INT_ctl_ops =open:SIMPLE_INT_open,read:SIMPLE_INT_read,wri

25、te:SIMPLE_INT_write,ioctl:SIMPLE_INT_ioctl,release:SIMPLE_INT_release,2、实验总结通过本实验,我们了解了硬件中断的基本概念,熟悉了中断程序的处理过程。同时补充完成了一个相对简单的中断程序,为之后有关中断的实验奠定了基础。实验十五 数码管显示驱动实验在此实验中,我们要编写针对 74LV164 的驱动程序,并用其串并转换功能来控制八段LED数码管的显示。1、补充代码补充代码(1)void showversion(void)printk(*n);printk(t%stn,VERSION);printk(*nn); 补充代码(2)/

26、 - READ -ssize_t SERIAL_LED_read (struct file * file ,char * buf, size_t count, loff_t * f_ops)#ifdef OURS_SERIAL_LED_DEBUGprintk(SERIAL_LED_read -kernel-n);#endifreturn count;补充代码(3)/ - WRITE -ssize_t SERIAL_LED_write (struct file * file ,const char * buf, size_t count, loff_t * f_ops)#ifdef OURS_S

27、ERIAL_LED_DEBUGprintk(SERIAL_LED_write -kernel-n);#endifwrite_byte(* buf);return count;补充代码(4)/ - IOCTL -ssize_t SERIAL_LED_ioctl (struct inode * inode ,struct file * file, unsigned int cmd, long data)#ifdef OURS_SERIAL_LED_DEBUGprintk(SERIAL_LED_ioctl -kernel-n);#endifreturn 0;补充代码(5)/ - OPEN -ssiz

28、e_t SERIAL_LED_open (struct inode * inode ,struct file * file)#ifdef OURS_SERIAL_LED_DEBUGprintk(SERIAL_LED_open -kernel-n);#endifMOD_INC_USE_COUNT;return 0;补充代码(6)/ - RELEASE/CLOSE -ssize_t SERIAL_LED_release (struct inode * inode ,struct file * file)#ifdef OURS_SERIAL_LED_DEBUGprintk(SERIAL_LED_re

29、lease -kernel-n);#endifMOD_DEC_USE_COUNT;return 0;补充代码(7)/ -struct file_operations SERIAL_LED_ops =open: SERIAL_LED_open,read:SERIAL_LED_read,write:SERIAL_LED_write,ioctl:SERIAL_LED_ioctl,release:SERIAL_LED_release,;补充代码(8)/ - INIT -static int _init HW_SERIAL_LED_init(void)int ret = -ENODEV;ret = de

30、vfs_register_chrdev(SERIAL_LED_MAJOR, serial_led,&SERIAL_LED_ops);showversion();if(ret =0;count-)data0=bufcount;ret=write(fd,data,1);sleep(1);(2)设计编写一个程序,实现LED数码管循环显示数字2、4、6、8。测试程序修改代码如下:while(1)for(count=0;count10;count=count+2)data0=bufcount;ret=write(fd,data,1);sleep(1);3、实验总结通过本实验,我们进一步熟悉了驱动程序的编

31、写,同时熟悉了数码管驱动显示的原理与方法。通过自己设计编写程序实现数码管不同的显示效果,进一步加深了我们对LED驱动程序的理解与应用。实验十六 LED点阵驱动程序设计在此实验中,我们要编写针对LED点阵的硬件驱动程序。1、补充代码补充代码(1)void showversion(void)printk(*n);printk(t%stn,VERSION);printk(*nn);补充代码(2)/ - READ -ssize_t SIMPLE_LED_read (struct file * file ,char * buf, size_t count, loff_t * f_ops)#ifdef O

32、URS_LED_DEBUGprintk(SIMPLE_LED_read -kernel-n);#endifreturn count;补充代码(3)/ - IOCTL -ssize_t SIMPLE_LED_ioctl (struct inode * inode ,struct file * file, unsigned int cmd, long data)#ifdef OURS_LED_DEBUGprintk(SIMPLE_LED_ioctl -kernel-n);#endifreturn 0;补充代码(4)/ -struct file_operations LED_ctl_ops =ope

33、n:SIMPLE_LED_open,read:SIMPLE_LED_read,write:SIMPLE_LED_write,ioctl:SIMPLE_LED_ioctl,release:SIMPLE_LED_release,;补充代码(5)static int _init pxa270_LED_CTL_init(void) int ret = -ENODEV;#ifdef OURS_LED_DEBUGprintk(pxa270_LED_CTL_init -kernel-n);#endifret = HW_LED_CTL_init();if(ret)return ret;return 0;补充代

34、码(6)static void _exit cleanup_LED_ctl(void)#ifdef OURS_LED_DEBUGprintk(cleanup_LED_ctl -kernel-n);#endifoutw(0x0000,ioremap_addr);devfs_unregister_chrdev (SIMPLE_LED_MAJOR, led_ary_ctl );2、实验作业(1)要求设计程序,实现按横的方向隔行顺序扫描LED点阵数码管。测试程序代码修改如下:if(fd=-1)printf(“open device %s errorn”,DEVICE_NAME);elsefor(i=1;i8;i+)buf0=c;buf1=r;for(j=1;j=8;j+)write(fd,buf,2);

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1