嵌入式报告-2011210877-唐思齐

上传人:平*** 文档编号:10603665 上传时间:2017-10-09 格式:DOC 页数:15 大小:414.28KB
返回 下载 相关 举报
嵌入式报告-2011210877-唐思齐_第1页
第1页 / 共15页
嵌入式报告-2011210877-唐思齐_第2页
第2页 / 共15页
嵌入式报告-2011210877-唐思齐_第3页
第3页 / 共15页
嵌入式报告-2011210877-唐思齐_第4页
第4页 / 共15页
嵌入式报告-2011210877-唐思齐_第5页
第5页 / 共15页
点击查看更多>>
资源描述

《嵌入式报告-2011210877-唐思齐》由会员分享,可在线阅读,更多相关《嵌入式报告-2011210877-唐思齐(15页珍藏版)》请在金锄头文库上搜索。

1、0嵌入式系统开发实验报告班 级: 姓 名: 班内序号: 学 号: 日 期: 1一、 实验目的通过实验熟悉 Linux 环境,并掌握一些基本接口驱动的写法和用 C 语言编写简单的实验程序。学习 LINUX 开发环境的搭建,通讯配置等。并熟练掌握 LINUX驱动程序的编写及开发流程。对嵌入式系统有进一步的了解。二、 实验设备1.一套 PXA270EP 嵌入式实验箱2.安装 Redhat9 的宿主 PC 机,并且配置好 ARMLinux 的开发环境三、 基础实验(实验一实验七)实验一七为基础实验, 目的是为后续实验搭建好软、硬件环境,配置好相关的协议、服务,并通过编写最简单的 HelloWorld

2、程序进行测试。由于后面的实验都要依靠前面实验的配置,故本段只着重叙述实验七的具体实现。1. 实验五实验五为宿主 PC 机配置了 TFTP 服务。TFTP(Trivial File Transfer Protocol)是简单文件传输协议,由于特定开发环境的制约,这一服务是必须的。在配置完成后,每次重启宿主 PC 机时,都须先输入命令: service xinetd restart,以启动 TFTP 服务。2. 实验六实验六为宿主 PC 机配置了 NFS 服务。NFS(Network File System)指网络文件系统,它实现了文件在不同的系统间使用。当我们想用远端档案时,只需调用“mount

3、”就可以远端系统挂接在自己的档案系统之下。每次重启宿主 PC 机时,都须先输入命令:service nfs restart,以启动 nfs 服务。3. 实验七实验七通过用 c 语言编写的简单程序 HelloWorld,测试前面几个实验是否成功配置好环境,从超级终端可以看到 HelloWorld 程序的运行结果。实验步骤如下:21) 硬件连接: 连接宿主 PC 机和一台 PXA270-RP 目标板。 2) 打开宿主 PC 机电源,进入 Linux 操作系统。 3) 启动 RedHat 9.0 的图形界面,如下图,若您是以 root 身份登陆在文本模式下,则输入命令 startx 启动图形界面。进

4、入 RedHat 9.0 图形界面后,打开一个终端窗(Terminal) 。4) 输入 minicom 然后回车, minicim 设置为 115200 8NI 无流控。5) 打开 PXA270_RP 目标板电源,按目标板上的 BOOT 键,在 minicom 中应该会看到如下图:6) 在 minicom 终端窗口中,如图,输入下列四条命令rootifconfig eth 192.168.0.50 upmount -o nolock 192.168.0.100:/ /mntcd /mnt此时,先将该窗口最小化,在后面的第 10 操作步骤中还将会回到该窗口中进行操作。37) 宿主机上打开一个终端

5、窗口(Terminal) ,点击【红帽/System Tools/Terminal】启动终端窗口,输入下列 4 条命令: cd /home mkdir HW cd HW vi HelloWorld.c /*请您输入程序 7.1 程序清单*/ 此时会显示一个空白的屏幕,这条命令的含义是,使用 Vi 编辑器,对一个名叫 HelloWorld.c 的文件进行编辑,我们看到的空白窗口是对文件进行编辑的窗口,如下图。就像在 Windows 系统下面使用写字板等一样道理。 在 vi 里面先单击键盘 A 键,然后左下角会变成INSER。输入程序的时候和其他编辑器是一样的,如下图。4当输入程序完毕后,单击键盘

6、 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 目标

7、板的 mnt 目录下,请您输入下列 3 条命令,运行 HelloWorld 编译成功的 HelloWorld 目标程序: cd home/HW /*回到 minicom 中目标板的/mnt/home/HW目录下*/ 5 ls ./ HelloWorld /*此时会看到如下图*/ 四、 驱动程序1.设备驱动程序的概念设备驱动程序实际是处理和操作硬件控制器的软件,从本质上讲,是内核中具有最高特权级的、驻留内存的、可共享的底层硬件处理例程。驱动程序是内核的一部分,是操作系统内核与硬件设备的直接接口,驱动程序屏蔽了硬件的细节,完成以下功能: 对设备初始化和释放; 对设备进行管理,包括实时参数设置,以及

8、提供对设备的操作接口; 读取应用程序传送给设备文件的数据或者回送应用程序请求的数据; 检测和处理设备出现的错误。Linux 操作系统将所有的设备全部看成文件,并通过文件的操作界面进行操作。对用户程序而言,设备驱动程序隐藏了设备的具体细节,对各种不同设备提供了一致的接口,一般来说,是把设备映射为一个特殊的设备文件,用户程序可以像对其他文件一样对此设备文件进行操作。这意味着: 由于每一个设备至少由文件系统的一个文件代表,因而都有一个“文件名”。 应用程序通常可以通过系统调用 open()打开设备文件,建立起与目标设备的连接。 打开了代表着目标设备的文件,即建立起与设备的连接后,可以通过read()

