第五章-按键中断驱动程序-Linux设备驱动程序-教学课件_第1页
第五章-按键中断驱动程序-Linux设备驱动程序-教学课件_第2页
第五章-按键中断驱动程序-Linux设备驱动程序-教学课件_第3页
第五章-按键中断驱动程序-Linux设备驱动程序-教学课件_第4页
第五章-按键中断驱动程序-Linux设备驱动程序-教学课件_第5页
已阅读5页,还剩43页未读 继续免费阅读

下载本文档

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

文档简介

设备驱动程序第五章按键中断驱动程序目录中断与时钟嵌入式Linux中断处理驱动程序及测试按键中断驱动程序实例中断与定时器非向量中断服务程序的典型结构:中断与定时器定时器在硬件上也依赖中断来实现,其工作原理如图:Linux中断处理程序架构为了在中断执行时间尽可能短和中断处理需要完成大量工作之间找到一个平衡点,Linux将中断处理程序分解为两个部分:顶半部和底半部(软中断)。之所以将中断程序分为两部分,是因为一个中断请求处理程序中,并非所有工作都是急需处理的,通常会有一部分可在稍晚一些时候来处理。一般来说,处理器与外设数据传输工作比较紧急,而对数据的分析和处理工作一般就不那么紧急了。Linux中断处理程序架构可中断不可中断Linux中断处理程序架构顶半部完成尽可能少的比较紧急的功能,它往往只是简单地读取寄存器中的中断状态并清除中断标志后就进行登记中断的工作。(将底半部处理程序挂到该设备的底半部执行队列中去)底半部几乎做了中断处理程序所有的事情,而且可以被新的中断打断,这也是底半部和顶半部的最大不同,因为顶半部往往被设计成不可中断。但如果中断要处理的工作本身很少,则完全可以直接在顶半部全部完成。在Linux系统中,察看/proc/interrupts文件可以获得系统中断的统计信息。Linux中断编程当处理器在接收到中断请求信号后,在条件允许的情况下,处理器会应这个请求去执行一个预设的程序模块,即中断服务例程。处理器就是通过执行这个中断服务例程来为中断源提供服务的。无论何种处理器,都必须为中断请求信号提供硬件通道。当处理器接收到了一个中断请求信号后,必须知道这个信号是哪个通道发出的。为了使处理器能够识别这个中断通道,就必须为每个中断通道赋予一个唯一的编号,即通道号(如图EINT0、EINT1…EINT23)。这个通道号是该通道向处理器传递中断信号,并且处理器响应了这个中断之后,由中断控制器自动向处理器提供的。Linux中断编程CPU中断控制器中断请求中断确认EINT0EINT1EINT23Linux中断编程中断服务例程与中断源是一一对应的,一个中断源要得到处理器的服务,至少要做两件事情:一是发出中断请求信号,二是要在处理器响应了这个中断请求之后,向处理器提供中断服务程序的地址或与之相关的信息。在一个复杂的计算机系统中,中断源的数目往往比计算机硬件提供的中断通道数目大得多,这就迫使多个中断源必须共同使用同一个中断通道。于是,系统就必须在内存中为每个中断通道维护一个中断源队列(中断请求队列),队列中的每个成员对应一个中断源。另外,队列的每个成员必须保有对应中断源的相关信息,以使处理器接收到了一个中断通道的中断请求信号之后,能进一步在该通道的队列中确认究竟是哪个中断源提出了中断请求,并能获取该中断源服务例程的地址或其相关信息。Linux中断编程在中断源请求中断之前,该中断源的中断服务例程必须已挂接到所在通道的中断请求队列中。其安装步骤如下:申请中断Linux中断编程将中断服务例程安装到中断请求队列中:setup_irq(unsignedintirq,structirqaction*new)在中断结束后,关闭申请中断的设备时,要调用函数释放所申请的中断号:Linux中断编程处理器在响应了一个通道的中断请求后,会马上关闭中断并中断现场执行的程序,跳转去执行该通道对应的中断处理程序。在通道处理程序中,需要执行一些由系统提供的函数来完成一些诸如现场保护等例行现场工作。接着,执行函数do_IRQ(),在该函数中主要是调用了中断源中断服务例程(确切地说,是上半部)。在do_IRQ()函数的末尾调用了函数irq_exit(),这个函数的主要工作是启动中断后半部分的软中断机制,以使系统可在适当的时候执行中断服务例程的下半部分函数。Linux中断编程内核提供的其他中断函数使能和屏蔽中断作用范围为本CPULinux中断编程底半部机制Tasklet我们只需定义tasklet及其处理函数并将两者关联,例如:在需要调度tasklet时引用一个tasklet_schedule()就能使系统在适当的时候进行调度运行:Linux中断编程Tasklet使用模板Linux中断编程Tasklet使用模板(续)Linux中断编程底半部机制工作队列下面的代码用于定义一个工作队列和一个底半部执行函数:初始化这个工作队列并将工作队列与处理函数绑定的函数,如下:

调度工作队列执行的函数:Linux中断编程底半部机制软中断软中断是用软件方式模拟硬件中断的概念在Linux内核中,用softirq_action结构体表征一个软中断,这个结构体中包含软中断函数指针和传递给该函数的参数。使用open_softirq()函数可以注册软中断对应的处理函数,而raise_softirq()函数可以触发一个软中断。内核定时器编程Time_list该结构体的一个实例对应一个定时器。初始化定时器增加定时器删除定时器修改定时器的expire内核延时短延迟Linux内核提供了三个函数分别进行纳秒、微秒和毫秒延迟:有时候,可以在软件中进行这样的延迟:对于毫秒级以上延时,内核提供了下列函数:内核延时长延迟内核中进行延迟的一个很直观的方法是比较当前的jiffies和目标jiffies,直到未来的jiffies达到目标jiffies。睡着延迟这是比忙等待更好的方式,随着延迟在等待的时间到来之前进程处于睡眠状态,CPU资源被其他进程使用。目录中断与时钟按键中断驱动程序实例

