linux 中断(原创)

------------------- 中断注册 ---------------

  中断的注册实质上就是对指定的中断线确定一个中断处理程序,注册时需要指定的有,中断线,中断处理函数,触发方式。 其他的参数都可以是null.  最后一个参数是名字,这个可以是null, 不过最好写上名字。 这个在/proc/inperupts 最后一列,就是这里指定的名字。如果是共享中断,就不能是null了, 要设定特定的标志,要设置设备id.

  申请中断时,要查一下设备datasheeet的中断标志位,看是不是共享中断,即多个设备共享一个中断,如果是共享中断,在request_irq申请中断时,表示中断标志的第三个参数要设置为IRQ_HANDLED, 如果这个设置错了,内核在此就挂掉。

  中断分为硬件中断,软件中断。硬件中断即芯片报过来的中断号,中断号即是原理图上看到的中断线。

  Dbounce, 分为硬件方式和软件方式,因为信号都有波动,dounce指定当信号稳定时间到指定时间,才算中断发生。

----------------- 中断处理程序 -----------------------
  中断处理函数返回值IRQ_HANDLED表示表示接收到的中断确实是指定的设备产生的中断,不是虚假中断 。 IRQ_none表示是虚假中断. 到目前接触的i2c, kpd, 都是直接返回IRQ_HANDLED。共享中断在红米 note上没使用。
  为了确保中断处理程序不被抢占,即不让出cpu, 一般要禁用中断。因为中断可以qian套,就是一个中断处理程序被其他中断所打断,所以要禁用中断。禁用中断有两种,一是禁用所有中断,即local_irq_disable. 一是禁用特定中断线上的中断,用disable_irq_nosync. disable_irq是同步的,即中断处理程序执行结束后,这个中断函数才返回。 这个同步使cpu,不能响应其他事情,使整个系统崩馈。 所以disable_irq_nosync,不用等中断处理结束,就直接返回。

  中断禁用前,要把中断的相关信息保存起来,(调用 local_irq_save)中断激活后,要中断相关信息要恢复成中断禁用前的信息( local_irq_restore)。

---------------- 中断上下文 ------------------
  内核上下文, 即进程上下文,是应用进程通过系统调用而进入内核,这时内核代表当前进程,内核可通过current查询当前进程的信息,在内核上下文中可以睡眠。进程上下文包括cpu寄存器的值,进程的状态,堆栈里的数据。

  中断上下文不属于进程的执行范围,不代表进程,在此环境中,看不到current及其信息,中断(严格说是上中断)意味着CPU不能做别的事情,直到上中断结束。

  处在中断上下文的有中断处理程序,和执行下中断的tasklet.  中断上下文是不能睡眠的,即不能被抢占。 因为wake_up只能唤醒进程,而不能唤醒中断上下文的程序,这里的程序没有task_struct, 不属于进程的范畴。 中断上下文是不能被唤醒的。 凡是可能引起睡眠的函数都不能被中断处理程序调用。
  中断处理程序使用的堆栈:内核所处的上下文只有两种,一是进程上下文,一是中断上下文。中断还有一层意思是,中断当前的进程。 中断上下文没有自己的堆栈,中断处理程序使用的栈,就是从被中断的进程的栈。进程的堆栈都在内核中。 如果没有进程运行,就用idle进程的中断。这个栈大小是固定的,在32位上是8KB, 在64位上是16KB。

 

---------------------- 下中断 -------------------

  上中断做紧急的硬件写数据然后把下中断例程挂到下中断队列中,上中断时间是非常短的,在些期间,CPU不能响应其他中断,中断几乎所有的事情都交给下中断做,下中断的实现有工作队列或tasklet.

-------------- 查看中断相头信息 ---------------------

/proc/interrupts.

第一列是中断线(中断号),第二列是一个接收中断数目的计数器,第三列是处理这个中断的中断控制器,最后一列是与这个中断有关的设备名字,

---------------------  内核抢占 --------------------------

  内核抢占:关于抢占与非抢占命名,是指进程运行时,并且通过系统调用,在内核空间中运行时,这个时候,如果是非抢占的,那么内核想让进程让出cpu, 即调度进程进入睡眠,就必须等这个进程调这个系统调用结束后,才能进行进程调度。如果是抢占式的,就不必等系统调用结束,即可让当前进程让出cpu. 抢占的命名即是当前进程所用的cpu被其他进程给抢了。

就算内核是抢占式的,但有几个地方是不能抢占的,中断处理程序,tasklet,

linux之前是非抢占的,即进程让出cpu,

------------------- 内核对中断的实现 ----------------------

主要是do_irq 和 irq_handle_event两个函数。

linux 中断(原创)

时间: 2024-10-05 21:13:09

linux 中断(原创)的相关文章

linux中断子系统:中断号的映射与维护

