ImageVerifierCode 换一换
格式:DOC , 页数:8 ,大小:103.50KB ,
资源ID:2634913      下载积分:20 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.docduoduo.com/d-2634913.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录   微博登录 

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(嵌入式操作系统课程设计new.doc)为本站会员(dzzj200808)主动上传,道客多多仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知道客多多(发送邮件至docduoduo@163.com或直接QQ联系客服),我们立即给予删除!

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

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营业执照举报