Linux注册中断处理程序(含IRQF_SAMPLE_RANDOM等标志位.docx_第1页
Linux注册中断处理程序(含IRQF_SAMPLE_RANDOM等标志位.docx_第2页
Linux注册中断处理程序(含IRQF_SAMPLE_RANDOM等标志位.docx_第3页
Linux注册中断处理程序(含IRQF_SAMPLE_RANDOM等标志位.docx_第4页
Linux注册中断处理程序(含IRQF_SAMPLE_RANDOM等标志位.docx_第5页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Linux注册中断处理程序(含IRQF_SAMPLE_RANDOM等标志位说明)14.5 Linux 中断编程中断编程主要包括注册中断处理程序、注销中断处理程序、共享中断处理程序。本节将详细讨论这些中断编程技术。14.5.1 注册中断处理程序(1)中断处理程序是驱动程序的重要组成部分,也是处理中断请求的核心。实际上中断处理程序就是一个函数。这个函数需要调用request_irq或request_threaded_irq函数(linux/interrupt.h)注册到Linux系统中,其中request_irq函数只能指定一个中断处理函数,而request_threaded_irq函数不仅能指定中断处理函数,还可以指定一个与中断处理函数同样的函数(可称为第2个中断处理函数)。系统会根据前一个中断处理函数的返回值决定是否在另一个线程中调用第2个中断处理函数。这两个函数的原型如下:1. intrequest_irq(unsignedintirq,irq_handler_thandler,unsignedlongflags, 2. constchar*name,void*dev); 3. intrequest_threaded_irq(unsignedintirq,irq_handler_thandler, 4. irq_handler_tthread_fn, 5. unsignedlongflags,constchar*name,void*dev); 其中irq_handler_t是函数指针类型,定义如下:1. typedefirqreturn_t(*irq_handler_t)(int,void*);irqreturn_t是枚举类型,定义如下:1. enumirqreturn 2. IRQ_NONE, 3. IRQ_HANDLED, 4. IRQ_WAKE_THREAD, 5. ; 6. typedefenumirqreturnirqreturn_t; 从中断处理函数的返回值可以看出,该函数返回3个值:IRQ_NONE、IRQ_HANDLED和IRQ_WAKE_THREAD。中断处理函数的参数和这3个返回值的含义将在本章的后面介绍。request_irq函数参数的含义如下。(1)irq:要申请的中断号。对于某些设备,如系统时钟、键盘等,这个参数值通常是固定死的。而对于大多数设备来说,这个参数值要么可以通过探测获取,要么可以通过编程动态确定。(2)handler:中断处理函数的指针。(3)flags:该参数值可以为0,也可以设置下列一个或多个标志的掩码。老版本的Linux内核是以SA开头的宏,如SA_INTERRUPT,由于信号量的很多宏也以SA开头,为了避免产生混淆,在新版本中使用以IRQF开头的宏替代,这些宏的含义如下所示。IRQF_DISABLED:当设置该标志时,会使Linux内核在执行中断处理函数时禁止所有的中断。如果未设置该标志。除了当前处理的中断外,中断处理函数可以被其他任何的中断打断。大多数中断处理函数都不需要设置设个标志,因为在执行中断处理函数时禁止所有的中断是一种非常不好的内核编程方式。之所以还保留这个标志,是为了某些对性能非常敏感的中断处理。这个标志相当于旧的Linux内核版本的SA_INTERRUPT。这个标志在旧版本的Linux内核中用于区分快中断和慢中断。如果使用了SA_INTERRUPT标志,当前的中断就变成了快中断(禁止了所有的中断)。目前除了时钟中断外,其他的中断很少会使用该标志。IRQF_SAMPLE_RANDOM:该标志表明这个设备产生的中断对内核熵池(entropy pool)有贡献。内核熵池负责提供从各种随机事件导出真正的随机数。如果指定了该标志,那么来自该设备的中断间隔时间就会作为熵填充到熵池。如果发出中断请求的设备以预知的速率产生中断(如系统定时器),或者受到某些外部因素影响(如果联网设备收到人为的控制),那么为这种设备申请中断处理函数时就不要设置这个标志。而对于那些以不可预知的速率产生中断的设备而言,就是一种很好的熵源。IRQF_SHARED:该标志指定了多个中断处理程序可以使用同一个中断线(interrupt line)。在同一个中断线上注册的每一个中断处理程序必须指定该标志,否则每一个中断线上只能有一个处理程序。IRQF_TIMER:该标志指定了中断处理程序用于系统计时器(System Timer)。(4)name:与中断相关的设备的文本表示法。例如,PC机上键盘中断对应的值是keyboard。这些名字会被/proc/irq和/proc/interrupt文件使用,以便与用户通信。稍后会我们会对此进行讨论。(5)dev:用于共享中断线。当释放一个中断处理程序后,dev参数为当前中断处理程序提供了唯一的标识,以便系统知道要释放中断线上哪一个中断处理程序。如果没有该参数,系统内核就不知道该释放中断线上的哪一个中断处理函数。当然,如果中断线未共享(中断线上只有一个中断处理程序),该参数也可以设为NULL。该参数值也会传入中断处理函数的第2个参数中。request_irq函数如果成功请求了中断,返回0,否则返回一个非零值(表示请求中断失败)。在这种情况下,中断处理程序不会被注册。最常见的错误是-EBUSY,表示当前申请的中断线已经被占用,或者没用指定IRQF_SHARED标志。注意request_irq函数可能引起休眠,因此,不能在中断上下文或其他可能引起阻塞的地方调用request_irq函数。那么request_irq函数为什么会引起睡眠呢?也许很多人看了会看到费解。其实只要了解了request_irq函数在请求中断时都做了些什么就会清楚request_irq函数为什么会引起休眠了。在请求中断时,需要在虚拟目录/proc/irq中建立一个与中断对应的虚拟目录(虚拟目录名就是中断号,例如Nexus S手机上的308)。proc_mkdir函数用来创建虚拟目录。该函数通过调用proc_create函数对这个新的虚拟目录进行设置。而proc_create会调用kmalloc函数请求分配内存。问题就出在kmalloc函数上,该函数是可以引起休眠的。因此request_irq函数可能会引起休眠。下面来看一个如何使用request_irq函数请求中断的例子。其中irqn是中断号,interrupt_handler是中断处理函数,dev是(void *)指针类型变量,用于唯一表示当前注册的中断处理函数。1. if(request_irq(irqn,interrupt_handler,IRQF_SHARED,hardware_device,dev) 2. 3. printk(KERN_ERRhardware_device:cannotregisterIRQ%dn,irqn); 4. return-EIO; 5. 不同架构的处理器都会将某些中断号固定下来,那些未固定中断号的硬件(如插在PCI插槽的设备)会由Linux内核动态分配中断号。对于某个架构的处理器,所有固定下来的中断号都在irqs.h文件中定义。例如,S3C64XX处理器的中断号在如下路径的irqs.h文件中定义。1. arch/arm/mach-s3c64xx/include/mach/irqs.h现在连接开发板,然后进入开发板的Shell,执行cat /proc/interrupts查看开发板上已使用的中断,如图14-5所示。图14-5所示白框中的是AC97设备使用的中断。AC97是声卡设备。这个设备使用的中断号是68。现在打开irqs.h文件,找到相关的宏。与AC97中断号相关的有4个宏,这些宏如下。从这些宏很容易推出IRQ_AC97的值是68。从irqs.h文件中还可以找到图14-5所示的其他定义的中断号。1. #defineS3C_IRQ_OFFSET(32) 2. #defineIRQ_VIC1_BASES3C_IRQ(32) 3. #defineS3C64XX_IRQ_VIC1(x)(IRQ_VIC1_BASE+(x) 4. #defineIRQ_AC97S3C64XX_IRQ_VIC1(4) 注意AC97是一种音频规范。包括两部分:音

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论