我引入的头文件如下:
#include <linux/kernel.h>
#include <linux/sched.h>
#include <linux/irq.h>
#include<linux/interrupt.h>
#include<linux/signal.h>
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 incompatible pointer 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
[<c05ab700>] MACTasks+0xf54/0x28b4 [zigbee]
[<c05a93c8>] ZigBeeTasks+0x1d8/0x43c [zigbee]
[<c05b0a58>] testRfd+0xb0/0xca8 [zigbee]
[<c05b1688>] 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:
[<c05a98a0>] (HighISR+0x0/0x474 [zigbee])
以上三个问题在网上好像说的人也不多,没有看明白,特地来向大家讨教。谢谢!
8 个解决方案
#1
这个是中间过渡版本里的定义,自从2.6.24后就被remove了。 你可以用对应的现在的宏,IRQF_DISABLED
原来以SA_开头的定义很不好,跟信号容易混到一块。
还有SA_INTERRUPT指的是快速中断也不明显,现在意思清楚了很多。
+/*
+ * Migration helpers. Scheduled for removal in 1/2007
+ * Do not use for new code !
+ */
+#define SA_INTERRUPT IRQF_DISABLED
+#define SA_SAMPLE_RANDOM IRQF_SAMPLE_RANDOM
+#define SA_SHIRQ IRQF_SHARED
+#define SA_PROBEIRQ IRQF_PROBE_SHARED
原来以SA_开头的定义很不好,跟信号容易混到一块。
还有SA_INTERRUPT指的是快速中断也不明显,现在意思清楚了很多。
+/*
+ * Migration helpers. Scheduled for removal in 1/2007
+ * Do not use for new code !
+ */
+#define SA_INTERRUPT IRQF_DISABLED
+#define SA_SAMPLE_RANDOM IRQF_SAMPLE_RANDOM
+#define SA_SHIRQ IRQF_SHARED
+#define SA_PROBEIRQ IRQF_PROBE_SHARED
#2
关于问题2,请检查你用的内核源码中request_irq函数的原形,看看与你程序中使用的request_irq函数参数类型是否一致,我记得是改动过。
如果不相同最好修改程序中的定义方式,改动很小,很容易。
如果不相同最好修改程序中的定义方式,改动很小,很容易。
#3
关于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, const char *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, const char *devname, void *dev_id)
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, const char *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, const char *devname, void *dev_id)
#4
:)
谢谢楼上的各位,第一二个已经解决!
那第三个错误怎么办呢???
~~~~~~~~~~~~~
谢谢楼上的各位,第一二个已经解决!
那第三个错误怎么办呢???
~~~~~~~~~~~~~
#5
你的中断处理函数 有没有类似这样的返回
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);
}
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);
}
#6
对,确实有您说的错误,
谢谢,楼上的朋友,那有什么办法解决吗?
我用的是request_irq注册的硬中断,是由于这个引起的么?
2.6用哪种方式注册中断比较好呢?
谢谢,楼上的朋友,那有什么办法解决吗?
我用的是request_irq注册的硬中断,是由于这个引起的么?
2.6用哪种方式注册中断比较好呢?
#7
呵,谢谢楼上的朋友们的提示,都搞定了,原来是在2.6下中断处理函数一定要有返回值(0或1),而在2.4下则没有要求!
结贴给分了!
结贴给分了!
#8
非常感谢楼上的朋友,让我解决了一个调试了一个月的问题
#1
这个是中间过渡版本里的定义,自从2.6.24后就被remove了。 你可以用对应的现在的宏,IRQF_DISABLED
原来以SA_开头的定义很不好,跟信号容易混到一块。
还有SA_INTERRUPT指的是快速中断也不明显,现在意思清楚了很多。
+/*
+ * Migration helpers. Scheduled for removal in 1/2007
+ * Do not use for new code !
+ */
+#define SA_INTERRUPT IRQF_DISABLED
+#define SA_SAMPLE_RANDOM IRQF_SAMPLE_RANDOM
+#define SA_SHIRQ IRQF_SHARED
+#define SA_PROBEIRQ IRQF_PROBE_SHARED
原来以SA_开头的定义很不好,跟信号容易混到一块。
还有SA_INTERRUPT指的是快速中断也不明显,现在意思清楚了很多。
+/*
+ * Migration helpers. Scheduled for removal in 1/2007
+ * Do not use for new code !
+ */
+#define SA_INTERRUPT IRQF_DISABLED
+#define SA_SAMPLE_RANDOM IRQF_SAMPLE_RANDOM
+#define SA_SHIRQ IRQF_SHARED
+#define SA_PROBEIRQ IRQF_PROBE_SHARED
#2
关于问题2,请检查你用的内核源码中request_irq函数的原形,看看与你程序中使用的request_irq函数参数类型是否一致,我记得是改动过。
如果不相同最好修改程序中的定义方式,改动很小,很容易。
如果不相同最好修改程序中的定义方式,改动很小,很容易。
#3
关于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, const char *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, const char *devname, void *dev_id)
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, const char *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, const char *devname, void *dev_id)
#4
:)
谢谢楼上的各位,第一二个已经解决!
那第三个错误怎么办呢???
~~~~~~~~~~~~~
谢谢楼上的各位,第一二个已经解决!
那第三个错误怎么办呢???
~~~~~~~~~~~~~
#5
你的中断处理函数 有没有类似这样的返回
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);
}
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);
}
#6
对,确实有您说的错误,
谢谢,楼上的朋友,那有什么办法解决吗?
我用的是request_irq注册的硬中断,是由于这个引起的么?
2.6用哪种方式注册中断比较好呢?
谢谢,楼上的朋友,那有什么办法解决吗?
我用的是request_irq注册的硬中断,是由于这个引起的么?
2.6用哪种方式注册中断比较好呢?
#7
呵,谢谢楼上的朋友们的提示,都搞定了,原来是在2.6下中断处理函数一定要有返回值(0或1),而在2.4下则没有要求!
结贴给分了!
结贴给分了!
#8
非常感谢楼上的朋友,让我解决了一个调试了一个月的问题