2.6下用request_irq引起的问题

Linux中断——request_irq 目录 linux 中断之irq 前言 中断注册与释放 irq相关 查看/proc/interrupts 查看/proc/stat IRQ Number问题 Handler相关 flag相关 linux 中断之irq 前言 前面一篇文章已经对中断做了一些简单介绍《关于Linux中断一些思考》,但是中断是怎么告诉内核(kernel)的呢?这里我们带着问题去了解一下irq的调用。 所谓中断它其实是硬件产生了一个信号,然后告诉内核要去处理它。Linux处理中断很像用户空间(user . 阅读详情

奇怪的是在2.6用request_irq时发现好几个问题
我引入的头文件如下:
#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])

 

关于问题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

 

关于问题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, 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)

 

关于问题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下则没有要求!

 

 

Linux源代码阅读:request_irq() 本文尝试阅读Linux kernel 5.0 + ARM64上中断申请过程的源代码,但并非逐字逐句地解析,只是梳理一些关键点(在工作中经常可能会用到的知识点)。 为了提升Linux的实时性,kernel引入了中断线程化概念。其实就是将中断的下半部放在内核线程(FIFO,也称实时进程)中执行,这样可以减少中断对高优先级进程的饥饿感。因为传统的中断上半部执行完成后,需要通过tasklet,或者softirq来执行中断下半部,这些都属于中断上下文,会被内核优先处理,这样就会导致进程产生饥饿,即使是优先级比较高的 阅读详情

相关推荐

电路仿真软件PSIM简介

PSIM的基本使用操作...

qq_55203246的博客 7037

linux编译断开,编写Linux中断驱动时,由于头文件缺失引起的编译错误

内核版本:2.6.39错误:error:implicit declaration of function 'request_irq'error:implicit declaration of function 'free_irq'解决方法:#include 错误:error: 'IRQT_BOTHEDGE' undeclared (first use in this function)解决方法:#...

weixin_39961522的博客 510

Android 12.0 framework系统修改安兔兔等显示的屏幕尺寸大小功能实现

在12.0的系统rom定制化开发中,在使用第三方app检测系统的一些信息中,比如安兔兔 设备信息等检测app中,有时候显示的屏幕尺寸大小和 产品规格书等信息不同,稍微有些差异,所以就需要看下系统framework层中,相关的设备信息是怎么读出来的,然后做些调整 接下来就来分析相关功能

安卓兼职framework和app工程师的博客 462

Linux中断子系统:request_irq()

https://gitee.com/rtoax/test/tree/master/linux/interrupt/request_irq #include <linux/module.h> // included for all kernel modules #include <linux/kernel.h> // included for KERN_INFO #include <linux/init.h> // included for __i

RToax 997

linux devm_request_threaded_irq 函数接口说明

linux devm_request_threaded_irq 函数接口介绍

OS Developer的博客 8221

OK6410 linux3.0.1 外部中断组1~9无法request_irq的解决方法

因项目需求远程遥控,准备在OK6410上使用红外线控制板子。由于板子上自带的红外所接引脚GPE1几乎等同于摆设,故需要外加红外头。在写驱动的时候发现中断组1~9无法request_irq成功,咨询官方技术支持和论坛没有任何答复,只好自己改内核了。仔细看源码,飞凌居然没初始化19组的中断,我和我的小伙伴都惊呆了 以下代码加入到manage.c中 static inline void

warcraftzhaochen的专栏 1314

编译内核驱动模块的时候错误解决方案

makefile: ifeq ($(KERNELRELEASE),) KERNELDIR ?= /home/sfe1012/GSRD/linux-socfpga-socfpga-3.12/ PWD := $(shell pwd) modules: $(MAKE) -C $(KERNELDIR) M=$(PWD) modules modules_install: $(MAKE) -C

sfe1012 Na~喊 -- 心系一处 睥睨群雄 Blog 4305

Linux 内核 request_irq 引起的Call Trace等问题

奇怪的是在2.6request_irq时发现好几个问题 我引入的头文件如下: #include <linux/kernel.h> #include <linux/sched.h> #include <linux/irq.h> #include <linux/interrupt.h> #include <linux/signal.h> 1...

大象身边的小蚂蚁 1638

