嵌入式Linux开发教程-全套PPT课件.ppt

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

4.并发实战下面进入对并发控制的实战。首先,在chardev的驱动程序中,可以通过信号量来控制对intchardev_var的并发访问。11.2.5阻塞与非阻塞阻塞操作是指在执行设备操作时,若不能获得资源,则进程挂起直到满足可操作的条件再进行操作。非阻塞操作的进程在不能进行设备操作时并不挂起。被挂起的进程进入休眠状态后,被操作系统从调度器的运行队列移走,直到等待的条件被满足。11.2.6select和pollselect和poll的本质一样,前者在BSDUnix中引入,后者在SystemV中引入。poll和select用于查询设备的状态,以便用户程序获知是否能对设备进行非阻塞的访问,它们都需要设备驱动程序中的poll函数支持。驱动程序中poll函数中最主要用到的一个API是poll_wait,其原型如下:voidpoll_wait(structfile*filp,wait_queue_heat_t*queue,poll_table*wait);11.2.7中断处理与Linux设备驱动中中断处理相关的首先是申请与释放IRQ的API:request_irq()和free_irq()。request_irq()的原型如下所示:intrequest_irq(unsignedintirq,void(*handler)(intirq,void*dev_id,structpt_regs*regs),unsignedlongirqflags,constchar*devname,void*dev_id);free_irq()的原型为:voidfree_irq(unsignedintirq,void*dev_id);11.2.8内存与I/O操作对于提供了MMU(存储管理器,辅助操作系统进行内存管理,提供虚实地址转换等硬件支持)的处理器而言,Linux提供了复杂的存储管理系统,使得进程所能访问的内存达到4GB。这4GB内存空间被人为的分为两个部分:用户空间与内核空间。几乎每一种外设都是通过读写设备上的寄存器来进行的,通常包括控制寄存器、状态寄存器和数据寄存器三大类,外设的寄存器通常被连续编址。根据CPU体系结构的不同,CPU对I/O端口的编址方式有以下两种:I/O映射方式(I/O-mapped)。内存映射方式(Memory-mapped)。11.3块设备驱动编写块设备是与字符设备并列的概念,这两类设备在Linux中驱动的结构有较大差异,总体而言,块设备驱动比字符设备驱动要复杂得多,在I/O操作上表现出极大的不同,缓冲、I/O调度、请求队列等都是与块设备驱动相关的概念。11.3.1块设备的I/O操作特点字符设备与块设备I/O操作的不同在于:块设备只能以块为单位接受输入和返回输出,而字符设备则以字节为单位。大多数设备是字符设备,因为它们不需要缓冲而且不以固定块大小进行操作。块设备对于I/O请求有对应的缓冲区,因此它们可以选择以什么顺序进行响应,字符设备无须缓冲且被直接读写。对于存储设备而言调整读写的顺序作用巨大,因为读写连续的扇区比分离的扇区更快。字符设备只能被顺序读写,而块设备可以随机访问。虽然块设备可随机访问,但是对于磁盘这类机械设备而言,顺序地组织块设备的访问可以提高性能。11.3.2block_device_operations结构体在块设备驱动中,有1个类似于字符设备驱动中file_operations结构体的block_device_operations结构体,它是对块设备操作的集合,定义代码如下:11.3.3gendisk结构体在Linux内核中,使用gendisk(通用磁盘)结构体来表示一个独立的磁盘设备(或分区),该结构体的定义代码如下:1.分配gendiskgendisk结构体是一个动态分配的结构体,它需要特别的内核操作来初始化,驱动不能自己分配这个结构体,而应该使用下列函数来分配gendisk:structgendisk*alloc_disk(intminors);minors参数是这个磁盘使用的次设备号的数量,一般也就是磁盘分区的数量,此后minors不能被修改。2.增加gendiskgendisk结构体被分配之后,系统还不能使用这个磁盘,需要调用如下函数来注册这个磁盘设备:voidadd_disk(structgendisk*gd);特别要注意的是,对add_disk()的调用必须发生在驱动程序的初始化工作已完成并能响应磁盘的请求之后。3.释放gendisk当不再需要一个磁盘时,应当使用如下函数释放gendisk:voiddel_gendisk(stru

文档评论(0)

153****9532 + 关注
实名认证
内容提供者

若下载文档格式有问题,请咨询qq393261799索取原版

版权声明书
用户编号:6101234030000022

1亿VIP精品文档

相关文档