linux 内核对中断标志的处理(SRCPND 清除)分析
2009-03-10 08:41
549 查看
我所使用的内核是2.4.20-8。问题出现在request_irq后立即产生中断,分析后发现原因是上次的中断申请标志没有被清除所导致的。经过查看源代码(如代码段1.0)发现只有在 do_IRQ(……)函数中清除中断标志,而这个函数是中断开放时才被调用。因此我们不能忽略申请中断后,所产生的每一次中断。
那么上面我们遇到的问题该怎么解决呢?
方法一:在调用request_irq()之前,调用enable_irq()开放中断。让系统的默认中断处理,处理掉这个要丢弃的中断。
方法二:对寄存器SRCPND直接进行清除操作,从2410的手册中我们可以知道,只要往对应位写入1就可以将其清零。
代码段 1.0 static void s3c2410_mask_ack_irq(unsigned int irq) { INTMSK |= (1 << irq); SRCPND = (1 << irq); INTPND = (1 << irq); } for (irq=0; irq < NORMAL_IRQ_OFFSET; irq++) { irq_desc[irq].valid = 1; irq_desc[irq].probe_ok = 1; irq_desc[irq].mask_ack = s3c2410_mask_ack_irq; irq_desc[irq].mask = s3c2410_mask_irq; irq_desc[irq].unmask = s3c2410_unmask_irq; } asmlinkage void do_IRQ(……) { ………… spin_lock(&irq_controller_lock); desc->mask_ack(irq); spin_unlock(&irq_controller_lock); ………… }
那么上面我们遇到的问题该怎么解决呢?
方法一:在调用request_irq()之前,调用enable_irq()开放中断。让系统的默认中断处理,处理掉这个要丢弃的中断。
方法二:对寄存器SRCPND直接进行清除操作,从2410的手册中我们可以知道,只要往对应位写入1就可以将其清零。
相关文章推荐
- linux 内核对中断标志的处理(SRCPND 清除)分析
- Linux内核分析课程--分析system_call中断处理过程
- Linux内核分析课程5_system_call中断处理过程
- Linux内核中断处理体系分析
- Linux内核分析5:分析system_call中断处理过程
- Linux系统内核分析实验——system_call中断处理过程
- linux EHCI DRIVER之中断处理函数ehci_irq()分析(二)
- linux-3.2.36内核启动1-启动参数(arm平台 启动参数的获取和处理,分析setup_arch)
- Linux中断处理体系结构分析(一)
- 《Linux操作系统分析》之分析精简的Linux的内核中断和时间片轮询
- Linux0.11内核--系统中断处理程序int 0x80实现原理
- linux EHCI DRIVER之中断处理函数ehci_irq()分析(一)
- LINUX内核设计思想之中断和中断处理程序
- Linux-2.6 open()打开文件涉及的内核处理和数据结构分析 http://blog.csdn.net/ordeder/article/details/24420637
- 从Unix分层内核栈以及中断处理看Linux内核的另类
- linux内核中断 ----- tasklet 分析 .
- arm-Linux中断处理体系结构与处理流程分析
- linux内核中断处理
- Linux内核分析:中断和异常(1)
- linux EHCI DRIVER之中断处理函数ehci_irq()分析(一)