Chinaunix首页 | 论坛 | 博客
  • 博客访问: 481485
  • 博文数量: 51
  • 博客积分: 1056
  • 博客等级: 少尉
  • 技术积分: 676
  • 用 户 组: 普通用户
  • 注册时间: 2010-11-10 22:53
文章存档

2018年(2)

2017年(1)

2013年(2)

2012年(9)

2011年(36)

2010年(1)

分类: 嵌入式

2011-04-01 17:44:04

虽说职位是linux驱动工程师,但是几乎没有从头写驱动的机会。基本只有半导体IC厂商的工程师写驱动,做终端产品的工程师只有改驱动的份。
特此积累一些常见的驱动编程模型,方便今后套用。

本文讲述如何使用一个简单的中断处理线程,做一些简单的应用场合。中断处理函数要干脆利索的返回,不能睡眠,最好也不要忙等(msleep之类)
假设为路由器设计一个复位按键,按下3s后(去抖,确认操作),内核调用用户进程做一个更新文件系统的动作。去抖可以在中断处理函数里做,50ms的忙等。但总不能在中断处理函数里等3s来确认操作吧。内核调用用户进程的常见接口,怎么也会引起睡眠吧。
这些不干脆的操作我想应该在中断处理线程里去做。
主要代码如下:

  1. static irqreturn_t irq_thread_fn(int data,void *dev_id)
  2. {
  3.     
  4.      printk("<0>in irq_thread_fn %d %s \n",current->pid,current->comm);
  5.     //判断当前上下文
  6.     if(in_irq())
  7.         printk(" in_irq\n");
  8.     if(in_softirq())
  9.         printk(" in_softirq\n");
  10.     if(in_interrupt())
  11.         printk(" in_interrupt\n");
  12.     
  13.     //实践证明确实是在进程上下文,所以尽管折腾尽管睡眠吧
  14.         
  15.        return IRQ_HANDLED; //真正完成了中断处理
  16. }


  17. static irqreturn_t irq_handler(int irq, void *data)

  18. {
  19. //实践证明中断上下文中可以使用current,但是取得的结果自然没有意义,毕竟不是在进程上下文
  20. //大部分情况打印in irq_thread_fn 0 swapper
  21.  printk("<0>in irq_handler %d %s \n",current->pid,current->comm);
  22.     if(in_irq())
  23.         printk(" in_irq\n");
  24.     if(in_softirq())
  25.         printk(" in_softirq\n");
  26.     if(in_interrupt())
  27.         printk(" in_interrupt\n");
  28.     //clear pend
  29.     //硬件相关操作部分,如清空中断标记
  30.     
  31.     return IRQ_WAKE_THREAD; //表示需要调用中断处理线程才能完成中断处理
  32. }

  33. ret=request_threaded_irq(IRQ_NUM,irq_handler,irq_thread_fn,IRQF_SAMPLE_RANDOM,"LightSensorPS",NULL);


阅读(2525) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~