写在前沿: 好久好久没有静下心来整理一些东西了,开始工作已有一个月,脑子里想整理的东西特别多.记录是一种很好的自我学习方式,静下来多思考多总结,三年的工作目标不能发生变化,作为职场菜鸟即将进入全世界半导体第一的Intel working,是机遇更是一种挑战,困难也是可想而知.脚踏实地.仰望星空,以结果为导向,以目标为准则,争取每天进步一点点. Linux内核版本:3.4.39 一. linux中断子系统的irq_desc初始化 linux内核最初的中断初始化过程入口为start_kernel.在

Linux中断(interrupt)子系统之一:中断系统基本原理

这个中断系列文章主要针对移动设备中的Linux进行讨论,文中的例子基本都是基于ARM这一体系架构,其他架构的原理其实也差不多,区别只是其中的硬件抽象层.内核版本基于3.3.虽然内核的版本不断地提升,不过自从上一次变更到当前的通用中断子系统后,大的框架性的东西并没有太大的改变. /*****************************************************************************************************/ 声明:本博内容

Linux中断(interrupt)子系统之一:中断系统基本原理【转】

转自:http://blog.csdn.net/droidphone/article/details/7445825 这个中断系列文章主要针对移动设备中的Linux进行讨论,文中的例子基本都是基于ARM这一体系架构,其他架构的原理其实也差不多,区别只是其中的硬件抽象层.内核版本基于3.3.虽然内核的版本不断地提升,不过自从上一次变更到当前的通用中断子系统后,大的框架性的东西并没有太大的改变. /***************************************************

Linux中断(interrupt)子系统之二:arch相关的硬件封装层【转】

转自:http://blog.csdn.net/droidphone/article/details/7467436 版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[-] CPU的中断入口 初始化 中断控制器的软件抽象struct irq_chip 进入流控处理层 中断控制器的级联 Linux的通用中断子系统的一个设计原则就是把底层的硬件实现尽可能地隐藏起来,使得驱动程序的开发人员不用关注底层的实现,要实现这个目标,内核的开发者们必须把硬件相关的内容剥离出来,然后定义一些列标准

Linux中断完全分析

学习本文可以对linux中断有全面而深刻的认识.本文对Linux中断所涉及的需求.管理机制.中断实现.中断接口(上半部和下半部).驱动使用进行完全分析. 一.中断需求 软件是需求驱动的,软件的出现是为了解决需求和问题的.先知道需求,那理解代码就是为了验证已知的问题:不知道需求,那理解代码就是揣摩设计者的目的.两者相比,前者自然效率跟高. 中断是为了解决异步的需求.紧急的事情或者更高优先级的事情需要先做,就代表异步.例如,手机需要时刻优先响应用户按键或者触摸这个事件,否则用户体验就变差.信号是软件

linux中断源码分析 - 中断发生(三)

本文为原创,转载请注明:http://www.cnblogs.com/tolimit/ 回顾 上篇文章linux中断源码分析 - 初始化(二)已经描述了中断描述符表和中断描述符数组的初始化,由于在初始化期间系统关闭了中断(通过设置CPU的EFLAGS寄存器的IF标志位为0),当整个中断和异常的初始化完成后,系统会开启中断(设置CPU的EFLAGS寄存器的IF标志位为1),此时整个系统的中断已经开始可以使用了.本篇文章我们具体研究一次典型中断发生时的运行流程. 中断产生 我们需要先明确一下,中断控

linux中断流程详解

异常体系比较复杂,但是linux已经准备了很多的函数和框架,但是因为中断是和具体的开发板相关,所以中断需要我们自己来处理一些方面,但是这也是很少的一部分,很多公用的处理函数内核已经实现,linux内核搭建了一个非常容易扩充的中断处理体系. 中 断系统结构涉及的方面很多,而且分布在很多的函数中,这里我主要理清一些结构和流程顺序已经在哪些函数中实现,我不知道其他人怎么样?但是我自己一开始怎 是找不到linux内核是怎么把GPIO设置成中断的,我找了很久都找不到,还有我们很多的设置,初始化等等东西好像

Linux中断(interrupt)子系统

Linux中断(interrupt)子系统之一:中断系统基本原理 Linux中断(interrupt)子系统之二:arch相关的硬件封装层 Linux中断(interrupt)子系统之三:中断流控处理层 Linux中断(interrupt)子系统之四:驱动程序接口层 & 中断通用逻辑层 Linux中断(interrupt)子系统之五:软件中断(softIRQ) http://blog.csdn.net/droidphone/article/details/7497787

linux中断申请之request_threaded_irq

转载:linux中断申请之request_threaded_irq 在linux里,中断处理分为顶半(top half),底半(bottom half),在顶半里处理优先级比较高的事情,要求占用中断时间尽量的短,在处理完成后,就激活底半,有底半处理其余任务.底半的处理方式主要有soft_irq, tasklet, workqueue三种,他们在使用方式和适用情况上各有不同.soft_irq用在对底半执行时间要求比较紧急或者非常重要的场合,主要为一些subsystem用,一般driver基本上用不