作者askacis (ASKA)
看板LinuxDev
标题Re: [问题] enable_irq / disable balance.
时间Sat May 5 20:02:46 2012
一点心得,有错请指正^^;
我使用的平台是ARM, kernel版本是2.6.21
enable_irq / disable_irq函式的实作在:
kernel_source/kernel/irq/manage.c
看到disable_irq()里面又呼叫disable_irq_nosync()
void disable_irq(unsigned int irq)
{
.....
disable_irq_nosync(irq);
.....
}
//disable_irq_nosync这个函式会对desc->depth做++的动作
//所以连呼叫两次disable_irq()会使desc->depth的值变成2
void disable_irq_nosync(unsigned int irq)
{
.....
spin_lock_irqsave(&desc->lock, flags);
if (!desc->depth++) {
.....
}
.....
}
//再来看enable_irq()
//这个函式会判断desc->depth的值
//假设呼叫两次disable_irq之後我们只呼叫一次enable_irq,
//因为此时desc->depth为2,所以不会进到case 1去打开中断
//只会到default里面进行desc->depth--
//而如果一开始就呼叫enable_irq而不呼叫diable_irq
//则会进到case 0去印Unbalanced enable for IRQ的讯息
//可见在kernel的设计里,disable_irq/enable_irq是要成对出现的
void enable_irq(unsigned int irq)
{
.....
switch (desc->depth) {
case 0:
printk(KERN_WARNING "Unbalanced enable for IRQ %d\n", irq);
WARN_ON(1);
break;
case 1: {
unsigned int status = desc->status & ~IRQ_DISABLED;
/* Prevent probing on this irq: */
desc->status = status | IRQ_NOPROBE;
check_irq_resend(desc, irq);
/* fall-through */
}
default:
desc->depth--;
}
.....
}
※ 引述《eleghost (eleghost)》之铭言:
: 在 arm 平台环境.
: 请问 enable_irq / disable_irq是否一定要平衡?
: 意思是说如果disable_irq一次, 可用enable_irq
: 重新唤起irq.
: 但如果今日调用disable_irq两次, 但只enable_irq一次
: 则无法唤起. 一定要在调用一次enable_irq才能使
: irq工作.
: 这是kernel设定吗? 可以改变吗? thanks.
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 175.181.129.228