免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1933 | 回复: 5
打印 上一主题 下一主题

有关驱动中,中断的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-06-01 16:47 |只看该作者 |倒序浏览
一个小驱动,要接收一组8个中断,然后这8个中断组成一个字节,送出去。

经过测试,发现经常会发生数据丢失的问题,想请教各位,这种情况该如何处理才会更可靠。
下面是我的中断处理源代码,问题是经常会出现:比如就接收了7个中断!
  1. static void spi_drv_interrupt(int irq, void *dev_id, struct pt_regs *regs)

  2. {
  3.         disable_irq(IRQ_EINT2);
  4.         if ((GPEDAT & (1 << 12)) != 0)
  5.                 dataTemp |= (0x01 << number);
  6.         number++;
  7.         if (8 == number) {
  8.                 data[readNum] = dataTemp;
  9.         }
  10.         enable_irq(IRQ_EINT2);       
  11. }
复制代码

论坛徽章:
0
2 [报告]
发表于 2010-06-01 17:12 |只看该作者
本帖最后由 readkernel 于 2010-06-01 17:14 编辑

static void spi_drv_interrupt(int irq, void *dev_id, struct pt_regs *regs)



{

        disable_irq(IRQ_EINT2);

        if ((GPEDAT & (1 << 12)) != 0)

                dataTemp |= (0x01 << number);

        number++;

        if (8 == number) {

                data[readNum++] = dataTemp;

               if(readNum>??)
                    readNum = ??;
               number = 0;
               dataTemp = 0;

        }

        enable_irq(IRQ_EINT2);        

}

data[readNum] ??这个

论坛徽章:
0
3 [报告]
发表于 2010-06-01 17:43 |只看该作者
呵呵,我简写了,是这样的,没错
data[readNum] = dataTemp;
if (50 == (readNum++) )
        readNum = 0;
        dataTemp = 0;
        number = 0;

我想问的是中断发生次数和真实的,有时候对不上,
/proc/interrupts中此中断应该是一组一组的(每组8个),但经测试发现,有时候会收到7个,少了一个

论坛徽章:
0
4 [报告]
发表于 2010-06-01 17:50 |只看该作者
硬件产生中断,两次之间间隔多少时间?太快超过CPU响应的时间就会丢

论坛徽章:
0
5 [报告]
发表于 2010-06-01 18:04 |只看该作者
外部中断数据来源用的是单片机,12M /128,时间足够长

论坛徽章:
0
6 [报告]
发表于 2010-06-01 23:43 |只看该作者
如果是发送的话,稍微好弄点,可以加个定时器啥的。

接收比较麻烦 ,因为驱动也不知道啥时会来个中断?还是可以预测的?

硬件没有啥BUFFER可以POLL一下的么?如果有,可以在每个中断里面读下那个BUFFER。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP