request_irq会执行中断函数么

时间:2022-01-23 04:15:40
各位大牛:
     我注册了中断函数:
printk(KERN_ERR "gpioc2: register irq start\n");
ret=request_irq(INT_GPIO_1, gpioc2_irq_interrupt,IRQF_SHARED,"gpioc2",(void *)(&am_gpio));
if (ret < 0) 
{
printk(KERN_ERR "GPIOC_2: request_irq failed, ret=%d.\n", ret);
return ret;
};
gpioc2_fiq_flag=1;
printk(KERN_ERR "gpioc2: register irq success\n");
中断函数是一行打印:
static irqreturn_t gpioc2_irq_interrupt(int irq, void *dev_id)
{
printk(KERN_ERR "I get a reset key!!!\n");
aml_set_reg32_bits(P_SYS_CPU_0_IRQ_IN2_INTR_STAT_CLR, 1, 1, 1); // Write 1 to clear irq
tasklet_schedule(&mytasklet);
return IRQ_HANDLED;
}

编译完成后,启动时发现注册时居然执行了中断函数:
[    7.191587@0] gpioc2: register irq start
[    7.195459@0] gpioc2: register irq success
[    7.199548@0] I get a reset key!!!
我屏蔽了中断也还是这样,怀疑是request_irq引起的,求大神指点

13 个解决方案

#1


把你的中断触发方式改一改

#2




引用 1 楼 zifehng 的回复:
把你的中断触发方式改一改

我用的是下降沿出发,我再request_irq前都把中断屏蔽了,还是会在注册的时候调用

#3


引用 2 楼 hqs3527 的回复:
Quote: 引用 1 楼 zifehng 的回复:

把你的中断触发方式改一改

我用的是下降沿出发,我再request_irq前都把中断屏蔽了,还是会在注册的时候调用
注册的时候INT_GPIO_1是否有下降沿变化

#4


IRQF_SHARED -> IRQF_TRIGGER_FALLING | IRQF_SHARED 

#5


1. 在哪里disable和enable的中断?
2. 根据输出,中断函数是在打印 register irq success之后,也就是request_irq之后,为啥说是在request_irq中执行的?

#6


申请中断成功后内核会调用一次中断服务函数

#7


若使用共享中断,那么中断处理函数自身需要能识别是否是自己的设备产 生了中断
发生中断时,内核并不判断究竟是共享中断线上的哪个设备产生了中断,它会循环 执行所有该中断线上注册的中断处理函数

#8


这个可以不用管,我遇到过加载驱动调用打开关闭函数的,不知道内核抽什么风,我也研究了许久,没啥发现,只能归结位内核安全检查之类的

#9


函数本身不会引起中断的触发。

但注册前,最好保证中断标志位是清零的,或者没有什么触发。

#10


必定是符合中断条件了才进入ISR的。在注册中断ISR之前,应该要clear相关状态register。

#11


瞅了后面的回复才明白啥意思,原来描述的是 申请注册中断成功,没有硬件处罚但是却调用了中断响应函数???我觉得你还是把IRQF_SHARED 改改试试,这现象还真没遇到过

#12


该回复于2015-06-29 08:47:02被管理员删除

#13


老贴了。  应该要在中断处理函数里判断下,是GPIO1里具体哪个IO的中断。

#1


把你的中断触发方式改一改

#2




引用 1 楼 zifehng 的回复:
把你的中断触发方式改一改

我用的是下降沿出发,我再request_irq前都把中断屏蔽了,还是会在注册的时候调用

#3


引用 2 楼 hqs3527 的回复:
Quote: 引用 1 楼 zifehng 的回复:

把你的中断触发方式改一改

我用的是下降沿出发,我再request_irq前都把中断屏蔽了,还是会在注册的时候调用
注册的时候INT_GPIO_1是否有下降沿变化

#4


IRQF_SHARED -> IRQF_TRIGGER_FALLING | IRQF_SHARED 

#5


1. 在哪里disable和enable的中断?
2. 根据输出,中断函数是在打印 register irq success之后,也就是request_irq之后,为啥说是在request_irq中执行的?

#6


申请中断成功后内核会调用一次中断服务函数

#7


若使用共享中断,那么中断处理函数自身需要能识别是否是自己的设备产 生了中断
发生中断时,内核并不判断究竟是共享中断线上的哪个设备产生了中断,它会循环 执行所有该中断线上注册的中断处理函数

#8


这个可以不用管,我遇到过加载驱动调用打开关闭函数的,不知道内核抽什么风,我也研究了许久,没啥发现,只能归结位内核安全检查之类的

#9


函数本身不会引起中断的触发。

但注册前,最好保证中断标志位是清零的,或者没有什么触发。

#10


必定是符合中断条件了才进入ISR的。在注册中断ISR之前,应该要clear相关状态register。

#11


瞅了后面的回复才明白啥意思,原来描述的是 申请注册中断成功,没有硬件处罚但是却调用了中断响应函数???我觉得你还是把IRQF_SHARED 改改试试,这现象还真没遇到过

#12


该回复于2015-06-29 08:47:02被管理员删除

#13


老贴了。  应该要在中断处理函数里判断下,是GPIO1里具体哪个IO的中断。