收藏 分享(赏)

嵌入式操作系统课程设计new.doc

上传人:dzzj200808 文档编号:2634913 上传时间:2018-09-24 格式:DOC 页数:8 大小:103.50KB
下载 相关 举报
嵌入式操作系统课程设计new.doc_第1页
第1页 / 共8页
嵌入式操作系统课程设计new.doc_第2页
第2页 / 共8页
嵌入式操作系统课程设计new.doc_第3页
第3页 / 共8页
嵌入式操作系统课程设计new.doc_第4页
第4页 / 共8页
嵌入式操作系统课程设计new.doc_第5页
第5页 / 共8页
点击查看更多>>
资源描述

1、嵌入式操作系统课程设计报告一、一、 设计题目设计题目linux设备驱动程序设计设备驱动程序设计二、二、 设计目的设计目的认识认识 linux设备的种类和设备工作方式,理解设备驱动程序的工作原理,设备的种类和设备工作方式,理解设备驱动程序的工作原理,掌握设备驱动程序的编写规范,能编写并安装简单的设备驱动程序。掌握设备驱动程序的编写规范,能编写并安装简单的设备驱动程序。三、三、 设计内容与要求设计内容与要求在在 linux系统中,编写一个简单的字符设备型驱动程序模块,设备具有系统中,编写一个简单的字符设备型驱动程序模块,设备具有独占特性,可执行读和写操作,相关系统调用为独占特性,可执行读和写操作,

2、相关系统调用为open, close, read, write。 Open和和 close分别相当于请求和释放设备,分别相当于请求和释放设备,read和和 write将内容保存在设备模块内的缓冲区中。设备模块可动态注将内容保存在设备模块内的缓冲区中。设备模块可动态注册和卸载,并建立与之对应的特殊文件册和卸载,并建立与之对应的特殊文件 /dev/my.dev。四、四、 设计思想说明(包括设计思路、设计原理、数据结构、程序流程图、关设计思想说明(包括设计思路、设计原理、数据结构、程序流程图、关键代码说明)键代码说明)本程序是一个本程序是一个 Linux下的简单字符设备驱动。首先定义了一个用来存放下

3、的简单字符设备驱动。首先定义了一个用来存放字符的结构体字符的结构体 mycdev。以后的各种操作都是针对。以后的各种操作都是针对 mycdev这个结构体进行。这个结构体进行。其定义在其定义在 mycdev.h头文件中。定义如下:头文件中。定义如下:#ifndef _mycdev_h#define _mycdev_h#endif#include#include#define DATASIZE 1024struct mycdevvoid *data ; /*数据指针*/unsigned long size ; /*数据大小*/unsigned long cata ; /*容量*/struct cd

