搜索
您的当前位置:首页正文

嵌入式系统实训报告

2021-07-24 来源:好走旅游网
2010/2011学年第2学

嵌入式操作系统实训报告

课程名称 : 嵌入式操作系统 班 级 : 计控0901 学 号: 0408090118 姓 名: 秦海艳 教学周数 : 2周 地 点 : 嵌入式系统实训室 指导教师 : 朱黎、封磊

1

目录

实验一、 Linux开发环境的搭建 ............................................... 3

一、实验目的 .................................................................................................. 3 二、实验内容 .................................................................................................. 3 三、实验设备及工具(包括软件调试工具) .............................................. 3 四、实验步骤 .................................................................................................. 3 实验二、 Makefile实验 ...................................................... 8

一、实验目的 .................................................................................................. 8 二、实验环境 .................................................................................................. 9 三、实验原理 .................................................................................................. 9 四、实验步骤 ................................................................................................ 10

实验三、多线程程序设计 .................................................... 12

一、实验目的 ................................................................................................ 12 二、实验内容 ................................................................................................ 12 三、实验设备及工具 .................................................................................... 12 四、实验步骤 ................................................................................................ 13

实验四、串行端口程序设计 .................................................. 14

一、实验目的 ................................................................................................ 14 二、实验内容 ................................................................................................ 15 三、实验设备及工具 .................................................................................... 15 四、实验原理 ................................................................................................ 15 五、实验步骤 ................................................................................................ 16 实验五、LED设备实验 ....................................................... 17

一、实验目的 ................................................................................................ 17 二、实验内容 ................................................................................................ 17 三、实验设备及工具 .................................................................................... 17 四、实验原理 ................................................................................................ 17 五、实验步骤 ................................................................................................ 18 实验六、内核驱动设计-模块方式驱动实验 ..................................... 19

一、实验目的 ................................................................................................ 19 二、实验内容 ................................................................................................ 19 三、实验设备及工具 .................................................................................... 19 四、实验原理 ................................................................................................ 20 五、实验步骤 ................................................................................................ 24

实验七、按键实验 .......................................................... 26

一、实验目的 ................................................................................................ 26 二、实验内容 ................................................................................................ 26 三、实验设备及工具 .................................................................................... 26 四、实验原理 ................................................................................................ 26 五、实验步骤 ................................................................................................ 26

实验八、嵌入式WEB服务器实验 ........................................... 28

一、实验目的 ................................................................................................ 28 二、实验内容 ................................................................................................ 28

2

三、实验设备及工具 .................................................................................... 28 四、实验步骤 ................................................................................................ 28 实训感悟 .................................................................. 29

实验一、 Linux开发环境的搭建

一、实验目的

熟悉Linux开发环境,学会基于S3C2410的Linux开发环境的配置和使用。使用Linux的arm-linux-gcc-3.4.6编译,使用基于nfs方式的下载调试,了解嵌入式开发的基本过程。 二、实验内容

本次实验使用Redhat Linux 9.0操作系统环境,安装ARM-Linux的开发库及编译器。创建一个新目录,并在其中编写hello.c和Makefile文件。学习在Linux下的编程和编译过程,以及ARM开发板的使用和开发环境的设置。下载已经编译好的文件到目标开发板上运行。 三、实验设备及工具(包括软件调试工具)

硬件:up-Star认证考试实践板、PC机Pentium 500以上, 硬盘10G以上。 软件:PC机操作系统REDHAT LINUX 9.0+MINICOM+ARM-LINUX开发

环境。 四、实验步骤

1、bootloader的烧写

点击“开始”中的“运行”输入cmd,找到sjf2410-s.exe所在文件夹的路径,输入sjf2410-s.exe /f:u-boot.bin回车。进入烧写界面。 界面会显示CPU的ID:0x0032409d

3

2、超级终端设置

3、内核、根文件系统烧写 1、配置bootloader

2. 下载u-boot的配置脚本文件 3、烧写内核

4、烧写根文件系统 5、应用程序下载 6、更新u-boot 4、Linux内核裁减 1、配置、编译内核

1、建立kernel实验目录:

2、进入该实验目录,将kernel源码解压至该目录下:

