欢迎来到三一办公! | 帮助中心 三一办公31ppt.com(应用文档模板下载平台)
三一办公
全部分类
  • 办公文档>
  • PPT模板>
  • 建筑/施工/环境>
  • 毕业设计>
  • 工程图纸>
  • 教育教学>
  • 素材源码>
  • 生活休闲>
  • 临时分类>
  • ImageVerifierCode 换一换
    首页 三一办公 > 资源分类 > PPT文档下载  

    【教学课件】第10课设备驱动开发.ppt

    • 资源ID:5657696       资源大小:363.97KB        全文页数:40页
    • 资源格式: PPT        下载积分:15金币
    快捷下载 游客一键下载
    会员登录下载
    三方登录下载: 微信开放平台登录 QQ登录  
    下载资源需要15金币
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    【教学课件】第10课设备驱动开发.ppt

    1,嵌入式系统An Introduction to Embedded System浙江大学计算机学院2012年4月,第10课 设备驱动开发,提纲,1、Linux设备驱动简介2、设备驱动结构3、内核设备模型4、同步机制5、工作队列6、异步I/O,1、Linux设备驱动简介,1.1 驱动的功能1.2 设备分类1.3 设备文件和设备号1.4 代码分布,1.1 驱动的功能,设备驱动程序的主要功能对设备的初始化和释放。把数据从内核传送到硬件和从硬件读取数据到内核。检测和处理设备出现的错误。,1.2 设备分类,Linux支持三类主要硬件设备字符设备(character device):每次读写一个字符;无需缓冲直接读写的设备。块设备(block device):每次读写一个块;存取是通过buffer来进行并且可以随机访问,即不管块位于设备中的地址都可以对其进行读写。网络设备(network device):通过网络socket接口与TCP/IP协议访问,1.3 设备文件和设备号,设备文件:Linux抽象了对硬件的处理,所有的硬件设备都可以通过文件系统API来操作,包括打开、关闭、读写和I/O控制。每个设备文件有两个设备号:一个是主(major)设备号,标识该设备的种类,也标识了该设备所使用的驱动程序;另一个是次(minor)设备号,标识使用同一设备驱动程序的不同硬件设备。,1.4 Linux设备驱动代码的分布,在drivers目录下:blockcharcdrompciscsinetsound,2.2 驱动程序的注册与注销,注册fs/devices.c的register_chrdev()函数fs/block_dev.c的register_blkdev()函数注销unregister_chrdev()函数unregister_blkdev()函数,2.3 设备的操作,设备的打开与释放设备的读写操作设备的控制操作,struct file_operations struct module*owner;loff_t(*llseek)(struct file*,loff_t,int);ssize_t(*read)(struct file*,char _user*,size_t,loff_t*);ssize_t(*write)(struct file*,const char _user*,size_t,loff_t*);ssize_t(*aio_read)(struct kiocb*,const struct iovec*,unsigned long,loff_t);ssize_t(*aio_write)(struct kiocb*,const struct iovec*,unsigned long,loff_t);int(*readdir)(struct file*,void*,filldir_t);unsigned int(*poll)(struct file*,struct poll_table_struct*);int(*ioctl)(struct inode*,struct file*,unsigned int,unsigned long);long(*unlocked_ioctl)(struct file*,unsigned int,unsigned long);long(*compat_ioctl)(struct file*,unsigned int,unsigned long);int(*mmap)(struct file*,struct vm_area_struct*);int(*open)(struct inode*,struct file*);int(*flush)(struct file*,fl_owner_t id);int(*release)(struct inode*,struct file*);int(*fsync)(struct file*,struct dentry*,int datasync);int(*aio_fsync)(struct kiocb*,int datasync);int(*fasync)(int,struct file*,int);int(*lock)(struct file*,int,struct file_lock*);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);int(*check_flags)(int);int(*flock)(struct file*,int,struct file_lock*);ssize_t(*splice_write)(struct pipe_inode_info*,struct file*,loff_t*,size_t,unsigned int);ssize_t(*splice_read)(struct file*,loff_t*,struct pipe_inode_info*,size_t,unsigned int);int(*setlease)(struct file*,long,struct file_lock*);,3、内核设备模型,3.1 设备模型概述3.2 sysfs3.3 驱动模型3.4 kobject3.5 platform总线,3.1 设备模型概述,设备模型提供独立的机制表示设备,并表示其在系统中的拓扑结构。将设备按类型分类将设备和对应驱动联系起来最小化代码重复列举系统中所有设备,观察其状态,查看其连接总线用树的形式将全部设备结构完整、有效地展现,包括所有总线和内部连接从树的叶子向根的方向依次遍历,确保以正确顺序关闭各个设备的电源。,3.2 sysfs(1),sysfs是代表设备的虚拟文件系统block:每个子目录分别对应一个块设备,每个目录又都包含该块设备的所有分区bus:内核设备按总线类型分层放置的目录结构,devices中的所有设备都是连接于某种总线之下,可以找到每一个具体设备的符号链接class:包含以高层功能逻辑组织起来的系统设备视图dev:维护一个按字符设备和块设备的主次号码(major.minor)链接到真实的设备(device)下的符号链接,sysfs(2),devices:系统设备拓扑结构视图,直接映射出内核中设备结构体的组织层次firmware:包含一些如ACPI,EDD,EFI等底层子系统的特殊树fs:存放的已挂载点,但目前只有fuse,gfs2等少数文件系统支持sysfs接口,传统的虚拟文件系统(VFS)层次控制参数仍然在sysctl(/proc/sys/fs)接口中kernel:新式的slab分配器等几项较新的设计在使用它,其它内核可调整参数仍然位于sysctl(/proc/sys/kernel)接口中module:系统中所有模块的信息,不管这些模块是以内联(inlined)方式编译到内核映像文件(vmlinuz)还是编译到外部模块(ko文件),3.3 驱动模型,驱动模型的基本元素设备类结构classes总线结构bus设备结构devices驱动结构drivers,Linux统一设备模型的基本结构,3.5 Platform机制,从 Linux 2.6 起引入了一套新的驱动管理和注册机制:Platform_device 和 Platform_driver。通过 Platform 机制开发发底层驱动的大致流程为:定义 platform_device-注册 platform_device-定义 platform_driver-注册 platform_driver。Platform_bus是一个虚拟总线,使设备的管理更加简单化。各个Platform device 和 Platform driver挂载在虚拟总线platform_bus上接口定义在中。,4、同步机制,4.1 同步锁4.2 信号量4.3 读写信号量4.4 原子操作4.5 完成事件(completion),4.1 同步锁,自旋锁(spinlock)读写锁(rwlock)RCU锁(Read-Copy Update)Seqlock,自旋锁(1),如果一个自旋锁被别的任务保持,调用者就一直循环,不停检测该自旋锁的保持者是否已经释放了锁。自旋锁不会引起调用者睡眠。自旋锁使用者一般保持锁事件非常短,所以选择自旋而不是睡眠,效率会高于互斥锁。,自旋锁(2),自旋锁的类型是spinlock_t初始化spinlock_t my_spinlock=SPIN_LOCK_UNLOCKED;void spin_lock_init(spinlock_t*lock);获得锁:void spin_lock(spinlock_t*lock);释放锁:void spin_unlock(spinlock_t*lock);非阻塞版本:int spin_trylock(spinlock_t*lock);int spin_trylock_bh(spinlock_t*lock);,读写锁(rwlock)(1),访问者分为两类:读者与写者。任意数目的读者可以同时进入临界区,但是写者必须是排他的。读写锁类型是rwlock_t,位于,读写锁(2),初始化:rwlock_t my_rwlock=RW_LOCK_UNLOCKED;/*静态*/rwlock_init(,RCU锁(1),RCU(Read-Copy Update,读-拷贝修改)锁机制是Linux2.6内核中新的锁机制。对于被RCU保护的共享数据结构,读者不需要获得任何锁就可以访问它,但写者在访问它 时首先拷贝一个副本,然后对副本进行修改,最后使用一个回调(callback)机制在适当的时机把指向原来数据的指针重新指向新的被修改的数据。这个时机就是所有引用该数据的CPU都退出对共享数据的操作。读者基本上没有同步开销,不需要锁,不使用原子指令;但是写者同步开销相对较大,因为它需要延迟数据结构的释放,复制被修改的数据结构,也必须用某种锁机制同步并行的其它写者的修改操作。,RCU锁(2),加锁:rcu_read_lock()释放锁:rcu_read_unlock()同步RCU锁:synchronize_rcu()。该函数由RCU写端调用,它将阻塞写者,直到所有读者完成对临界区的访问后,写者才可以继续下一步操作。如果有多个RCU写端调用该函数,他们将在所有读执行单元完成对临界区的访问后全部被唤醒。,seqlock(1),Linux 2.6引入了一种新的Lock,seqlock,目的是在读者操作特别多的情况下,避免写操作饿死。seqlock的定义如下:typedef struct unsigned sequence;spinlock_t lock;seqlock_t;它比spinlock多了一个sequence域。如果读者获取了锁,写者依然可以获取锁,也就是说,读者不会阻塞写者。读者在得到锁时,会读取 sequence的值,在它退出时,会检查当前的sequence值和之前取得的sequence值是否一致,如果不一致,则说明有写者进入过临界区。这 种情况下,读者会重新获取锁并重读,直到两次sequence的值一致为止。,seqlock(2),读者:unsigned int seq;do seq=read_seqbegin(,4.2 信号量(semaphore),信号量(semaphore)可以有1的值,而互斥锁(mutex)是一种特殊信号量,只能有0-1值。信号量是一种睡眠锁。当一个任务试图获得已被占用的信号量时,会进入一个等待队列,然后睡眠。当持有该信号量的任务释放信号量后,等待该信号量的一个任务就会被唤醒并获得信号量。信号量适用于锁持有时间较长的情况;而自旋锁适用于锁持有时间较短的情况。,信号量的使用,宏声明DECLARE_MUTEX(name)DECLARE_MUTEX_LOCKED(name)初始化void sema_init(struct semaphore*sem,int val);void init_MUTEX(struct semaphore*sem);void init_MUTEX_LOCKED(struct semaphore*sem);获得/释放void down(struct semaphore*sem);int down_trylock(struct semaphore*sem);void up(struct semaphore*sem);,4.3 读写信号量(rw_semaphore),任意多个读者可以同时拥有一个读写信号量;而写者则具有排他性和独占性。读者在拥有读写信号量期间,对该读写信号量保护的共享资源只能进行读访问;如果某个任务同时需要读和写,则被归类为写者,它在对共享资源访问之前须先获得写者身份,写者在当前不需要写访问的情况下可以被降级为读者,提高系统的并发性。,读写信号量的使用,声明和初始化DELARE_RWSEM(sem)void init_rwsem(struct rm_semaphore*sem);读操作void down_read(struct rw_semaphore*sem);int down_read_trylock(struct rw_semaphore*sem);写操作void down_write(struct rw_semaphore*sem);int down_write_trylock(struct rw_semaphore*sem);void up_write(struct rw_semaphore*sem);写者降级为读者void downgrade_write(struct rw_semaphore*sem);,4.4 原子操作(atomic operation),原子操作在执行完毕前不会被任何其他任务打断。需要CPU硬件支持;它的API和原子类型的定义都在内核源码树include/asm/atomic.h文件中,使用汇编语言实现。很多资源计数(refcnt)操作是通过原子操作实现的。,原子操作的使用,原子操作类型的定义typedef struct volatile int counter;atomic_t;原子操作APIatomic_read(atomic_t*v);atomic_set(atomic_t*v,int i);void atomic_add(int I,atomic_t*v);void atomic_sub(int I,atomic_t*v);void atomic_inc(atomic_t*v);void atomic_dec(atomic_t*v);,4.5 完成事件(completion),completion是一种轻量级的同步机制,它允许一个任务告诉另一个任务工作已经完成。与semaphore的功能类似,但使用方法更为简单适用于需要睡眠和唤醒的情景:可以让一个任务进入睡眠直到其它任务完成某些处理过程为止。如果要使用completion,需要包含,同时创建类型为struct completion的变量。,完成事件的使用,静态声明和初始化DECLARE_COMPLETION(my_completion);动态声明和初始化struct completion my_completion;init_completion(,5、工作队列,Linux 2.6内核开始引入工作队列(Work Queue),是将工作推后执行的机制。比如一个中断ISR里面要做很多比较耗时的操作,这时就可以把耗时的工作放到工作队列中去滞后执行。可以交给内核线程去执行,允许重新调度或睡眠。数据结构:struct work_struct atomic_long_t data;struct list_head entry;work_func_t func;,工作队列的使用,初始化INIT_WORK(_work,_func,_data)使用int schedule_work(struct work_struct*work);int schedule_delayed_work(struct work_struct*work,unsigned long delay);void flush_scheduled_work(void);int cancel_delayed_work(struct work_struct*work);创建和调度工作队列struct workqueue_struct*create_workqueue(const char*name);int queue_work(struct workqueue_struct*wq,struct work_struct*work);,6、异步I/O,非阻塞I/O(non-blocking IO),又称异步I/O(Asynchronous IO):用户程序发出I/O请求命令后,不必等待I/O操作完成就可以继续做另外的事情;当I/O操作实际完成时,内核会通过函数回调(function callback)或者信号机制(signal mechanism)通知用户进程。提高系统的响应速度要使用AIO功能,需要包含头文件aio.h,Thanks!,

    注意事项

    本文(【教学课件】第10课设备驱动开发.ppt)为本站会员(牧羊曲112)主动上传,三一办公仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一办公(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    备案号:宁ICP备20000045号-2

    经营许可证:宁B2-20210002

    宁公网安备 64010402000987号

    三一办公
    收起
    展开