linux中断响应延迟时间

zhoujiawen 2010-10-25 11:17:21
这两天调试模拟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等几种
有啥区别啊
...全文
598 点赞 收藏 2
写回复
2 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
zhoujiawen 2010-10-25
[Quote=引用楼主 zhoujiawen 的回复:]
这两天调试模拟PS2控制器接收PC键盘,误码率很高,

键盘发送的clock周期为高40us低40us,
采用下降沿中断,但是调试发现,在linux调用中断服务函数时,已经过了38us,只剩下2us读data口线,误码率肯定会比较高,有没有什么机制提升linux的中断响应时间,
//注册中断
if (request_irq(LPC22XX_GPIO_VECTOR,
lpc24xx_p……
[/Quote]

键盘发送clock信号给linux,周期是高低40us的clock,linux驱动设置成下降沿中断,
在内核调用驱动函数中的中断服务函数入口处取反测试口线,通过示波器跟踪,已经越过
clock信号下降沿38us

程序中没有算时间啊,clock是PS2设备发的,40us周期是示波器量出来的
回复
pottichu 2010-10-25
示波器量到的电平变化的时间才算准的。 程序算出来是不准的,
或者你通过控制某个 io 口的变化来查看时间也是不对的。

所以问题并不在于中断的响应时间。
回复
相关推荐
发帖
Linux_Kernel
创建于2007-08-27

4156

社区成员

Linux/Unix社区 内核源代码研究区
申请成为版主
帖子事件
创建了帖子
2010-10-25 11:17
社区公告
暂无公告