4

3、进入解压后的目录linux-2.6.24.4,运行make menuconfig对内核进行配置:

主要配置的项有: 1)配置系统硬件处理器:

-> System Type -> S3C2410 Machines

2)配置LCD驱动: -> Device Drivers -> Graphics support

-> Support for frame buffer devices (FB [=y])

5

3)配置网卡驱动:

-> Device Drivers -> Network device support (NETDEVICES [=y]) -> Ethernet (10 or 100Mbit) (NET_ETHERNET [=y])

4)配置文件系统支持:

-> File systems -> Miscellaneous filesystems

NFS文件系统支持:

-> File systems -> Network File Systems (NETWORK_FILESYSTEMS [=y])

这样,内核的配置基本上就做好了。 4、 编译内核

进入内核源码根目录下,运行make命令编译内核:

6

如果编译成功,会在内核源码根目录的arch/arm/boot目录下生成内核文件zImage。

5

、生成uImage文件

使用由u-boot生成的工具mkimage,生成uImage文件。执行脚本程序make_uImage:

此时会在内核源码根目录下生成uImage内核文件。

2、烧写内核

1)拷贝刚刚生生成的内核文件uImage到本机(宿主机)TFTP服务器下载目录/tftpboot;

2)启动ARM设备,进入U-BOOT控制台,配置网络IP,下载内核。 a、 设置网络IP:

setenv serverip 192.168.1.171:设置宿主机IP地址,即TFTP服务器端机器IP

setenv ipaddr 192.168.1.172:设置ARM端U-BOOT中网络设备IP地址(与

7

服务器IP同一网段任意非冲突IP地址即可)

b、烧写内核,并固化到NANDFLASH中: 下载到SDRAM:

擦除NANDFLASH空间:

写入NANDFLASH:

固化到FLASH中后,ARM设备掉电内核不会丢失! 3、引导内核使用U-BOOT引导内存中的内核:

提示:出现警告错误: Warning: unable to open an initial console. Kernel panic - not syncing: No init found. Try passing init= option to kernel. 该错误原因是由于系统中根文件系统无法正确挂载导致,后续根文件系统实验将解决该问题。

实验二、 Makefile实验

一、实验目的

1、了解Makefile的基本概念和基本结构

8

2、初步掌握编写简单Makefile的方法 3、了解递归Make的编译过程

4、初步掌握利用GNU Make编译应用程序的方法 二、实验环境

硬件:up-Star认证考试实践板,PC机Pentium 500以上, 硬盘40G以上,内存大于128M。

软件:PC机操作系统REDHAT LINUX 9.0 +MINICOM + ARM-LINUX开发环境。 程不断地从共享的循环缓冲区读取 三、实验原理

在Linux或Unix环境下,对于只含有几个源代码文件的小程序(如hello.c)的编译,可以手工键入gcc命令对源代码文件逐个进行编译。 Makefile是按照某种脚本语法编写的文本文件,而GNU make能够对Makefile中指令进行解释并执行编译操作。

Makefile 文件定义了一系列的规则来指定哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作。

GNU make工作时的执行步骤如下:

1、读入所有的Makefile。2、读入被include的其它Makefile。3、初始化文件中的变量。4、推导隐晦规则,并分析所有规则。5、为所有的目标文件创建依赖关系链。6、根据依赖关系,决定哪些目标要重新生成。7、执行生成命令。其中1-5步为第一个阶段,6-7为第二个阶段。第一个阶段中,如果定义的变量被使用了,那么,make会把其展开在使用的位置。但make并不会完全马上展开,make使用的是拖延战术,如果变量出现在依赖关系的规

则中,那么仅当这条依赖被决定要使用了,变量才会在其内部展开。 1.Makefile的基本结构

Makefile的一般结构:

target„„:dependency„„ command„„

结构中各部分的含义: (1)target(目标):一个目标文件,可以是Object文件,也可以是执行文件。还可以是一个标签(Label)。 (2)dependency(依赖):要生成目标文件(target)所依赖哪些文件 (3)command(命令):创建项目时需要运行的shell命令(注:命令(command)

部分的每行的缩进必须要使用Tab而不能使用多个空格)。 2.Makefile的基本内容

