




已阅读5页,还剩10页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
嵌入式系统开发实验报告班 级: 姓 名: 班内序号: 学 号: 日 期: 一、 实验目的通过实验熟悉Linux环境,并掌握一些基本接口驱动的写法和用C语言编写简单的实验程序。学习LINUX开发环境的搭建,通讯配置等。并熟练掌握LINUX驱动程序的编写及开发流程。对嵌入式系统有进一步的了解。二、 实验设备1.一套PXA270EP嵌入式实验箱2.安装Redhat9的宿主PC机,并且配置好ARMLinux的开发环境三、 基础实验(实验一实验七)实验一七为基础实验, 目的是为后续实验搭建好软、硬件环境,配置好相关的协议、服务,并通过编写最简单的HelloWorld程序进行测试。由于后面的实验都要依靠前面实验的配置,故本段只着重叙述实验七的具体实现。1. 实验五实验五为宿主PC机配置了TFTP服务。TFTP(Trivial File Transfer Protocol)是简单文件传输协议,由于特定开发环境的制约,这一服务是必须的。在配置完成后,每次重启宿主PC机时,都须先输入命令:service xinetd restart,以启动TFTP服务。2. 实验六实验六为宿主PC机配置了NFS服务。NFS(Network File System)指网络文件系统,它实现了文件在不同的系统间使用。当我们想用远端档案时,只需调用“mount”就可以远端系统挂接在自己的档案系统之下。每次重启宿主PC机时,都须先输入命令:service nfs restart,以启动nfs服务。3. 实验七实验七通过用c语言编写的简单程序HelloWorld,测试前面几个实验是否成功配置好环境,从超级终端可以看到HelloWorld程序的运行结果。实验步骤如下:1) 硬件连接: 连接宿主 PC 机和一台 PXA270-RP目标板。 2) 打开宿主PC 机电源,进入 Linux操作系统。 3) 启动RedHat 9.0 的图形界面,如下图,若您是以 root 身份登陆在文本模式下,则输入命令 startx 启动图形界面。进入 RedHat 9.0 图形界面后,打开一个终端窗(Terminal)。4) 输入minicom然后回车, minicim设置为115200 8NI无流控。5) 打开PXA270_RP目标板电源,按目标板上的BOOT键,在minicom中应该会看到如下图:6) 在minicom终端窗口中,如图,输入下列四条命令rootifconfig eth 0 upmount -o nolock 00:/ /mntcd /mnt此时,先将该窗口最小化,在后面的第 10 操作步骤中还将会回到该窗口中进行操作。7) 宿主机上打开一个终端窗口(Terminal),点击【红帽/System Tools/Terminal】启动终端窗口,输入下列 4 条命令: cd /home mkdir HW cd HW vi HelloWorld.c /*请您输入程序 7.1 程序清单*/ 此时会显示一个空白的屏幕,这条命令的含义是,使用 Vi 编辑器,对一个名叫 HelloWorld.c的文件进行编辑,我们看到的空白窗口是对文件进行编辑的窗口,如下图。就像在 Windows系统下面使用写字板等一样道理。 在 vi 里面先单击键盘 A 键,然后左下角会变成INSER。输入程序的时候和其他编辑器是一样的,如下图。当输入程序完毕后,单击键盘 Esc 键,然后按“:”(冒号)此时左下角会出现冒号然后输入“wq”最后按“Enter”确认存盘退出 vi 编辑器,如下图。8) 在上面同一个终端窗口中,输入下列 2 条命令交叉编译 HelloWorld.c源程序,并查看生成的.o 目标文件,如图 7-10,图7-11: arm-linux-gcc o HelloWorld HelloWorld.c ls 等到再次出现提示符,代表程序已经正确编译。如果此步出现错误信息,请查看错误信息,并且重新编辑原来的 C文件,修改错误。直到正确编译。9) 重新打开第 7 步最小化的开有 minicom 的终端窗口,即到 PXA270-RP 目标板的 mnt目录下,请您输入下列 3 条命令,运行 HelloWorld 编译成功的 HelloWorld 目标程序: cd home/HW /*回到 minicom 中目标板的/mnt/home/HW目录下*/ ls ./ HelloWorld /*此时会看到如下图*/ 四、 驱动程序1. 设备驱动程序的概念设备驱动程序实际是处理和操作硬件控制器的软件,从本质上讲,是内核中具有最高特权级的、驻留内存的、可共享的底层硬件处理例程。驱动程序是内核的一部分,是操作系统内核与硬件设备的直接接口,驱动程序屏蔽了硬件的细节,完成以下功能: 对设备初始化和释放; 对设备进行管理,包括实时参数设置,以及提供对设备的操作接口; 读取应用程序传送给设备文件的数据或者回送应用程序请求的数据; 检测和处理设备出现的错误。Linux操作系统将所有的设备全部看成文件,并通过文件的操作界面进行操作。对用户程序而言,设备驱动程序隐藏了设备的具体细节,对各种不同设备提供了一致的接口,一般来说,是把设备映射为一个特殊的设备文件,用户程序可以像对其他文件一样对此设备文件进行操作。这意味着: 由于每一个设备至少由文件系统的一个文件代表,因而都有一个“文件名”。 应用程序通常可以通过系统调用open()打开设备文件,建立起与目标设备的连接。 打开了代表着目标设备的文件,即建立起与设备的连接后,可以通过read()、write()、ioctl()等常规的文件操作对目标设备进行操作。设备文件的属性由三部分信息组成:第一部分是文件的类型,第二部分是一个主设备号,第三部分是一个次设备号。其中类型和主设备号结合在一起惟一地确定了设备文件驱动程序及其界面,而次设备号则说明目标设备是同类设备中的第几个。由于Linux 中将设备当做文件处理,所以对设备进行操作的调用格式与对文件的操作类似,主要包括open()、read()、write()、ioctl()、close()等。应用程序发出系统调用命令后,会从用户态转到核心态,通过内核将open()这样的系统调用转换成对物理设备的操作。2. 驱动程序结构一个设备驱动程序模块的基本框架在系统内部,I/O设备的存取通过一组固定的入口点来进行,入口点也可以理解为设备的句柄,就是对设备进行操作的基本函数。字符型设备驱动程序提供如下几个入口点: open入口点。打开设备准备I/O操作。对字符设备文件进行打开操作,都会调用设备的open入口点。open子程序必须对将要进行的I/O操作做好必要的准备工作,如清除缓冲区等。如果设备是独占的,即同一时刻只能有一个程序访问此设备,则open子程序必须设置一些标志以表示设备处于忙状态。 close入口点。关闭一个设备。当最后一次使用设备完成后,调用close子程序。独占设备必须标记设备方可再次使用。 read入口点。从设备上读数据。对于有缓冲区的I/O操作,一般是从缓冲区里读数据。对字符设备文件进行读操作将调用read子程序。 write入口点。往设备上写数据。对于有缓冲区的I/O操作,一般是把数据写入缓冲区里。对字符设备文件进行写操作将调用write子程序。 ioctl入口点。执行读、写之外的操作。select入口点。检查设备,看数据是否可读或设备是否可用于写数据。select系统调用在检查与设备文件相关的文件描述符时使用select入口点。3. 设备注册和初始化设备的驱动程序在加载的时候首先需要调用入口函数init_module(),该函数最重要的一个工作就是向内核注册该设备,对于字符设备调用register_chrdev()完成注册。register_chrdev 的定义为:int register_chrdev(unsigned int major, const char *name, struct file_ operations *fops);其中,major是为设备驱动程序向系统申请的主设备号,如果为0,则系统为此驱动程序动态分配一个主设备号。name是设备名,fops是对各个调用的入口点说明。此函数返回0时表示成功;返回-EINVAL,表示申请的主设备号非法,主要原因是主设备号大于系统所允许的最大设备号;返回-EBUSY,表示所申请的主设备号正在被其他设备程序使用。如果动态分配主设备号成功,此函数将返回所分配的主设备号。如果register_chrdev()操作成功,设备名就会出现在/proc/dvices文件中。Linux在/dev目录中为每个设备建立一个文件,用ls l命令列出函数返回值,若小于0,则表示注册失败;返回0或者大于0的值表示注册成功。注册以后,Linux将设备名与主、次设备号联系起来。当有对此设备名的访问时,Linux通过请求访问的设备名得到主、次设备号,然后把此访问分发到对应的设备驱动,设备驱动再根据次设备号调用不同的函数。当设备驱动模块从Linux内核中卸载,对应的主设备号必须被释放。字符设备在cleanup_ module()函数中调用unregister_chrdev()来完成设备的注销。unregister_chrdev()的定义为:int unregister_chrdev(unsigned int major, const char *name);包括设备注册在内,设备驱动的初始化函数主要完成的功能是有以下5项。(1)对驱动程序管理的硬件进行必要的初始化。对硬件寄存器进行设置。比如,设置中断掩码,设置串口的工作方式、并口的数据方向等。(2)初始化设备驱动相关的参数。一般说来,每个设备都要定义一个设备变量,用以保存设备相关的参数。在这一步骤里对设备变量中的项进行初始化。(3)在内核注册设备。调用register_chrdev()函数来注册设备。(4)注册中断。如果设备需要IRQ支持,则要使用request_irq()函数注册中断。(5)其他初始化工作。初始化部分一般还负责给设备驱动程序申请包括内存、时钟、I/O端口等在内的系统资源,这些资源也可以在open子程序或者其他地方申请。这些资源不用时,应该释放,以利于资源的共享。若驱动程序是内核的一部分,初始化函数则要按如下方式声明:int _init chr_driver_init(void);其中_init是必不可少的,在系统启动时会由内核调用chr_driver_init,完成驱动程序的初始化。当驱动程序是以模块的形式编写时,则要按照如下方式声明:int init_module(void)当运行后面介绍的insmod命令插入模块时,会调用init_module函数完成初始化工作。 4. 设备驱动程序的开发过程由于嵌入式设备由于硬件种类非常丰富,在默认的内核发布版中不一定包括所有驱动程序。所以进行嵌入式Linux系统的开发,很大的工作量是为各种设备编写驱动程序。除非系统不使用操作系统,程序直接操纵硬件。嵌入式Linux系统驱动程序开发与普通Linux开发没有区别。可以在硬件生产厂家或者Internet上寻找驱动程序,也可以根据相近的硬件驱动程序来改写,这样可以加快开发速度。实现一个嵌入式Linux设备驱动的大致流程如下。(1)查看原理图,理解设备的工作原理。一般嵌入式处理器的生产商提供参考电路,也可以根据需要自行设计。(2)定义设备号。设备由一个主设备号和一个次设备号来标识。主设备号惟一标识了设备类型,即设备驱动程序类型,它是块设备表或字符设备表中设备表项的索引。次设备号仅由设备驱动程序解释,区分被一个设备驱动控制下的某个独立的设备。(3)实现初始化函数。在驱动程序中实现驱动的注册和卸载。(4)设计所要实现的文件操作,定义file_operations结构。(5)实现所需的文件操作调用,如read、write等。(6)实现中断服务,并用request_irq向内核注册,中断并不是每个设备驱动所必需的。(7)编译该驱动程序到内核中,或者用insmod命令加载模块。(8)测试该设备,编写应用程序,对驱动程序进行测试。 五、 基本接口实验在完成了基本实验后,我们开始着手基本接口实验。在这些实验中,我们学习如何编写设备驱动程序,及如何用测试程序检验驱动程序是否正确,并通过改写测试程序正常地对驱动程序进行相关操作。1. 实验十二简单设备驱动程序本次实验的任务是编写一个字符型设备驱动程序,并学习在应用程序中调用驱动。考虑到我们初次接触驱动程序的编写,对此还十分陌生,因此指导书中提供了本次实验所要用到的程序源代码。虽然这样一个字符型设备驱动程序并没有任何实际作用,但是它让我们轻松掌握了嵌入式驱动的编写过程,因为复杂繁琐的驱动,其骨架都是相同的。因此,看懂本实验的源代码,学习并模仿其编写方法,对于后续实验有着非常重要的意义。2. 实验十三CPU GPIO驱动程序设计在本实验中,我们要编写第一个针对实际硬件的驱动程序。我们知道,凡是操作系统控制外部设备,即使是最简单的硬件电路,也是需要驱动的。本实验涉及的外部硬件只有电阻和发光二极管。我们使用自己编写的驱动程序与应用程序控制 GPIO96的电平,通过 LED 的亮灭来判断,是否 CPU 做出了正确的响应。实验第一步是编写 PXA270 GPIO 驱动程序。驱动的写法参照实验十二,大体相同,主要区别如下:/ -控制IO设备-switch (cmd)case LED_ON : GPCR3 |= 0x1;break;/如果cmd=LED_ON,那么GPCR3置为1case LED_OFF: GPSR3 |= 0x1;break;/如果cmd=LED_OFF,那么GPSR3置为1 default : printk (lcd control : no cmd run -kernel- n); return (-EINVAL);/ -驱动程序初始化-GPDR3 |= 0x00000001; /设置GPIO96输出模式:开灯GPSR3 |= 0x00000001; / 关灯对Makefile中的目标体和依赖文件也要做相应的修改,此处省略。在测试程序中有这样一段代码:while(1)ioctl(fd, LED_OFF);sleep(1); / 休眠1秒ioctl(fd,LED_ON);sleep(1);实验作业要求在目标板上LED闪烁产生亮7秒,灭5秒的效果,很容易实现,只需将上面的代码改为如下代码即可:while(1)ioctl(fd, LED_OFF);sleep(5); / 灭5秒ioctl(fd,LED_ON);sleep(7);/ 亮7秒3. 实验十四中断实验在理论课中,我们学习了许多中断方面的知识,包括中断向量、中断优先级、中断过程等。在PXA270系统里,中断控制器分外部设备和 PXA270X 处理器设备产生的两个层次的中断,前者是初级的中断源,后者是次级中断源,大量的次级中断源通常被映射为一个初级中断源。在此实验中,我们要编写一个中断程序,利用目标板上的按键SW2来产生中断,使得当每次按下此按键时,在超级终端上打印出响应的信息。编写中断程序与前两个实验的主要区别如下:/* -初始化request_irq申请硬件中断,参数包括申请的硬件中断号、设备id、中断处理的一些属性(SA_INTERRUPT是快速处理程序,调用时屏蔽所有中断)等- */ret = request_irq(SIMPLE_INT_IRQ, &SIMPLE_INT_interrupt, SA_INTERRUPT, int_ctl, NULL);/ - 卸载,对应request_irq释放中断 -free_irq(SIMPLE_INT_IRQ,NULL);通过此实验,我了解了硬件中断管脚与中断号的对应关系,以及中断号与中断处理程序的对应关系,对于今后编写更为复杂的中断程序打下基础。4. 实验十五数码管显示实验在此实验中,我们要编写针对 74LV164 的驱动程序,并用其串并转换功能来控制八段LED数码管的显示。在编写驱动程序时,主要有以下需要注意的:/ 按位写入void write_bit(int data) GPCR2 |= (0x1 27);if(data & 0x80) = 0x80) GPSR2 |= (0x1 26);elseGPCR2 |= (0x1 26);GPSR2 |= (0x1 27);/ 按字节写,一次写8位void write_byte(int data) int i;for(i=0;i8;i+) write_bit( data i );使用测试程序看到的测试结果是数码管按0-9显示输出。实验作业要求在上述基础上,分别实现一下两个功能: 要求您再编写一个测试程序,实现 PXA270-EP 目标板上的 LED 数码管循环显示的数字9-0。 要求您再编写一个测试程序,实现 PXA270-EP 目标板上的 LED 数码管循环显示的数字02468。由于在测试程序中定义了数组buf10分别存储了0-9是个数,因此上述功能的实现方法是,分别对测试程序做如下修改:原测试程序:while(1) for(count=0;count=0;count-)/ 倒序显示数字 data0 = bufcount; ret=write(fd,data,1); sleep(1);实现功能:while(1) for(count=0;count9;count=count+2)/ 更改显数顺序 data0 = bufcount; ret=write(fd,data,1); sleep(1);通过更改显数的顺序,很容易实现实验作业里要求的功能。5. 实验十六 LED点阵驱动程序设计通过本实验的操作,我们将 8X8 的点阵 LED 驱动起来并通过编写测试程序,使其能够按照您的意图进行显示。要求您还编写更多的测试程序 要求您再编写一个测试程序,实现按横的方向隔行顺序扫描 LED 点阵数码管。 要求您再编写一个测试程序,实现按竖的方向顺序扫描 LED 点阵数码管。作业一,隔行扫描:for (i=1;i=8;i2+) buf0=c;buf1=r; / rowfor (j=1;j=8;j+) write(fd,buf,2);printf (buf0,buf1: %x,%xn,buf0,buf1);usleep(200000); / sleep 0.2 secondr=r1;buf1=r; / column r = 1; c = c1;作业二,竖向扫描: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(200000); / sleep 0.2 secondr=r1;buf1=r; / column r = 1; c = c1;六、 实验中遇到的问题及解决方法每一次上课重新启动后,当需要将宿主PC机的根目录挂在到PXA270-EP目标板的mnt目录下(即在超级终端中输入命令“mount o soft,timeo=100,rsize=1024 00:/ /mnt”)时,常显示无法挂载。解决方法:在超级终端下的挂载命令应该用”mount o nolock 192.168.0.
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 村内长期用工协议书
- 毕业高校就业协议书
- 接送孩子用车协议书
- 棉花土地承包协议书
- 施工意外免责协议书
- 暗杀团伙分工协议书
- 油漆喷涂安全协议书
- 毕业聚餐安全协议书
- 智能家电转让协议书
- 泳池漏水赔偿协议书
- 矿山委托经营协议书
- 备战2025年高考英语抢分秘籍(新高考专用)猜押语法填空(话题+体裁)(学生版+解析)
- 船舶与海洋工程2025年相关知识考试试卷及答案
- 吉林银行笔试题库及答案
- 《危险化学品企业安全生产标准化规范》专业深度解读与应用培训指导材料之8:5管理要求-5.8作业安全(雷泽佳编制-2025A0)
- 江苏省南京市、盐城市2025届高三年级5月第二次模拟考试英语(南京盐城二模)
- Unit6Integration(A-C)课件译林版(2024)英语七年级下册
- (二模)2024~2025学年度苏锡常镇四市高三教学情况调研(二)物理试卷(含答案)
- 基于深度学习的人脸老化算法研究
- 甘肃开放大学2024年《信息技术与信息管理》形考作业1-4答案
- 2024年大学生电子版三方协议书模板
评论
0/150
提交评论