- 回顾裸机的流程。在裸机下学期,通过按键玩中断。
裸机中断的过程:
- 中断会有统一的入口:当我们的程序产生中断的时候,无论是哪种中断。都会跳到中断向量表里的_irq这里。这是统一的入口。
2.用户要先注册中断处理程序。
3.根据中断源编号,调用中断处理程序。
接下来我们来看linux的中断,是不是也是这种模式的呢?
我们打开内核工程的entry-armv.S这个文件,在这个文件里有这样的代码:
这就是linux统一的入口:__irq svc.
进入了统一的入口之后,程序会去调用irq_handler:
而irq_handler实际上是调用上面的arch_irq_handler_defualt.该代码在entry-macro-multi.S里面。
在这个中断处理程序中。最重要的是get_irqnr_and_base获取产生中断的中断源。我们搜一下这个宏,会处理很多。这里我们以24XX的为例:
从上面的程序看到。他主要是获取产生中断的中断号。获得中断号后,会跳转到:arch_irq_handler_defualt里的asm_do_IRQ去处理中断:
跳转到这个函数之后,又会去调用generic_handle_irq(irq)这个函数。
这个函数又会去调用generic_handle_irq_desc这个函数:
在这个函数里又会去调用desc这个结构。
总结:在linux里:当产生中断的时候,会有一个统一的入口,irq_svc.进来之后,第一步是拿到产生中断源的编号,然后根据这个中断号去找到irq_desc这个结构。然后在这个结构里取出事先准备好的注册处理函数。
图1
我们的驱动要支持中断处理,首先必须去实现中断处理程序。第二是要注册中断处理函数。
共享中断号,如我们的图1的0号中断,在结构irq_desc里有多个处理程序。当中断产生的时候,所以的函数会去执行一遍。这样就要求我们在写程序的时候有一个判断,判断是否产生中断了。产生了就执行这函数,没产生就退出该函数。
流程:
Dev_id是指中断里的第几个函数,要注销的。
2.中断处理程序
时间: 2024-10-11 21:14:15
2.中断处理程序的相关文章
中断处理程序不能使用printf的本质
vxworks 中断处理程序之所以不用printf,本质在于printf是将信息输出到标准输出设备(STDOUT)中, 整个标准输出设备是一个全局变量,由于有semTake操作,那么就会发生阻塞,vxworks属于硬实时操作系统,不能在规定的时间内完成操作即会死机或复位.所以vxworks不用printf的原因在于阻塞. 网上说printf 因为引用全局变量stdout,所以是不可重入的.这个稍微解释一下.如果用到了全局变量,但是用信号量保护,是线程安全的,但是不可重入的(会导致死锁,譬如一个任
汇编语言:0号中断处理程序
assume cs:code code segment ;第一步:把中断向量表中0号表项的内容进行修改,使之指向我们自己编写 ;的中断处理程序的入口地址 start: mov ax,0 mov ds,ax mov word ptr ds:[0],0200h mov word ptr ds:[2],0 ;第三步,把我们刚才编写好的0号中断处理程序拷贝到中断向量表中 ;0号表项所指向的内存地址中0000:0200 mov ax,cs mov ds,ax mov si,offset int0 ;ds
《Linux内核设计与实现》学习笔记——中断、中断处理程序
中断和中断处理程序 中断随时可能产生,打断CPU的执行,CPU转而处理中断. 不同的设备对应的中断不同,每个中断都通过一个唯一的数字标志. 这些中断值称为中断请求(IRQ)线,每个irq线关联一个数值. 中断处理程序 响应中断时,内核会执行一个函数,中断处理程序/中断服务例程ISR, 一个设备的中断处理程序是他的设备驱动的一部分. IO资源包括 : 中断,I/O端口,共享RAM,DMA.驱动程序需要管理注册释放这些资源. 上半部:接收到中断就立即执行,只做有严格时限的工作,如对中断应答或复位硬件
TI CC2530基础实验(GPIO通用I/O中断操作——一个中断处理程序处理一个端口的多个中断)
有关CC2530的GPIO基本知识.普通GPIO操作有关寄存器的介绍.IAR Embedded Workbench IDE软件使用:TI CC2530基础实验(普通GPIO操作--点亮led灯) 有关CC2530通用I/O中断操作的基础知识.相关寄存器介绍:TI CC2530基础实验(GPIO通用I/O中断操作--按键控制灯的亮灭) 电路原理图: 程序: /************************************** * 基础实验只需要添加以下这个头文件即可 **********
13.linux中断处理程序
linux中断处理程序 一.中断处理流程 在linux内核代码中进入entry-armv.S目录: linux统一的入口:__irq svc. 进入了统一的入口之后,程序跳到irq_handler标号(在同一个文件上面有说明): 而irq_handler实际上是调用上面的arch_irq_handler_defualt.该代码在entry-macro-multi.S里面. 在这个中断处理程序中.最重要的是get_irqnr_and_base获取产生中断的中断源,搜索这个宏.这里以2410的为例(
【实战编程】编写0号中断处理程序
题目:编写0号中断处理程序,在除法溢出时,在屏幕中间显示字符串“hacker by admin!” 之前先补充一个rep movsb的指令知识 movsb和movsw是相反的,都是根据标志寄存器DF的值选择正向传递还是反向传递. 这两个指令都是把ds:si中的值传递到es:di的位置中去 如果df=0时,取正向移动.(inc si和di) 如果df=1时,取反向移动.(dec si和di) 由上可知,只需要改变si和di的值就可以选择正向还是反向 cld 指令 :使df=0:std 指令 :使d
《Linux内核设计与实现》之中断与中断处理程序
1.中断的概念 中断本质上是一种特殊的电信号,由硬件设备发向处理器.处理器接收到中断后,会马上向操作系统反映此信号的到来,然后就由OS负责处理这些新到来的信号. 从物理学的角度看,中断是一种电信号,有硬件设备产生,并直接送入中断控制器的输入引脚上.然后再由中断控制器向处理器发送相应的信号.处理器一经检测到此信号,便中断自己的当前工作转而处理中断.伺候处理器会通知操作系统已经产生中断,这样,操作系统就可以对这个中断进行适当的处理了. 不同的设备对应的中断不同,而每个中断都通过一个唯一的数字标识.这
驱动:中断【2】中断处理程序、中断上下文中处理延时及一些函数的调用规则(调IIC中断驱动有感)
中断处理程序.中断上下文中处理延时及一些函数的调用规则(调IIC中断驱动有感)http://blog.csdn.net/samantha_sun/article/details/6790492 1,中断处理程序中不能使用有睡眠功能的函数,如ioremap,kmalloc,msleep等,理由是中断程序并不是进程,没有进程的概念,因此就没有休眠的概念: 2,中断处理程序中的延时可以用忙等待函数来代替,如ndelay,udelay,mdelay等,这些函数在实现上本质是根据CPU频率进行一定 次数的
中断——中断处理程序的进入与退出(三) (基于3.16-rc4)
上一篇博文我们分析了中断描述符表的中断门初始化过程,并且在interrupt数组中初始化过程中,可以看到每个中断处理程序都会跳入common_interrupt中.下面我们分析下common_interrupt汇编片段(arch/x86/kernel/entrt_32.S). 1 .p2align CONFIG_X86_L1_CACHE_SHIFT 2 common_interrupt: 3 ASM_CLAC 4 addl $-0x80,(%esp) /* Adjust vector into