Makefile一般包括包含:显式规则、隐晦规则、变量定义、文件指示和注释等五个内容。

(1)显式规则:显式规则说明如何生成一个或多个的目标文件。这是由Makefile的书写者明显指出,要生成的文件,文件的依赖文件,生成的命令。

9

(2)变量定义:在Makefile中可以定义一系列的变量,变量一般都是字符串,当Makefile被执行时,变量的值会被扩展到相应的引用位置上。

(3)隐含规则:由于GNU make具有自动推导功能,所以隐晦规则可以比较粗糙地简略地书写Makefile,然后由GNU make的自动推导功能完成隐晦规则的内容。

(4)文件指示:其包括了三个部分,一个是在一个Makefile中引用另一个Makefile,就像C语言中的include一样;另一个是指根据某些情况指定Makefile中的有效部分,就像C语言中的预编译#if一样;还有就是定义一个多行的命令。

(5)注释:Makefile中只有行注释,和UNIX的Shell脚本一样,其注释是用“#”字符,如果你要在你的Makefile中使用“#”字符,可以用反斜框进行转义,如:“\\#”。 四、实验步骤

1. 使用命令行的方式手动编译程序方法 1.1利用文本编辑器创建hello.c文件

1.2手动编译hello应用程序

在hello.c的目录的终端下输入:

1.3先后执行如下命令

查看并记录所生成的文件和运行的结果。 1.4执行make clean命令:

10

1.5修改hello.c文件,重复第4、5步操作,查看并记录所生成的文件和运行结果,并与手动编译进行比较,写出你的结论。 1.6重新编辑makefile文件(斜黑体表示修改部分)

2. 多个.c文件的编译

2.1创建文件hello1.c、hello2.c、hello.h和makefile

11

2.2先后执行如下命令

2.3

修改

makefile

文件(斜黑体表示修改部分)

实验三、多线程程序设计

一、实验目的

1、了解多线程程序设计的基本原理。 2、学习pthread库函数的使用。 二、实验内容

读懂pthread.c的源代码,熟悉几个重要的PTHREAD库函数的使用。掌握共享锁和信号量的使用方法。

进入/up-Star2410/exp/basic/pthread目录,运行make 产生pthread程序,使用nfs方式连接开发主机进行运行实验。 三、实验设备及工具

硬件:up-Star认证考试实践板,PC机Pentium 500以上, 硬盘40G以上,内存

大于128M。

12

软件:PC机操作系统REDHAT LINUX 9.0 +MINICOM + ARM-LINUX开

发环境。 四、实验步骤

1、阅读源代及编译应用程序 进入exp/basic/pthread目录,使用vi编辑器或其他编辑器阅读理解源代码。运行make产生pthread可执行文件,多线程切换到minicom终端窗口,使用nfs mount开发主机的/up-Star2410 到/host目录。

2、下载和调试

13

进入/host/exp/basic/pthread目录,运行pthread,观察运行结果的正确性。运行程序最后一部分结果如下:

实验四、串行端口程序设计

一、实验目的

1、了解在linux环境下串行程序设计的基本方法。

2、掌握终端的主要属性及设置方法,熟悉终端I /O函数的使用。

14

3、学习使用多线程来完成串口的收发处理。 二、实验内容

读懂程序源代码,学习终端I /O函数的使用方法,学习将多线程编程应用到串口的接收和发送程序设计中。 三、实验设备及工具

硬件:up-Star认证考试实践板、PC机Pentium 500以上, 硬盘10G以上。 软件:PC机操作系统REDHAT LINUX 9.0+MINICOM+ARM-LINUX开发环境。 四、实验原理

异步串行I /O方式是将传输数据的每个字符一位接一位(例如先低位、后高位)地传送。数据的各不同位可以分时使用同一传输通道,因此串行I/O可以减少信号连线,最少用一对线即可进行。接收方对于同一根线上一连串的数字信号,首先要分割成位,再按位组成字符。为了恢复发送的信息,双方必须协调工作。在微型计算机中大量使用异步串行I/O方式,双方使用各自的时钟信号,而且允许时钟频率有一定误差,因此实现较容易。但是由于每个字符都要独立确定起始和结束(即每个字符都要重新同步),字符和字符间还可能有长度不定的空闲时间,因此效率较低。

