自己学驱动18——中断

1.中断原理

当某个事件发生时,硬件会设置某个寄存器;CPU在执行完一个指令时,通过硬件查看这个寄存器,如果发现所关注的事件发生了,则中断当前程序流程,跳转到一个固定的地址去处理这个事件,最后返回继续执行被中断的程序。

2.中断处理过程

(1)中断控制器汇集各类外设发出的中断信号,然后告诉CPU。

(2)CPU保存当前程序的运行环境(各个寄存器等),调用中断服务程序(ISR,Interrupt Service Routine)来处理这些中断。

(3)在ISR中通过读取中断控制器、外设的相关寄存器来识别这是哪个中断,并进行相应的处理。

(4)清除中断:通过读写中断控制器和外设的相关寄存器实现。

(5)最后恢复被中断程序的运行环境,继续执行。

3.使用中断的步骤

(1)设置好中断模式和快速中断模式下的栈:当发生中断IRQ时,CPU进入中断模式,这时使用中断模式(IRQ)下的栈;当发生快速中断FIQ时,CPU进入快速中断模式,这时使用快速中断模式下的栈。

(2)准备好中断处理函数:

在异常向量表中设置好当进入中断模式或快速中断模式时的跳转函数;

对于IRQ,读取INTPND寄存器或INTOFFSET寄存器的值来确定中断源,然后分别处理,而对于FIQ,因为只有一个中断可以设置为FIQ,则无需判断中断源;

清除中断,清除中断应该从源头开始,首先,需要的话,操作具体的外设清除中断信号,其次清除SUBSRCPND、SRCPND寄存器中相应的位(往相应位写1即可),最后,清除INTPND寄存器中相应位(往相应位写1即可),最简单的办法"INTPND = INTPND"。

(3)进入、退出IRQ或FIQ时需要保存、恢复被中断程序的运行环境。

(4)根据具体中断,设置相关外设。

(5)对于"Request sources(without sub-register)"中的中断,将INTSUBMSK寄存器中相应位设为0。

(6)确定使用此中断的方式:FIQ或IRQ。

如果是FIQ,则在INTMOD寄存器中设置相应位为1;

如果是IRQ,则在RIORITY寄存器中设置优先级。

(7)如果是IRQ,则将INTMSK寄存器中相应位设为0(FIQ不受INTMSK寄存器控制)。

(8)设置CPSR寄存器中的I-bit,使能IRQ或FIQ。

时间: 2024-08-13 14:51:29

自己学驱动18——中断的相关文章

linux驱动之中断方式获取键值

linux驱动之中断方式获取键值 ------------------------------------------------------------------------------------------------------------------------------------------------------ 回想在单片机下的中断处理 分辨是哪个中断 调用处理函数 清中断 --------------------------------------------------

Linux kernel中断子系统之(五):驱动申请中断API

一.前言 本文主要的议题是作为一个普通的驱动工程师,在撰写自己负责的驱动的时候,如何向Linux Kernel中的中断子系统注册中断处理函数?为了理解注册中断的接口,必须了解一些中断线程化(threaded interrupt handler)的基础知识,这些在第二章描述.第三章主要描述了驱动申请 interrupt line接口API request_threaded_irq的规格.第四章是进入request_threaded_irq的实现细节,分析整个代码的执行过程. 二.和中断相关的lin

Linux中断 - 驱动申请中断API

一.前言 本文主要的议题是作为一个普通的驱动工程师,在撰写自己负责的驱动的时候,如何向Linux Kernel中的中断子系统注册中断处理函数?为了理解注册中断的接口,必须了解一些中断线程化(threaded interrupt handler)的基础知识,这些在第二章描述.第三章主要描述了驱动申请 interrupt line接口API request_threaded_irq的规格.第四章是进入request_threaded_irq的实现细节,分析整个代码的执行过程. 二.和中断相关的lin

[linux驱动][linux中断]——中断处理

一,中断处理函数中断处理函数运行在中断上下文,不可抢占.调度.中断上下文编程需要注意以下几点:    不能睡眠或调用 schedule 放弃CPU    不能调用任何可能睡眠的函数,例如:获取信号量    不能访问用户空间数据,例如:copy_from_user,因为它不是在进程上下文中执行的.    执行时间尽可能短 int request_irq (unsigned int irq, irq_handler_t handler, unsigned long flags, const char

linux设备驱动:中断的实现

一.什么是中断 中断分两种: 1)中断,又叫外部中断或异步中断,它的产生是由于外设向处理器发出中断请求.其中外部中断也有两种,这是由配置寄存器设定的:普通中断请求(IRQ)和快速中断请求(FIQ).一般地,linux下很少使用快速中断请求. 2)异常,又叫内部中断或同步中断,它的产生是由于处理器执行指令出错. 在以下的内容我是要介绍由于外部设备产生的中断. 这里我还有两个名词要说清楚 1)中断请求线:在后面也叫中断号,每个中断都会通过一个唯一的数值来标识,而这个值就称做中断请求线 2)在2440

驱动:中断【2】中断处理程序、中断上下文中处理延时及一些函数的调用规则(调IIC中断驱动有感)

中断处理程序.中断上下文中处理延时及一些函数的调用规则(调IIC中断驱动有感)http://blog.csdn.net/samantha_sun/article/details/6790492 1,中断处理程序中不能使用有睡眠功能的函数,如ioremap,kmalloc,msleep等,理由是中断程序并不是进程,没有进程的概念,因此就没有休眠的概念: 2,中断处理程序中的延时可以用忙等待函数来代替,如ndelay,udelay,mdelay等,这些函数在实现上本质是根据CPU频率进行一定 次数的

深入浅出~Linux设备驱动之中断与定时器

“我叮咛你的 你说 不会遗忘 你告诉我的 我也全部珍藏 对于我们来说 记忆是飘不落的日子 永远不会发黄 相聚的时候 总是很短 期待的时候 总是很长 岁月的溪水边 捡拾起多少闪亮的诗行 如果你要想念我 就望一望天上那 闪烁的繁星 有我寻觅你的 目光” 谢谢你,曾经来过~ 中断与定时器是我们再熟悉不过的问题了,我们在进行裸机开发学习的 时候,这几乎就是重难点,也是每个程序必要的模块信息,那么在Linux中,我们又怎么实现延时.计数,和中断呢? 一.中断 1.概述 所谓中断是指cpu在执行程序的过程中

4星|《海盗经济学》:3级慎入。利益驱动18世纪的欧洲海盗船上普遍实行了领先的制度

海盗经济学 先提醒一下,本书虽然以经济学讨论为主,还是有个别地方涉及到了海盗们的残忍血腥的行径,不喜欢这类细节的读者建议不要读本书. 作者是经济学教授.书中作者考证了18世纪初大英帝国辖区内的海盗的内部组织结构,得出了反直觉的结论:在利益的驱使下,海盗比政府更早实行了一些比较先进的制度,包括:1:每个海盗都有权力的直接民主:2:用舵手制约船长的分权制度:3:给黑人平等的权力:4:行动前就海盗宪章表决认可:5:吸引船员与黑奴自动加入而不是强迫: 基于作者的身份,可以认为书中的证据是可信的.作者用经

零基础学python-2.18 异常

这一节说一下异常except 继续沿用上一节的代码.我有益把文件名称字搞错.然后在结尾部分加上异常捕捉: try: handler=open("12.txt")#在这里我特别将文件的名字搞错 for eachLine in handler: print(eachLine,end='') handler.close() except IOError as e: print(e) 他会出现报错的内容: python本身包括了非常多异常,我们将会后面具体展开 就讲到这里.谢谢大家 -----