实验四外设驱动程序设计报告

北京电子科技学院(BESTI)

实     验    报     告

课程:深入理解计算机系统           班级: 1352 

姓名:莫凡 潘俊洋

学号:20135225 20135230

成绩:             指导教师:娄嘉鹏    实验日期:2015/11/24

实验密级:         预习程度:          实验时间:3:30~6:00

仪器组次:          必修/选修:必修    实验序号:4

实验名称:          外设驱动程序设计                                                                                                   

实验目的:   

1.掌握实时系统应用和驱动程序的编写
2.选择某个接口电路

                                                    

                                                           

 

实验仪器:

名称

型号

数量

实验箱

UP-NETARM2410嵌入式

1

PC

WinXP

1

 

实验内容、步骤与体会:

 

 

实验内容:

1.导入并编译驱动模块及测试代码

 

2.测试驱动程序

 

代码分析

将驱动映射为标准接口
  • static struct file_operations demo_fops = {…}完成了将驱动函数映射为
    标准接口。
驱动向内核注册
  • devfs_registe()和 register_chrdev()函数完成将驱动向内核注册。
Open方法
  • Open 方法提供给驱动程序初始化设备的能力,从而为以后的设备操作做好准备,此外open操作一般还会递增使用计数,用以防止文件关闭前模块被卸载出内核。

    - 递增使用计数
    - 检查特定设备错误。
    - 如果设备是首次打开,则对其进行初始化。
    - 识别次设备号,如有必要修改 f_op 指针。
    - 分配并填写 filp->private_data 中的数据。
Release 方法
  • 与 open 方法相反,release 方法应完成如下功能:

    - 释放由 open 分配的 filp->private_data 中的所有内容
    - 在最后一次关闭操作时关闭设备
    - 使用计数减一
Read 和 和 Write 方法
ssize_t demo_write(struct file *filp,const char * buffer, size_t count,loff_t *ppos)
ssize_t demo_read(struct file *filp, char *buffer, size_t count, loff_t *ppos)
  • read 方法完成将数据从内核拷贝到应用程序空间,write 方法相反,将数据从应用程
    序空间拷贝到内核。对于者两个方法,参数 filp 是文件指针,count 是请求传输数据的长
    度,buffer 是用户空间的数据缓冲区,ppos 是文件中进行操作的偏移量,类型为 64 位数。
  • 由于用户空间和内核空间的内存映射方式完全不同,所以不能使用象 memcpy 之类的函数,
    必须使用如下函数:

    unsigned long copy_to_user (void *to,const void *from,unsigned long count);
    unsigned long copy_from_user(void *to,const void *from,unsigned long count);
ioctl方法
  • ioctl 方法主要用于对设备进行读写之外的其他控制,比如配置设备、进入或退出某种
    操作模式,这些操作一般都无法通过 read/write 文件操作来完成。
编写中断处理函数的注意事项:
  • 中断处理程序与普通C代码没有太大不同,不同的是中断处理程序在中断期间运行,它有如下限制:

    不能向用户空间发送或接受数据
    不能执行有睡眠操作的函数
    不能调用调度函数
使用/proc文件系统
    • /proc 文件系统是由程序创建的文件系统,内核利用它向外输出信息。/proc 目录下的
      每一个文件都被绑定到一个内核函数,这个函数在此文件被读取时,动态地生成文件的内
      容。
    • 大多数情况下 proc 目录下的文件是只读的。使用/proc 的模块必须包 含
      <linux/proc_fs.h>头文件

遇到的问题及解决:

1.编译时失败

解决:在/usr/src下没有建立一个Linux连接,可以使用

[root@zxt 01_demo]# cd /usr/src/

[root@zxt src]# ln -sf linux-2.4.20-8 linux

[root@zxt src]# ls

debug linux linux-2.4 linux-2.4.20-8 redhat

ln指令的用法是连接,使用格式是ln [options] source dist,这里我们用到的sf参数的含义是:

-f:链接时先将与dist同档名的档案删除

-s:进行软链接。(软链接,又称符号链接,这个文件包含了另一个文件的路径名,特点是可以链接不同文件系统的文件,甚至可以链接不存在的文件。)

你可能感兴趣的:(实验四外设驱动程序设计报告)