linux中断响应延迟时间
这两天调试模拟PS2控制器接收PC键盘,误码率很高,
键盘发送的clock周期为高40us低40us,
采用下降沿中断,但是调试发现,在linux调用中断服务函数时,已经过了38us,只剩下2us读data口线,误码率肯定会比较高,有没有什么机制提升linux的中断响应时间,
//注册中断
if (request_irq(LPC22XX_GPIO_VECTOR,
lpc24xx_ps2_interrupt, IRQF_DISABLED, "Keyboard",
NULL)) {
printk(KERN_ERR "Keyboard Init: Unable to get IRQ.\n");
return -EBUSY;
}
static irqreturn_t lpc24xx_ps2_interrupt(int irq, void *dev_id)
{
int i=0;
unsigned char dt=0;
//if (!CLCKSTATUS()) {
//if (!CLCKSTATUS()) {
if (DATASTATUS()) dt=0x80;
else dt=0;
TEST(); //测试,IO口取反,到此处时,已经过了38us,下降沿中断,只能接收低40us
//(KeyData.App.State) ? (SendDataToDevice(dt)) : (DealKeyData(dt));
//}
//}
IO2_INT_CLR = PS2_CLCK; /* ÇåÁãP0.12ÖÐ¶Ï */
return IRQ_HANDLED;
}
arch中的中断初始化
set_irq_handler(irq, handle_level_irq);
if(irq >= LPC22xx_INTERRUPT_EINT0 && irq <= LPC22xx_INTERRUPT_EINT3)
set_irq_flags(irq, IRQF_VALID | IRQF_PROBE | IRQF_NOAUTOEN);
else
set_irq_flags(irq, IRQF_VALID | IRQF_PROBE);
用了handle_level_irq这个,我发现kernel中,还有handle_edge_irq,handle_fastio_irq等几种
有啥区别啊