4、ev cdev ; /*字符结构体*/semaphore sem ; /*锁*/;/*结构体分配函数*/void * malloc_mydev()void *mdev ;if(!mdev = kmalloc(sizeof(struct mydev) , GFP_KERNEL)printk(KERN_WARNING “kmalloc struct error“);return - EFAULT;return mdev ;/*初始化结构体,包括指针,大小,容量 , 锁*/int init_mycdev(struct mycdev *mdev )mdev-data = null ;size = 0

5、;cata = DATASIZE ;sema_init(return 0 ;/*释放数据*/void release_data(struct mycdev *mdev)down_interruptible(size = 0 ;kfree(mdev-data);up(/*分配数据空间*/int malloc_data(struct mycdev *mdev)if(!mdev-data = kmalloc(mdev-cata , GFP_KERNEL)printk(KERN_WARNING “kmalloc data error“);return - EFAULT;size = DATASIZE

6、;return 0 ;/*释放结构体*/void release_mycdev(struct mycdev *mdev)kfree(mdev);然后就可以编写主程序 mydev.c 了。1、首先在 init_func 是设备入口函数。里面进行了分配设备号,分配字符设备,初始化,绑定数据结构等操作。if(!dev_major)my_dev = register_chrdev_region(my_dev , DEV_COUNT , “my_dev“) ;elsealloc_chrdev_region(这是对设备号分配的选择,如果 dev_major 即设备号未 0,就动态定义,否则静态分配。ini

7、t_mycdev(my_cdevi);cdev_init(my_cdevi-cdev.owner=THIS_MODULS ;cdev_add(初始化 mycdev 结构体,初始化其中的字符设备结构体,然后绑定到设备号。2、再就是主要的设备函数 file_operations 的定义。struct file_operations my_fop =.owner = THIS_MODULE , .llseek = llseek_func , .read = read_func , .write = write_func , .open = open_func , .release = release

8、_func , ;3、最后还有推出函数 exit_func。cdev_del(release_mycdev(my_cdevi) ; unregister(my_dev , DEV_COUNT) ;五、五、 程序清单:注意加注释(包含关键字、方法、变量等),在每个模块前程序清单:注意加注释(包含关键字、方法、变量等),在每个模块前加注释加注释代码:mycdev.h 如上mycdev.c:#include#include#include#include#include#define DEV_COUNT 1#define DEV_MINOR 0/*dev switch.when it is 1 ,i

9、t will be use allow ,else use register*/static int dev_major = 0 ;module_param(dev_major , bool , 0644);struct dev_t *my_dev ;struct mycdev *my_cdev ;int open_func(struct inode *inode , struct file *filp) struct mycdev *mc ;int num = MINOR(inode-i_cdev) ;mc = my_cdevnum ;if(malloc_data(mc)printk(KER

10、NEL_WARNING“open error“) ;return -1 ;memset(mc-data , 0 , sizeof(mc-data) ;filp-private_data = mc ;return 0 ; ;int release_func(struct inode *inode , struct file *filp) struct mycdev *mc = filp-private_data ;release_data(mc) ;return 0 ;ssize_t read_func(struct file *filp , char _usr *buff , size_t c

11、ount , loff_t *offp) struct mycdev *mc = filp-private_data ;if(down_interruptible(if(mc-size sem) ;return -1 ;if(mc-size size - *offp ;if(copy_to_user(buff , mc-data+*offp , count )up(return -1 ;*offp += count ;up(return count ;ssize_t write_func(struct file *filp , char _usr *buff , size_t count ,

12、loff_t *offp) struct mycdev *mc = filp-private_data ;if(down_interruptible(if(mc-cata sem) ;return -1 ;if(mc-cata cata - *offp ;if(copy_from_user(mc-data+*offp ,buff ,count )up(return -1 ;*offp += count ;mc-size += count + *offp ; up(return count ;lofft llseek_func(struct file *flip , loff_t offset

13、, int count) switch(whence)loff_t newpos ;case 0 : /*SEEK_SET*/newpos = fooset ;break ;case 1 : /*SEEK_CUR*/newpos = filp-f_pos + offset ;break ;case 2 : /*SEEK_END*/newpos = DATASIZE - 1 + offset ;break ;default:return -EINVAL ;while(newposDATASIZE)newpos -= DATASIZE ;while(newposf_pos = newpos ;re

14、turn newpos ;struct file_operations my_fop =.owner = THIS_MODULE , .llseek = llseek_func , .read = read_func , .write = write_func , .open = open_func , .release = release_func , ;/*init func , init dev,cdev,my_cdev */static int _init init_func(void)int i ;printk(KERNEL_WARNING“dev init“) ;if(!dev_m

15、ajor)my_dev = if(!register_chrdev_region(my_dev , DEV_COUNT , “my_dev“)printk(KERNEL_WARNING“dev register error“) ;return -1 ;elseif(!alloc_chrdev_region(return -1 ;dev_major = MAJOR(my_dev) ;for(i=0 ; icdev ,my_cdevi-cdev.owner=THIS_MODULS ;if(cdev_add( /*exit func release cdev , dev*/stdatic void

16、_exit exit_func(void)int i ;cdev_del(for(i=0 ; i#includeint main(void)int fd ;char rb100 ;char * buf = “hello world“ ;if(fd = open(“/dev/mydev“ , O_RDWR) 0)printf(“open error“);if(write(fd , buf , 20) 0)printf(“write error“);if(lseek(fd , 0 , SEEK_SET) = -1)printf(“lseek error“);if(read(fd , rb , 10

17、0) 0)printf(“read error“);printf(“text is %s“ , rb) ;return 0 ;七、七、 设计总结(实验效果分析、心得体会,遗留问题)设计总结(实验效果分析、心得体会,遗留问题)实验最后结果成功了。因为是入门的程序,所以不会有太多的问题,就实验最后结果成功了。因为是入门的程序,所以不会有太多的问题,就是对于是对于 C语言的使用没有语言的使用没有 C+的透彻,经常忽略了对于结构体的初始化,的透彻,经常忽略了对于结构体的初始化,还有指针的分配及回收问题。通过这次实验,基本了解了还有指针的分配及回收问题。通过这次实验,基本了解了 Linux下的驱下的驱动的基本流程,面向模块的系统加载以及卸载。动的基本流程,面向模块的系统加载以及卸载。

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

当前位置:首页 > 高等教育 > 大学课件

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报