图1串行通信字符格式

图2给出异步串行通信中一个字符的传送格式。开始前,线路处于空闲状态,送出连续“1”。传送开始时首先发一个“0”作为起始位,然后出现在通信线上的是字符的二进制编码数据。每个字符的数据位长可以约定为5位、6位、7位或8位,一般采用ASCII编码。后面是奇偶校验位,根据约定,用奇偶校验位将所传字符中为“1”的位数凑成奇数个或偶数个。也可以约定不要奇偶校验,这样就取消奇偶校验位。最后是表示停止位的“1”信号,这个停止位可以约定持续1位、1.5位或2位的时间宽度。至此一个字符传送完毕,线路又进入空闲,持续为“1”。经过一段随机的时间后,下一个字符开始传送才又发出起始位。每一个数据位的宽度等于传送波特率的倒数。微机异步串行通信中,常用的波特率为50,95,110,150,300,600,1200,2400,4800,9600等。 MODEM连接电缆,其连接方式如图2

15

图2串口通讯实验流程图

五、实验步骤

1、阅读理解源码

进入exp\\basic\ty目录,使用vi编辑器或其他编辑器阅读理解源代码。 2、编译应用程序

运行make产生term可执行文件

3、下载调试

切换到minicom终端窗口,使用nfs mount开发主机的/up-Star2410到/host目录。进入exp\\basic\ty目录,运行term,观察运行结果的正确性。

注意:如果在执行./term时出现下面的错误,可以通过我们前文提到的方法建立一个连接来解决。

/dev/ttyS0: No such file or directory 解决方法:

[/mnt/yaffs] cd /dev

[/dev] ln –sf /dev/tts/0 ttyS0 (注意首字母是l, 不是数字1) 由于内核已经将串口1 作为终端控制台,所以可以看到term发出的数据,却无法看到开发主机发来的数据,可以使用另外一台主机连接串口2进行收发测试;这时要修改一下执行命令,在term 后要加任意参数(下面以 ./term www 为例)

Ctrl+c或者ESC可使程序强行退出。

16

如果在执行./term www时出现下面的错误,可以通过我们前文提到的方法建立两个连接来解决;

/dev/ttyS0: No such file or directory 解决方法:

[/mnt/yaffs] cd /dev

[/dev] ln –sf /dev/tts/0 ttyS0 (注意首字母是l, 不是数字1)

[/dev] ln –sf /dev/tts/1 ttyS1 (注意首字母(红色的)是l, 不是数字1;而后面的两个蓝色的都是1,2,3的1)

实验五、LED设备实验

一、实验目的

1、学习LED的相关知识。 2、了解SPI接口的相关知识。 二、实验内容

学习LED的相关知识,了解其工作原理, 三、实验设备及工具

硬件:up-Star认证考试实践板、PC机Pentium 500以上, 硬盘10G以上。 软件:PC机操作系统REDHAT LINUX 9.0+MINICOM+ARM-LINUX开发

环境。 四、实验原理

在某些半导体材料的PN结中,注入的少数载流子与多数载流子复合时会 把多余的能量以光的形式释放出来,从而把电能直接转换为光能。PN结加反 向电压,少数载流子难以注入,故不发光。这种利用注入式电致发光原理制作的二极管叫发光二极管,通称LED。

LED的发光颜色和发光效率与制作LED的材料和工艺有关,目前广泛使用 的有红、绿、蓝三种。由于LED工作电压低(仅1.5-3V),能主动发光且有 一定亮度,亮度又能用电压(或电流)调节,本身又耐冲击、抗振动、寿命 长(10万小时),所以在大型的显示设备中,目前尚无其他的显示方式与 LED显示方式匹敌。 把红色和绿色的LED放在一起作为一个像素制作的显示屏叫双基色屏或 伪彩色屏;把红、绿、蓝三种LED管放在一起作为一个像素的显示屏叫三基 色屏或全彩屏。制作室内LED屏的像素尺寸一般是2-10毫米,常常采用把几 种能产生不同基色的LED管芯封装成一体,室外LED屏的像素尺寸多为12-26 毫米,每个像素由若干个各种单色LED组成,常见的成品称像素筒或像素模 块。

