嵌入式linux系统设计与应用 课件 第8、9章 嵌入式Linux驱动程序、嵌入式Linux高级编程.pptx

嵌入式linux系统设计与应用 课件 第8、9章 嵌入式Linux驱动程序、嵌入式Linux高级编程.pptx

  1. 1、本文档共171页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多

第八章嵌入式Linux驱动程序;第八章嵌入式Linux驱动程序;ARM-Linux驱动程序的4种经典方法;设备驱动程序开发概述;Linux设备驱动程序概述

;Linux设备驱动程序可以分为两个主要组成部分:

(1)对子程序进行自动配置和初始化,检测驱动的硬件设备是否正常,能否正常工作。

(2)设备服务子程序和中断服务子程序,这两者分别是驱动程序的上下两部分。驱动上部分即设备服务子程序的执行是系统调用的结果,并且伴随着用户态向核心态的演变,在此过程中还可以调用与进程运行环境有关的函数,比如sleep()函数。驱动程序的下半部分即中断服务子程序。;Linux设备驱动程序分类

;8.1.1Linux设备驱动程序分类;2.块设备

所谓块设备是指对其信息的存取以“块”为单位。如常见的光盘、硬磁盘、软磁盘、磁带等,块长大小通常取512B、1024B或4096B等。块设备和字符设备一样可以通过文件系统节点来访问。在大多数linux系统中,只能将块设备看作多个块进行访问,一个块设备通常是1024B数据。

块设备的特点是对设备的读写是以块为单位的,并且对设备的访问是随机的。块设备和字符设备的区别主要在于内核内部的管理上,其中应用程序对于字符设备的每个I/O操作都会直接传递给系统内核对应的驱动程序;而应用程序对于块设备的操作要经过系统的缓冲区管理间接地传递给驱动程序处理。;3.网络设备

网络设备驱动通常是通过套接字(Socket)等接口来实现操作。任何网络事务处理都可以通过接口来完成和其他宿主机数据的交换。内核和网络设备驱动程序之间的通信与字符设备驱动程序和块设备驱动程序与内核的通信是完全不同的。;1.内存与I/O端口

编写驱动程序大多数情况下其本质都是对内存和I/O端口的操作。

(1)内存;(2)I/O端口;根据CPU系统结构的不同,CPU对I/O端口的编址方式通常有两种:

第一种是I/O映射方式,如x86处理器为外设专门实现了一个单独的地址空间,称为I/O地址空间,CPU通过专门的I/O指令来访问这一空间的地址单元;

第二种是内存映射方式,RSIC指令系统的CPU(如ARM、PowerPC等)通常只实现一个物理地址空间,外设I/O端口成为了内存的一部分,此时CPU访问I/O端口就像访问一个内存单元,不需要单独的I/O指令。

这两种方式在硬件实现上的差异对软件来说是完全可见的。;2.并发控制

在驱动程序中经常会出现多个进程同时访问相同的资源时可能会出现竞态(racecondition),即竞争资源状态,因此必须对共享资料进行并发控制。Linux内核中解决并发控制最常用的方法是自旋锁(spinlocks)和信号量(semaphores)。;(1)自旋锁;自旋锁和信号量有很多相似之处但又有些本质的不同。其相同之处主要有:首先它们对互斥来说都是非常有用的工具;其次在任何时刻最多只能有一个线程获得自旋锁或信号量。

不同之处主要有:

首先自旋锁可在不能睡眠的代码中使用,如在中断服务程序(ISR)中使用,而信号量不可以;

其次自旋锁和信号量的实现机制不一样;最后通常自旋锁被用在多处理器系统。

总体而言,自旋锁通常适合保持时间非常短的情况,它可以在任何上下文中使用,而信号量用于保持时间较长的情况,只能在进程上下文中使用。;3.阻塞与非阻塞

在驱动程序的处理过程中我们提到了阻塞的概念,这里进行以下说明。阻塞(blocking)和非阻塞(nonblocking)是设备访问的两种不同模式,前者在I/O操作暂时不可进行时会让进程睡眠,而后者在I/O操作暂时不可进行时并不挂起进程,它或者放弃,或者不停地查询,直到可以进行操作为止。;(1)阻塞与非阻塞操作

阻塞操作是指在执行设备操作时,若不能获得资源则进程挂起,直到满足可操作的条件再进行操作。被挂起的进程进入睡眠状态,被从调度器的运行队列中移走,直到等待条件被满足。

非阻塞操作是在不能进行设备操作时并不挂起,它会立即返回,使得应用程序可以快速查询状态。;(2)异步通知

异步通知是指一旦设备准备就绪,则该设备会主动通知应用程序,这样应用程序就不需要不断地查询设备状态,通常把异步通知称为信号驱动的异步I/O(SIGIO),这有点类似于硬件上的中断。;中断处理;任务队列(tasklet);工作队列(workqueue);设备号;设备驱动程序框架;(2)设备的打开与释放

打开设备是由调用定义在incliude/linux/fs.h中的file_operations结构体中的open()函数完成的。open()函数主要完成的主要工作:

增加设备的使用计数。

检测设备是否异常,及时发现设备相关错误,防止设备有未知硬件问题。

若是

文档评论(0)

lai + 关注
实名认证
内容提供者

精品资料

版权声明书
用户编号:7040145050000060

1亿VIP精品文档

相关文档