我有一个要求,我需要计算1秒钟内发生的中断数。 我打算采用以下方法
过程上下文:
atomic_set(&irq_enblflg, 1);
//enable IRQ flg and sleep for 1 sec.
mdelay(1000);//maybe we can look for altenative later on
atomic_set(&irq_enblflg, 0);
中断上下文:
static irqreturn_t tach_isr(int irq, void *d)
{
//printk(KERN_CRIT "ISR#########\n");
if (atomic_read(&irq_enblflg)) {
pulse++;
}
return IRQ_HANDLED;
}
每当我要计算脉冲数时,我将启用irq_enblflg
并从过程上下文中休眠1秒钟。
有人可以评论在进程上下文中休眠是计算秒内中断数的正确方法还是有更好的方法吗?
答案 0 :(得分:0)
好吧,这取决于atomic_read
的实现是否会暂停您的中断代码,以等待共享变量的可用性。如果发生这种情况,您将在中断代码中锁定并禁用中断,这很危险。
通常,如果您禁用代码块中的中断,则关联的中断将不会在该共享区域中发生,因此通常只需要禁用中断,访问共享数据然后重新启用中断就可以了。在中断代码中,您不需要执行任何操作,因为中断不会在共享阻塞代码的中间发生,因此您只需在执行中断代码时检查共享变量的值即可,因此无需执行任何操作新中断出现并修改变量的可能性(中断代码中未发生的事情)
阻塞中断处理程序是个坏主意,您只能在FreeBSD中执行此操作,例如在FreeBSD中,中断处理程序与上下文一起运行(作为进程),或者当您具有某种自旋锁的方式(繁忙等待时,在循环中) ),因此您可以等待,但不必离开上下文,因为中断通常在它们所中断的进程的上下文中运行。