17

LED显示屏如果想要显示图象,则需要构成像素的每个LED的发光亮度都 必须能调节,其调节的精细程度就是显示屏的灰度等级。灰度等级越高,显 示的图像就越细腻,色彩也越丰富,相应的显示控制系统也越复杂。 五、实验步骤

1、阅读理解源码

进入/up-Star2410/exp/basic/led目录,使用vi编辑器或其他编辑器阅读理解源代码。

2、编译应用程序

运行make产生可执行文件led

3、下载调试

切换到minicom终端窗口,使用nfs mount开发主机的/up-Star2410到/host目录,然后进入/host/exp/basic/led目录,用insmod mini2410-leds.ko命令插入led驱动,并用 lsmod命令查看是否已经插入。(该mini2410-leds.ko位于up-Star认证考试实践板内) 加载驱动程序

查看新加设备对应的主设备号:

18

手动创建设备节点:

实验六、内核驱动设计-模块方式驱动实验

一、实验目的

1.学习在LINUX下进行驱动设计的原理

2.掌握使用模块方式进行驱动开发调试的过程 二、实验内容

在PC机上编写简单的虚拟硬件驱动程序并进行调试,实验驱动的各个接口函数的实现,分析并理解驱动与应用程序的交互过程。 三、实验设备及工具

硬件:PC机Pentium 500以上, 硬盘40G以上,内存大于128M。

软件:PC机操作系统REDHAT LINUX 9.0 +MINICOM + AMR-LINUX开

发环境。

19

四、实验原理

Linux中的驱动设计是嵌入式Linux开发中十分重要的部分,它要求开发者不仅要熟悉Linux的内核机制、驱动程序与用户级应用程序的接口关系、考虑系统中对设备的并发操作等等,而且还要非常熟悉所开发硬件的工作原理。

Linux的驱动开发调试有两种方法,一种是直接编译到内核,再运行新的内核来测试;二是编译为模块的形式,单独加载运行调试。第一种方法效率较低,但在某些场合是唯一的方法。模块方式调试效率很高,它使用insmod工具将编译的模块直接插入内核,如果出现故障,可以使用rmmod从内核中卸载模块。不需要重新启动内核,这使驱动调试效率大大提高。我们的实验在PC机和UP-NETARM2410-S上都可以运行,编译时使用不同的编译器就可以了。

1.主设备号和次设备号

传统方式中的设备管理中,除了设备类型外,内核还需要一对称作主次设备号的参数,才能唯一标识一个设备。主设备号相同的设备使用相同的驱动程序,次设备号用于区分具体设备的实例。比如PC机中的IDE设备,一般主设备号使用3,WINDOWS下进行的分区,一般将主分区的次设备号为1,扩展分区的次设备号为2、3、4,逻辑分区使用5、6….。

设备操作宏MAJOR()和MINOR()可分别用于获取主次设备号,宏MKDEV()用于将主设备号和次设备号合并为设备号,这些宏定义在

include/linux/kdev_t.h中。对于LINUX中对设备号的分配原则可以参考Documentation/devices.txt。 2.设备驱动程序接口

通常所说的设备驱动程序接口是指结构file_operations{},它定义在include/linux/fs.h中。

file_operations数据结构说明