9、、 write()、ioctl()等常规的文件操作对目标设备进行操作。设备文件的属性由三部分信息组成:第一部分是文件的类型,第二部分是一个主设备号,第三部分是一个次设备号。其中类型和主设备号结合在一起惟一地6确定了设备文件驱动程序及其界面,而次设备号则说明目标设备是同类设备中的第几个。由于 Linux 中将设备当做文件处理,所以对设备进行操作的调用格式与对文件的操作类似,主要包括 open()、read()、write()、ioctl()、close()等。应用程序发出系统调用命令后,会从用户态转到核心态,通过内核将 open()这样的系统调用转换成对物理设备的操作。2. 驱动程序结构一个设备

10、驱动程序模块的基本框架在系统内部,I/O 设备的存取通过一组固定的入口点来进行,入口点也可以理解为设备的句柄,就是对设备进行操作的基本函数。字符型设备驱动程序提供如下几个入口点: open 入口点。打开设备准备 I/O 操作。对字符设备文件进行打开操作,都会调用设备的 open 入口点。 open 子程序必须对将要进行的 I/O 操作做好必要的准备工作,如清除缓冲区等。如果设备是独占的,即同一时刻只能有一个程序访问此设备,则 open 子程序必须设置一些标志以表示设备处于忙状态。 close 入口点。关闭一个设备。当最后一次使用设备完成后,调用 close子程序。独占设备必须标记设备方可再次使

11、用。 read 入口点。从设备上读数据。对于有缓冲区的 I/O 操作,一般是从缓冲区里读数据。对字符设备文件进行读操作将调用 read 子程序。 write 入口点。往设备上写数据。对于有缓冲区的 I/O 操作,一般是把数据写入缓冲区里。对字符设备文件进行写操作将调用 write 子程序。 ioctl 入口点。执行读、写之外的操作。select 入口点。检查设备,看数据是否可读或设备是否可用于写数据。select系统调用在检查与设备文件相关的文件描述符时使用 select 入口点。73. 设备注册和初始化设备的驱动程序在加载的时候首先需要调用入口函数 init_module(),该函数最重要的

12、一个工作就是向内核注册该设备,对于字符设备调用 register_chrdev()完成注册。register_chrdev 的定义为:int register_chrdev(unsigned int major, const char *name, struct file_ operations *fops);其中,major 是为设备驱动程序向系统申请的主设备号,如果为 0,则系统为此驱动程序动态分配一个主设备号。name 是设备名,fops 是对各个调用的入口点说明。此函数返回 0 时表示成功;返回-EINVAL,表示申请的主设备号非法,主要原因是主设备号大于系统所允许的最大设备号;返回-

13、EBUSY,表示所申请的主设备号正在被其他设备程序使用。如果动态分配主设备号成功,此函数将返回所分配的主设备号。如果 register_chrdev()操作成功,设备名就会出现在/proc/dvices文件中。Linux 在/dev 目录中为每个设备建立一个文件,用 ls l 命令列出函数返回值,若小于 0,则表示注册失败;返回 0 或者大于 0 的值表示注册成功。注册以后,Linux 将设备名与主、次设备号联系起来。当有对此设备名的访问时,Linux 通过请求访问的设备名得到主、次设备号,然后把此访问分发到对应的设备驱动,设备驱动再根据次设备号调用不同的函数。当设备驱动模块从 Linux 内

14、核中卸载,对应的主设备号必须被释放。字符设备在 cleanup_ module()函数中调用 unregister_chrdev()来完成设备的注销。unregister_chrdev()的定义为:int unregister_chrdev(unsigned int major, const char *name);包括设备注册在内,设备驱动的初始化函数主要完成的功能是有以下 5 项。(1)对驱动程序管理的硬件进行必要的初始化。对硬件寄存器进行设置。比如,设置中断掩码,设置串口的工作方式、并口的数据方向等。(2)初始化设备驱动相关的参数。一般说来,每个设备都要定义一个设备变量,用以保存设备相关

15、的参数。在这一步骤里对设备变量中的项进行初始化。(3)在内核注册设备。调用 register_chrdev()函数来注册设备。(4)注册中断。如果设备需要 IRQ 支持,则要使用 request_irq()函数注册中断。(5)其他初始化工作。初始化部分一般还负责给设备驱动程序申请包括内存、时钟、I/O 端口等在内的系统资源,这些资源也可以在 open 子程序或者其他地方申请。这些资源不8用时,应该释放,以利于资源的共享。若驱动程序是内核的一部分,初始化函数则要按如下方式声明:int _init chr_driver_init(void);其中_init 是必不可少的,在系统启动时会由内核调用

16、chr_driver_init,完成驱动程序的初始化。当驱动程序是以模块的形式编写时,则要按照如下方式声明:int init_module(void)当运行后面介绍的 insmod 命令插入模块时,会调用 init_module 函数完成初始化工作。 4. 设备驱动程序的开发过程由于嵌入式设备由于硬件种类非常丰富,在默认的内核发布版中不一定包括所有驱动程序。所以进行嵌入式 Linux 系统的开发,很大的工作量是为各种设备编写驱动程序。除非系统不使用操作系统,程序直接操纵硬件。嵌入式 Linux 系统驱动程序开发与普通 Linux 开发没有区别。可以在硬件生产厂家或者 Internet上寻找驱动程序,也可以根据相近的硬件驱动程序来改写,这样可以加快开发速

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 其它办公文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号