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等几种
有啥区别啊
...全文
1051 2 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
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 口的变化来查看时间也是不对的。

所以问题并不在于中断的响应时间。

4,465

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 内核源代码研究区
社区管理员
  • 内核源代码研究区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