struct file_operations { struct module *owner; loff_t (*llseek) (struct file *, loff_t, int); ssize_t (*read) (struct file *, char *, size_t, loff_t *); ssize_t (*write) (struct file *, const char *, size_t, loff_t *); int (*readdir) (struct file *, void *, filldir_t);

20

unsigned int (*poll) (struct file *, struct poll_table_struct *); int (*ioctl) (struct inode *, struct file *, unsigned int, unsigned long); int (*mmap) (struct file *, struct vm_area_struct *); int (*open) (struct inode *, struct file *); int (*flush) (struct file *); int (*release) (struct inode *, struct file *); int (*fsync) (struct file *, struct dentry *, int datasync); int (*fasync) (int, struct file *, int); int (*lock) (struct file *, int, struct file_lock *); ssize_t (*readv) (struct file *, const struct iovec *, unsigned long, loff_t *); ssize_t (*writev) (struct file *, const struct iovec *, unsigned long, loff_t *); ssize_t (*sendpage) (struct file *, struct page *, int, size_t, loff_t *, int); unsigned long (*get_unmapped_area)(struct file *, unsigned long, unsigned long, unsigned long, unsigned long); #ifdef MAGIC_ROM_PTR int (*romptr) (struct file *, struct vm_area_struct *); #endif /* MAGIC_ROM_PTR */ }; file_operations结构是整个Linux内核的重要数据结构,它也是file{}、inode{}结构的重要成员,表1中分别说明结构中主要的成员:

表1 file_operations结构 Owner Llseek Read Write Readdir Ioctl Mmap Open Flush Release Fsync Fasync Lock Readv Writev module的拥有者。 重新定位读写位置。 从设备中读取数据。 向字符设备中写入数据。 只用于文件系统,对设备无用。 控制设备,除读写操作外的其他控制命令。 将设备内存映射到进程地址空间,通常只用于块设备。 打开设备并初始化设备。 清除内容,一般只用于网络文件系统中。 关闭设备并释放资源。 实现内存与设备的同步,如将内存数据写入硬盘。 实现内存与设备之间的异步通讯。 文件锁定,用于文件共享时的互斥访问。 在进行读操作前要验证地址是否可读。 在进行写操作前要验证地址是否可写。 在嵌入式系统的开发中,我们一般仅仅实现其中几个接口函数:read、write、ioctl、open、release,就可以完成应用系统需要的功能。

Open方法

21

Open方法提供给驱动程序初始化设备的能力,从而为以后的设备操作做好准备,此外open操作一般还会递增使用计数,用以防止文件关闭前模块被卸载出内核。在大多数驱动程序中Open方法应完成如下工作:

1. 递增使用计数

2. 检查特定设备错误。

3. 如果设备是首次打开,则对其进行初始化。 4. 识别次设备号,如有必要修改f_op指针。 5. 分配并填写filp->private_data中的数据。

Release方法

与open方法相反,release 方法应完成如下功能: 1. 释放由open分配的filp->private_data中的所有内容 2. 在最后一次关闭操作时关闭设备 3. 使用计数减一

Read和Write方法

read 方法完成将数据从内核拷贝到应用程序空间,write方法相反,将数据从应用程序空间拷贝到内核。对于者两个方法,参数filp是文件指针,count是请求传输数据的长度,buffer是用户空间的数据缓冲区,ppos是文件中进行操作的偏移量,类型为64位数。

1. 返回值等于传递给read系统调用的count参数,表明请求的数据传

输成功。

2. 返回值大于0,但小于传递给read系统调用的count参数,表明部分

数据传输成功,根据设备的不同,导致这个问题的原因也不同,一般采取再次读取的方法。

3. 返回值=0,表示到达文件的末尾。

4. 返回值为负数,表示出现错误,并且指明是何种错误。 5. 在阻塞型io中,read调用会出现阻塞。 Write的返回值

22

1. 返回值等于传递给write系统调用的count参数,表明请求的数据传

输成功。

2. 返回值大于0,但小于传递给write系统调用的count参数,表明部

分数据传输成功,根据设备的不同,导致这个问题的原因也不同,一般采取再次读取的方法。

3. 返回值=0,表示没有写入任何数据。标准库在调用write时,出现

这种情况会重复调用write。

4. 返回值为负数,表示出现错误,并且指明是何种错误。错误号的定

义参见

5. 在阻塞型io中,write调用会出现阻塞。 ioctl方法

ioctl方法主要用于对设备进行读写之外的其他控制,比如配置设备、进入或退出某种操作模式,这些操作一般都无法通过read/write文件操作来完成,比如在UP-NETARM2410-S中的SPI设备通道的选择操作,无法通过write操作控制,这就是ioctl操作的功能。

用户空间的ioctl函数的原型为:

int ioctl(inf fd,int cmd,…) 其中的…代表可变数目的参数表,实际中是一个可选参数,一般定义为:

int ioctl(inf fd,int cmd,char *argp) 驱动程序中定义的ioctl 方法原型为: int (*ioctl) (struct inode *inode, struct file *file,unsigned int cmd, unsigned long arg) inode 和 filp两个指针对应应用程序传递的文件描述符fd,cmd不会被修改地传递给驱动程序,可选的参数arg则无论用户应用程序使用的是指针还是其他类型值,都以unsigned long的形式传递给驱动。

ioctl方法的返回值

ioctl通常实现一个基于switch语句的各个命令的处理,对于用户程序传递了不合适的命名参数时,POSIX标准规定应返回-ENOTTY,返回-EINVAL是以前常见的方法。

不能使用与LINUX预定义命令相同的号码,因为这些命令号码会被内核sys_ioctl函数识别,并且不再将命令传递给驱动的ioctl。Linux针对所有

23

文件的预定义命令的幻数为“T”。所以我们不应使用TYPE为”T”的幻数。 devfs_register函数

其原型为: devfs_register(devfs_handle_t dir, const char *name, unsigned int flags,unsigned int major, unsigned int minor, umode_t mode, void *ops, void *info) 其中的参数说明如表5.1.3所示:

表1参数说明

Dir Name Flags Major Minor Mode Ops Info 五、实验步骤

1.实验步骤:提示:以下内容均在Linux PC机上进行 1. 用insmod 命令插入设备驱动

insmod demo.c cat /pro/devices

新创建的设备文件的父目录,一般设为null, 表示父目录为/dev 设备名称,如想包含子目录,可以直接在名字中包含’/’ Devfs标志的位掩码。 主设备号 如果在flags参数中指定为则主次设备号就无次设备DEVFS_FL_AUTO_DEVNUM,用了。 号, 设备的访问模式 设备的文件操作数据结构指针 filp->private_data的默认值。

2、用mknod命令建立demo设备节点

mkdir /dev/demo

mknod /dev/demo c 253 0 3. 运行测试程序

24

./test_demo 4.删除设备节点 rm -f /dev/demo 2.完善代码部分

分析Makefile文件,把为PC linux编写的Makefile文件改写为为ARM开发平台编写的Makefile文件 3、编译驱动模块及测试程序

1.按第二部分完善代码后,用make命令编译驱动和测试程序 [qianzg@localhost demo]$make armv4l-unknown-linux-gcc -c -I.. -Wall -O -D__KERNEL__ -DMODULE -I/arm2410dev/kernel-2410dev/include demo.c -o demo.o demo.c:108: warning: initialization from incompatible pointer type armv4l-unknown-linux-gcc -c -I.. -Wall -O -D__KERNEL__ -DMODULE -I/arm2410dev/kernel-2410dev/include hello.c -o hello.o armv4l-unknown-linux-gcc -I.. -Wall -O -D__KERNEL__ -DMODULE -I/arm2410dev/kernel-2410dev/include -c -o test_demo.o test_demo.c armv4l-unknown-linux-gcc test_demo.o -o test_demo 下面使用测试程序来进行测试,按照上面步骤成功后会出现下面的结果: [root@zxt demo]# ./test_demo write 32 bytes data to /dev/demo 0: 0 1 2 3 1: 4 5 6 7 2: 8 9 10 11 3: 12 13 14 15 4: 16 17 18 19 5: 20 21 22 23 6: 24 25 26 27 7: 28 29 30 31 ***************************************************** Read 32 bytes data from /dev/demo 0: 31 30 29 28 1: 27 26 25 24 2: 23 22 21 11 3: 12 13 14 15 4: 16 17 18 19 5: 20 10 9 8 6: 7 6 5 4 7: 3 2 1 0 ***************************************************** 如果模块没有成功插入的话,会出现下面的情况:

25

在驱动模块成功插入后,会在/dev下面建立一个叫做demo的设备文件,我们也可以使用cat 命令来直接调用read函数,来测试读过程。

[root@zxt demo]# cat /dev/demo device open success! 实验七、按键实验

一、实验目的

1、掌握按键控制原理。 2、学习linux下个函数的使用。 二、实验内容

学习使用如何使用可产生中断的5位导航按键,进行中断按键测试。 三、实验设备及工具

硬件:up-Star认证考试实践板、PC机Pentium 500以上, 硬盘10G以上。 软件:PC机操作系统REDHAT LINUX 9.0+MINICOM+ARM-LINUX开发环

境。 四、实验原理

通过linux下函数的运用编写程序,使5位导航按键进行中断,使学习者了解这一些列过程。 五、实验步骤

1、阅读理解源码

进入/up-Star2410/exp/basic/buttons目录,使用vi编辑器或其他编辑器阅读理解源代码。

2、编译应用程序

运行make产生可执行文件buttons

26

3、下载调试

切换到minicom终端窗口,使用nfs mount开发主机的/up-Star2410到/host目录,然后进入/host/exp/basic/buttons目录,用insmod mini2410-buttons.ko命令插入buttons驱动,并用 lsmod命令查看是否已经插入。(该mini2410- buttons.ko位于up-Star认证考试实践板内)

加载驱动程序

查看加载设备的驱动对应的主设备

然后根据设备号创建设备节点

27

实验八、嵌入式WEB服务器实验

一、实验目的

1、掌握在ARM开发板实现一个简单WEB服务器的过程。 2、学习在ARM开发板上的SOCKET网络编程。 3、学习Linux下的signal()函数的使用。 二、实验内容

学习使用socket进行通讯编程的过程,了解一个实际的网络通讯应用程序整体设计,阅读HTTP协议的相关内容,学习几个重要的网络函数的使用方法。 读懂HTTPD.C源代码。在此基础上增加一些其他功能。在PC计算机上使用浏览器测试嵌入式WEB服务器的功能。 三、实验设备及工具

硬件:up-Star认证考试实践板、PC机Pentium 500以上, 硬盘10G以上。 软件:PC机操作系统REDHAT LINUX 9.0+MINICOM+ARM-LINUX开发

环境。 四、实验步骤

1、阅读理解源码

进入/up-Star2410/exp/basic/httpd目录,使用vi编辑器或其他编辑器阅读理解源代码

2、编译应用程序

运行make产生可执行文件httpd

3、下载调试

使用nfs服务方式将httpd下载到开发板上,并拷贝测试用的网页进行调试,本例中用的是index测试网页。 [/mnt/yaffs]cd /host/exp/basic/httpd/

28

[/host/exp/basic/httpd]./httpd starting httpd... press q to quit. wait for connection. 4、本机测试

在台式机的浏览器中输入http://192.168.0.111(111为up-Star认证考试实践板IP地址,该地址可以根据具体情况设置),观察在客户机的浏览器中的连接请求结果(如图5)和在开发板上的服务器的打印信息。(如下图5所示)

注意:开发板的IP地址可以同过ifconfig命令来查看

实训感悟

通过两周的实训,我收益颇丰。我已经可以熟练linux环境的操作过程,也提高自己的动手能力,从bootloader的烧写到超级终端设置、内核、根文件系统烧写到最终Linux内核裁减都能很快完成。它们所包含的原理与说明都有了进一步的了解。虽然不是每次都能完整无误的操作,但我能够找出自己的操作失误,例如参数没有设置好、文件添加的路径不正确等。勤动手永远比动口所获得的多得多。有些东西虽然开始不会做但自己多次动手就是一个最好的探索过程。有些实验一开始并不知道最后的显示结果,但经过自己多次操作而探索的可以得到正确的结果其所带来的成就感是别人所不能体会的。虽然只是一个小实验,干足以激发起一个人的兴趣与继续坚持下去的探知欲。科学知识所蕴含的秘密无穷止境,等我们去开发。在这里,我学到许多知识。揭开了嵌入式的神秘面纱。最重要的是,我一直相信这么一个事实:能力比知识更重要,会学比死学更可靠。所以在这么一个集体的环境里,有更优秀的良师益友可以给你指点。三人行必有我师焉。所以择善而从之是很有必要的。还有一点是必须注意的。那就是规划好自己的实验计划,按照老师的要求每天按时并且有条理的完成任务。这次实训时间虽短,到我还是受益匪浅。感谢老师和同学在实训过程中对我的帮助。

29

30

因篇幅问题不能全部显示,请点此查看更多更全内容

Top