request_threaded_irqrequest_irq

经典博文 文章 链接 备注 linux中断申请之request_threaded_irq https://www.cnblogs.com/dirt2/p/5632061.html 明确两种方式的优缺点 linux驱动request_threaded_irq() https://blog.csdn.net/gx19862005/article/details/18740705 中...

卓越之路 2915

中断申请函数request_irq详解

原地址:http://blog.csdn.net/wealoong/article/details/7566546 一、中断注册方法 在linux内核中用于申请中断的函数是request_irq(),函数原型在Kernel/irq/manage.c中定义: int request_irq(unsigned int irq, irq_handler_t handler,     

2万+

request_threaded_irq

在linux里,中断处理分为顶半(top half),底半(bottom half),在顶半里处理优先级比较高的事情,要求占用中断时间尽量的短,在处理完成后,就激活底半,有底半处理其余任务。tasklet和work queue在普通的driver里用的相对较多,主要区别是tasklet是在中断上下文执行,而work queue是在process上下文,因此可以执行可能sleep的操作。当多个设备共享中断时,由于IRQF_ONESHOT会关闭中断线程的中断,而线程一般执行时间会比较长,所以是不允许的。

uunubt的专栏 4611

Linux中断关于 request_threaded_irq

--------------------------------------------------------------------- 1. 重要接口 内核维护了一个中断信号线的注册表,该注册表类似于I/O端口的注册表。模块在使用中断前要先请求一个中断通道(或者中断请求IRQ),然后在使用后释放该通道。 撇开系统如何遍历各个设备进行初始化,上面两句话说的实际上就是指两个接口函数:

L_zy的专栏 4998

request_irq() | 注册中断服务

参考  : ARM Linux 中断机制分析.pdf linux-2.6.26内核中ARM中断实现详解(1) 一、中断注册方法 在linux内核中用于申请中断的函数是request_irq(),函数原型在Kernel/irq/manage.c中定义: int request_irq(unsigned int irq, irq_handler_t handler,

wealoong的专栏 8万+

申请中断request_irq()与request_threaded_irq()之间的不同?

在linux里,中断处理分为顶半(top half),底半(bottom half),在顶半里处理优先级比较高的事情,要求占用中断时间尽量的短,在处理完成后,就激活底半,有底半处理其余任务。底半的处理方式主要有soft_irq, tasklet, workqueue三种,他们在使用方式和适用情况上各有不同。soft_irq用在对底半执行时间要求比较紧急或者非常重要的场合,主要为一些subsystem用,一般driver基本上用不上。 tasklet和work queue在普通的driver里用的相对较多,主

gnnulzy的博客 3249

request_irq()、free_irq()

这是驱动程序申请中断和释放中断的调用。在include/linux/sched.h里声明。  request_irq()调用的定义:  int request_irq(unsigned int irq,  void (*handler)(int irq, void *dev_id, struct pt_regs *regs  ), unsigned long irqflags,  co

xiaoaide01的专栏 872

setup_irqrequest_irq

Linux 内核提供了两个注册中断处理函数的接口:setup_irqrequest_irq。这两个函数都定义在kernel/irq/manage.c里。 这两个函数有什么样的区别呢? 先看看setup_irq Setup_irq通常用在系统时钟(GP Timer)驱动里,注册系统时钟驱动的中断处理函数。 下面举个列子, 如s3c2410 timer驱动: /* ar

chuanzhilong的博客 1577

x86架构下Linux中断处理之request_irq

本章主要讲中断的注册过程 //待填坑

一点点 1540

request_threaded_irq()解读

1. 这个中断函数比较有意思,不仅定义了中断处理函数ads7846_hard_irq(),还会创建一个新线程,用来运行指定函数函数ads7846_irq()。具体应用: err = request_threaded_irq(spi->irq, ads7846_hard_irq, ads7846_irq, irq_flags, spi->dev

2721

PHP实例开发源码—文档管理系统.zip

PHP实例开发源码—文档管理系统.zip

上一篇: 深入浅出 Linux设备驱动中断处理介绍
下一篇: 为S3C6410的u-boot添加nor支持
willand1981
博客等级 码龄17年 136粉丝 31原创
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值