linux中断处理程序需要注意的参数问题

本文介绍了Linux中断服务例程的关键参数,包括中断号(int irq)、设备ID(void *dev_id)及其作用。中断处理程序的返回值通常为IRQ_NONE或IRQ_HANDLED。内容还涉及中断处理程序的执行特点,如中断线的屏蔽机制和服务内容,以及request_irq()函数的使用限制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

中断服务例程的形参:

static irqreturn_t buttons_interrupt(int irq, void *dev_id)
{
    struct button_irq_desc *button_irqs = (struct button_irq_desc *)dev_id;
    int down;
     udelay(0);
    down = !s3c2410_gpio_getpin(button_irqs->pin);   //down: 1(按下),0(弹起)
   if (!down) { 

    /*报告事件*/
    key_values = button_irqs->number;
    //printk("====>rising key_values=%d\n",key_values);
  if(key_values==0)
    input_report_key(button_dev, KEY_1, 0);
  if(key_values==1)
    input_report_key(button_dev, KEY_2, 0);
  if(key_values==2)
    input_report_key(button_dev, KEY_3, 0);
  if(key_values==3)
    input_report_key(button_dev, KEY_4, 0);
  if(key_values==4)
    input_report_key(button_dev, KEY_5, 0);
  if(key_values==5)
    input_report_key(button_dev, KEY_6, 0);

  input_sync(button_dev);      
     }

     else {

        key_values = button_irqs->number;
        //printk("====>falling key_values=%d\n",key_values);
  if(key_values==0)
        input_report_key(button_dev, KEY_1, 1);
  if(key_values==1)
        input_report_key(button_dev, KEY_2, 1);
  if(key_values==2)
        input_report_key(button_dev, KEY_3, 1);
  if(key_values==3)
        input_report_key(button_dev, KEY_4, 1);
  if(key_values==4)
        input_report_key(button_dev, KEY_5, 1);
  if(key_values==5)
        input_report_key(button_dev, KEY_6, 1);
  input_sync(button_dev);      

     }


    return IRQ_RETVAL(IRQ_HANDLED);
}

A. int irq :中断号。
B. void *dev_id :与request_irq () 的参数dev_id一致,可以根据这个设备id号得到相应设备的数据结构,进而得到相应设备的信息和相关数据。
C.返回值:中断程序的返回值是一个特殊类型 rqreturn_t。但是中断程序的返回值却只有两个值IRQ_NONE和IRQ_HANDLED。
IRQ_NONE:中断程序接收到中断信号后发现这并不是注册时指定的中断源发出的中断信号。
IRQ_HANDLED:接收到了准确的中断信号,并且作了相应正确的处理。

一般 中断处理程序要做什么service,主要取决于产生的设备和该设备为什么要发送中断。

1.当一个给定的中断处理程序正在执行时,这条中断线上的其它中断都会被屏蔽。but,所有其他中断线上的中断都是打开的。因此这些不同中断线上的其他中断都能被处理。

2.request_irq()函数可能会睡眠,所以,不能在中断上下文或其它不允许阻塞的代码中调用该函数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值