免费注册 查看新帖 |

Chinaunix

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

这个中断怎么了? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-06-18 12:22 |只看该作者 |倒序浏览
1. 我正在调试一个驱动程序,里面包含了一个外部中断。现在该外部中断有响应,但是响应得很怪。不知道是哪里的原因。望大家指教。
2. 加载模块
   insmod cc2420_send.ko
3. 中断响应:
  1. scl_CC2420 interrupt, at pin 67
  2. irq event 67: bogus return value 17
  3. [<c0027dfc>] (dump_stack+0x0/0x14) from [<c00614ac>] (__report_bad_irq+0x38/0x9)[<c0061474>] (__report_bad_irq+0x0/0x94) from [<c0061580>] (note_interrupt+0x78) r4:c02efb94
  4. [<c0061508>] (note_interrupt+0x0/0x26c) from [<c00622b4>] (handle_edge_irq+0x12)[<c0062194>] (handle_edge_irq+0x0/0x144) from [<c0038ab0>] (s3c_irq_demux_extin) r6:c0315a98 r5:00000015 r4:00000000
  5. [<c0038a20>] (s3c_irq_demux_extint8+0x0/0xa4) from [<c0023044>] (asm_do_IRQ+0x4) r4:c02ef184
  6. [<c0023000>] (asm_do_IRQ+0x0/0x5c) from [<c0023a44>] (__irq_svc+0x24/0xa0)
  7. Exception stack(0xc02e5f54 to 0xc02e5f9c)
  8. 5f40:                                              c306ee20 ffffffff f410000c
  9. 5f60: 80000013 c00249cc c02e4000 c001ff28 c02e7c78 3001e64c 41129200 3001e618
  10. 5f80: c02e5fa8 c02e5f9c c02e5f9c c0024a2c c0024a38 80000013 ffffffff
  11. r7:c02e7c78 r6:00000020 r5:f4000000 r4:ffffffff
  12. [<c00249cc>] (default_idle+0x0/0x78) from [<c0024a8c>] (cpu_idle+0x48/0x64)
  13. [<c0024a44>] (cpu_idle+0x0/0x64) from [<c023501c>] (rest_init+0x50/0x60)
  14. r5:c02ffda8 r4:c0313fdc
  15. [<c0234fcc>] (rest_init+0x0/0x60) from [<c0008930>] (start_kernel+0x27c/0x2e4)
  16. [<c00086b4>] (start_kernel+0x0/0x2e4) from [<30008034>] (0x30008034)
  17. handlers:
  18. [<bf00822c>] (basicRfRecvPacket+0x0/0x840 [cc2420_send])
复制代码
4. 中断初始化的代码
  1. gpiovalue = (~(EINT8_23)) & ioread32(S3C2410_INTMOD);^M
  2.         iowrite32(gpiovalue, S3C2410_INTMOD);   // IRQ^M
  3.         ^M
  4.         // Enable EINT8_23 interrupt^M
  5.         gpiovalue = ioread32(S3C2410_INTMSK);^M
  6. #ifdef _DEBUG^M
  7.         printk("S3C2410_INTMSK(before) = %X\n", gpiovalue);^M
  8. #endif^M
  9.         gpiovalue &= (~(EINT8_23));             ^M
  10.         iowrite32(gpiovalue, S3C2410_INTMSK);   ^M
  11. #ifdef _DEBUG^M
  12.         printk("S3C2410_INTMSK(after) = %X\n",ioread32(S3C2410_INTMSK));^M
  13. #endif^M
  14. ^M
  15.         // enable FIFOP interrupt^M
  16.         gpiovalue = ioread32(S3C2410_EINTMASK);^M
  17.         gpiovalue &= (~(1<<23));^M
  18.         iowrite32(gpiovalue, S3C2410_EINTMASK);          ^M
  19. #ifdef _DEBUG^M
  20.         printk("S3C2410_EINTMASK = %X\n",ioread32(S3C2410_EINTMASK));^M
  21. #endif^M
  22. ^M
  23.         // setting the external interrupt triggered format^M
  24.         //gpiovalue = ioread32(rEXINT2)&(~(0xFF00F000));^M
  25. #ifdef _DEBUG^M
  26.         printk("rEXINT2(before) = 0X%X\n",gpiovalue);^M
  27. #endif^M
  28.         //gpiovalue |= INTTRI_FIFOP; // | INTTRI_FIFO | INTTRI_EINT11;^M
  29.         gpiovalue=0x40000000;^M
  30.         iowrite32(gpiovalue,rEXINT2);^M
  31. #ifdef _DEBUG^M
  32.         printk("rEXINT2 = 0X%X\n",ioread32(rEXINT2));^M
  33. #endif
  34.         DISABLE_FIFOP_INT();
复制代码
5. 注册中断的代码:
  1. reval = request_irq(IRQ_EINT23, basicRfRecvPacket, SA_INTERRUPT, SPI_NAME, NULL);^M
  2.         if (reval)^M
  3.         {^M
  4. #ifdef  _DEBUG ^M
  5.         printk(KERN_ALERT "request_irq IRQ_EINT23 failed\n");^M
  6. #endif          ^M
  7.            }