S3C2410的中断控制器S3C2410的中断控制器可以接收56路中断源的输入。这些中断源由如DMA控制器、UART、IIC或其他内部外围设备提供的。它支持两种中断模式:FIQ和IRQ。每个中断源都可以决定中断请求时使用哪种模式。当从内部外围设备或外部中断引脚接收到多个中断请求时,在经过中断裁决后,中断控制器就向ARM920T内核请求FIQ或者IRQ中断。仲裁过程依赖于硬件优先级逻辑,其结果写入中断待决寄存器,通过查询它,用户可以知道在各路中断源中产生的是哪路中断。S3C2410的中断控制器中断控制器处理的过程和优先级裁决逻辑:中断控制寄存器的设置中断控制器的控制原理如图:中断控制寄存器的设置源待决寄存器SRCPND中断源发出的所有的中断请求首先都要在源待决寄存器中注册。它是32位的寄存器,如果中断源产生了中断请求,那么相应位设为1,等待中断服务。中断模式寄存器INTMOD它是32位的寄存器,如果某位设置成1,那么相应的中断源就以FIQ方式处理,否则以IRQ模式处理。中断掩码寄存器INTMASK它是32位的寄存器,位模式和SRCPND相同。当某一位设置为1时,即使此时SRCPND中相应位是1,CPU也不会处理相应位的中断源的请求。优先级寄存器PRIORITY它是20位的寄存器。中断待决寄存器INTPND它是32位的寄存器,每一位表明相应的中断请求是否有最高优先级。它在优先级逻辑之后,所以只能有一位被设置,该位向CPU产生IRQ请求。按键中断的电路设计按键中断的驱动程序设计键盘中断处理的整个流程:按键中断的驱动程序设计键盘驱动程序的头文件和宏定义:#include<linux/config.h>#include<linux/kernel.h>#include<linux/timer.h>#include<linux/sched.h>#include<linux/module.h>#include<linux/init.h>#include<asm/hardware.h>按键中断的驱动程序设计键盘驱动程序的file_operations结构:按键中断的驱动程序设计按键驱动程序的读写函数:按键中断的驱动程序设计按键驱动程序的ioctl函数:按键中断的驱动程序设计按键驱动程序的open、realse函数:按键中断的驱动程序设计按键驱动程序的中断处理函数:按键中断的驱动程序设计按键驱动程序的init、exit函数:按键中断的驱动程序设计这个程序不需要测试程序,因为中断是个异步的外部事件,要求每到发生的时候,系统都需要响应,所以,不需要测试程序,系统也会自动响应中断。测试结果:嵌入式Linux中断处理驱动程序及测试中断响应流程如图:中断处理过程嵌入式Linux系统下中断请求的处理过程:中断处理过程上图中,中断流程中关键的部分是中断向量表,为了使解析程序能找到向量表,向量表的地址是固定的。这样,执行这个跳转流程的所有程序地址都是固定的,当中断触发以后,就能够自动运行;只有向量表的内容是可变,用户只要在向量表中填入正确的目标值就可以了。中断向量表一般要位于0地址处。中断处理过程图为一次FIQ跳转的流程,假定用户中断向量表定义在地址0X00010000开始的地方。中断的处理模式ARM系统的中断有7种模式:复位未定义指令软件中断指令预取中止数据中止IRQFIQ中断的优先级一个嵌入式系统一般有多个中断请求源。当多个中断源同时请求中断时,就会存在CPU应该优先响应哪个中断请求源的问题,如果处理不当将会引起混乱,导致系统不能正常工作。通常解决这个问题的方法是根据中断源事件的轻重缓急规定中断源的优先级,CPU优先响应优先级高的中断源请求。中断的嵌套当CPU正在处理一个中断请求时,又发生了另外的中断请求,如果CPU能暂时中止对目前中断的处理,转去处理优先级更高的中断请求,待处理完以后,再继续处理原来的中断事件,这样的过程称为中断嵌套,这样的中断系统称为多级中断系统。而没有中断嵌套功能的系统称为单级中断系统。中断源的扩展在实际应用中,中断源的数量可能有几十个,这样嵌入式系统处理器的中断接口是远远不够的。为了解决这个问题,通常采用添加中断控制器的方法。例如S3C2410的中断控制器可以接收56路中断源的输入。这些中断源由如DMA控制器、UART、IIC或其他内部外围设备提供的。它支持两种中断模式:FIQ和IRQ。每个中断源都可以决定中断请求时使用哪种模式。当从内部外围设备或外部中断引脚接收到多个中断请求时,在经过中断裁决后,中断控制器就向ARM920T内核请求FIQ或者IRQ中断。仲裁过程依赖于硬件优先级逻辑,其结果写入中断待决寄存器,通过查询它,用户可以知道在各路中断源中产生的是哪路中断。中断共享多个设备共享一根硬件中断线的情况在实际的硬件系统中广泛存在。Linux2.6支持这种中断共享。下面是中断共享的使用方法

温馨提示

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

评论

0/150

提交评论