2.6下用request_irq引起的问题

原文地址:http://blog.sina.com.cn/s/blog_637deacd0106dfmv.html

奇怪的是在2.6用request_irq时发现好几个问题
我引入的头文件如下:
#include
#include
#include
#include
#include

1、不认识SA_INTERRUPT,会提示 implicite declartion of SA_INTERRUPT
后来发现2.6下没有对SA_INTERRUPT的宏定义,而在2.4下定义为0x20000000。但是若在request_irq时直接用0x20000000时则可以用,而且成功后返回值为0
但是我在2.6下用哪个中断标志比较好呢?

2、编译的时候提示一个警告:
warning: passing argument 2 of ‘request_irq’ from incompatiblepointer type

3、运行时触发中断时发生:
irq event 126: bogus return value b0043000
Call Trace:
[ <8002043c>] dump_stack+0x8/0x34
[ <80072314>] __report_bad_irq+0x44/0xd8
[ <800726f0>] note_interrupt+0x348/0x3c8
[ <800714d4>] __do_IRQ+0x164/0x1a4
[ <800115e0>] plat_irq_dispatch+0x268/0x288
[ <80019340>] ret_from_irq+0x0/0x4
[ ] MACTasks+0xf54/0x28b4 [zigbee]
[ ] ZigBeeTasks+0x1d8/0x43c [zigbee]
[ ] testRfd+0xb0/0xca8 [zigbee]
[ ] uspi_ioctl+0x18/0x30 [zigbee]
[ <800bea34>] do_ioctl+0xc4/0xd4
[ <800beab8>] vfs_ioctl+0x74/0x3d4
[ <800bee68>] sys_ioctl+0x50/0x98
[ <80022670>] stack_done+0x20/0x3c

handlers:
[ ] (HighISR+0x0/0x474 [zigbee])

 

关于问题1,这个是中间过渡版本里的定义,自从2.6.24后就被remove了。你可以用对应的现在的宏,IRQF_DISABLED
原来以SA_开头的定义很不好,跟信号容易混到一块。
还有SA_INTERRUPT指的是快速中断也不明显,现在意思清楚了很多。
+
+#define SA_INTERRUPT        IRQF_DISABLED
+#define SA_SAMPLE_RANDOM     IRQF_SAMPLE_RANDOM
+#define SA_SHIRQ            IRQF_SHARED
+#define SA_PROBEIRQ          IRQF_PROBE_SHARED

 

关于问题2,请检查你用的内核源码中request_irq函数的原形,看看与你程序中使用的request_irq函数参数类型是否一致,我记得是改动过。
如果不相同最好修改程序中的定义方式,改动很小,很容易。

关于2, 参数strcut pt_regs 去掉了,因为没有用。

irqreturn_t (*handler)(int, void *, struct pt_regs *)
int request_irq(unsigned int irq, irqreturn_t (*handler)(int, void*, struct pt_regs *),
              unsigned long flags, constchar *dev_name, void *dev_id);

变为
typedef irqreturn_t (*irq_handler_t)(int, void *);
int request_irq(unsigned int irq, irq_handler_t handler,
              unsigned long irqflags, constchar *devname, void *dev_id)

 

关于问题3,你的中断处理函数 有没有类似这样的返回 

    return IRQ_HANDLED;


从你的log看来是这样的,你check一下:
irq event 126: bogus return value b0043000
Call Trace:
[ <8002043c>] dump_stack+0x8/0x34
[ <80072314>] __report_bad_irq+0x44/0xd8

static void
__report_bad_irq(unsigned int irq, struct irq_desc *desc,
              irqreturn_t action_ret)
{
       struct irqaction *action;
                                                                                                     
       if (action_ret != IRQ_HANDLED &&action_ret != IRQ_NONE) {
              printk(KERN_ERR "irq event%d: bogus return value %x/n",
                           irq, action_ret);
       } else {
              printk(KERN_ERR "irq %d:nobody cared (try booting with "
                           "the /"irqpoll/" option)/n", irq);
       }

 

原来是在2.6下中断处理函数一定要有返回值(0或1),而在2.4下则没有要求!


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值