复制代码
6. 中断子程序:
  1. static irqreturn_t basicRfRecvPacket(int irq, void * dev_id)^M
  2. {^M
  3.         u8 length;^M
  4.         u16 fcf, sequence, PanId, destAddr, srcAddr, rssi;^M
  5. //#ifdef  _DEBUG ^M
  6.     printk(KERN_ALERT "\nmscl_CC2420 interrupt, at pin %d\n", irq);^M
  7. //#endif    ^M
  8.         DISABLE_FIFOP_INT();^M
  9. ^M
  10.         // check if RXFIFO is overflow^M
  11.         if (FIFOP_IS_1 && FIFO_IS_1)^M
  12.         {^M
  13.                 FASTSPI_STROBE(CC2420_SFLUSHRX);^M
  14.                 DELAY(100);^M
  15.                 FASTSPI_STROBE(CC2420_SFLUSHRX);^M
  16.                 DELAY(100);^M
  17.                 ENABLE_FIFOP_INT();^M
  18.                 return;^M
  19.         }^M
  20.         FASTSPI_READ_FIFO_BYTE(length); ^M
  21.         FASTSPI_READ_FIFO_NO_WAIT(&fcf, 2);^M
  22.         FASTSPI_READ_FIFO_NO_WAIT(&sequence, 2);^M
  23.         FASTSPI_READ_FIFO_NO_WAIT(&PanId, 2);^M
  24.         FASTSPI_READ_FIFO_NO_WAIT(&destAddr, 2);^M
  25.         FASTSPI_READ_FIFO_NO_WAIT(&srcAddr, 2);^M
  26.         FASTSPI_READ_FIFO_NO_WAIT(pRxBuffer, 4);^M
  27.         FASTSPI_READ_FIFO_NO_WAIT(&rssi, 2);^M
  28.         //#ifdef _DEBUG^M
  29.         printk("-- Length = 0x%X\n", length);^M
  30.         printk("-- fcf = 0x%X\n", fcf);^M
  31.         printk("-- sequence = 0x%X\n", sequence);^M
  32.         printk("-- PanId = 0x%X\n", PanId);^M
  33.         printk("-- destAddr = 0x%X\n", destAddr);^M
  34.         printk("-- srcAddr = 0x%X\n", srcAddr);^M
  35.         printk("-- pRxBuffer = %s\n", pRxBuffer);^M
  36.         printk("-- rssi = %d\n", rssi);^M
  37. //#endif^M
  38.         // for test, these two pins will immediately go low when all datas have been received ^M
  39.         while (FIFO_IS_1||SFD_IS_1) ;^M
  40.         if (FIFOP_IS_1 && FIFO_IS_1)^M
  41.         {^M
  42.                 FASTSPI_STROBE(CC2420_SFLUSHRX);^M
  43.                 DELAY(1);^M
  44.                 FASTSPI_STROBE(CC2420_SFLUSHRX);^M
  45.                 DELAY(1);^M
  46.                 ENABLE_FIFOP_INT();^M
  47.                 return;         ^M
  48.         }^M
  49.         ENABLE_FIFOP_INT();^M
  50. }^M
复制代码

论坛徽章:
0
2 [报告]
发表于 2010-06-18 21:05 |只看该作者
既然能响应中断就说明中断初始化和注册中断没问题。抓住中断子程序这个主要矛盾仔细琢磨。2.6.24内核中断在响应以后是需要return IRQ_HANDLED (定义为1) 或 IRQ_NONE (定义为0)的.所以, 在static irqreturn_t basicRfRecvPacket(int irq, void * dev_id)中的所有 return后面应该加上返回值即 IRQ_HANDLED.
问题解决.

论坛徽章:
0
3 [报告]
发表于 2010-06-18 22:22 |只看该作者
既然能响应中断就说明中断初始化和注册中断没问题。抓住中断子程序这个主要矛盾仔细琢磨。2.6.24内核中断在 ...
lixiaogang11021 发表于 2010-06-18 21:05



书里面讲,c语言中的中断处理函数既没有参数,又没有返回值,而且这是编译器的特性,为什么在linux-2.6.24却可以突破编译器的要求呢

论坛徽章:
0
4 [报告]
发表于 2010-06-18 22:31 |只看该作者
那只能是书里面讲错了。

论坛徽章:
0
5 [报告]
发表于 2010-06-22 11:02 |只看该作者
也不能说书里错了。只是里面的东西太教条化了,忽略了操作系统这个东西。

其实我们平常写的中断处理函数,都是被操作系统提供的中断调用的函数。所以是可以有参数和返回值的。
但是操作系统本身最基本的中断,还是不能有参数和返回值的。

论坛徽章:
0
6 [报告]
发表于 2010-06-22 12:40 |只看该作者
回复 5# star1983653


    {:3_180:} 正解
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP