资源描述:
《Linux_设备驱动程序之中断与时钟_模板》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
1、Linux_设备驱动程序之中断与时钟_模板 2011-10-2519:14:56
2、 分类:Linux学习笔记
3、 标签:
4、举报
5、字号大中小 订阅“小涛哥,快醒醒,快醒醒..”小王使劲推着睡梦中的我,“你不是说今天要讲昨天有关的典型模板实例吗…”“啊?小姐啊,现在才早上8点,还让人睡觉不,别吵”我一头钻进被子里说。“不管,谁让你昨天不说完,还卖个小关子,害我昨天晚上都没睡好,想了一晚上…”我揉揉蒙蒙的眼说:“行,权当看在你渴求的心情上,但只此一次,下不为例,我还想好好睡懒觉呢..”昨天我们讲了有关中断方面的东西,鉴于小王你不太懂,我今天就专门拿出一章来说说前边中断的使用典型模版,你照抄
6、也方便不是:1)在中断分类中,我们说到了有关向量中断和非向量中断,向量中断就是入口地址不同,进不同的地址做不同的事。那非向量中断则是进同一地址,至于区分就放在了进去后用条件判断,请看下边的模板:irq_handler(){ ... intint_src=read_int_status(); //读硬件的中断相关寄存器 switch(int_src) //判断中断源 { caseDEV_A: dev_a_handler(); break; caseDEV_B: dev_b_handler();
7、 break; .... default: break; }}2)在底半部机制中,我们讲了tasklet,工作队列和软中断先来看tasklettasklet使用模版:voidxxx_do_tasklet(unsignedlong);DECLARE_TASKLET(XXX_tasklet,xxx_do_tasklet,0);voidxxx_do_tasklet(unsignedlong) //中断处理底半部{ .....}irqreturn_txxx_interrupt(intirq,void*dev_id,structpt_regs*
8、regs) //中断处理顶半部{ ... tasklet_schedule(&xxx_tasklet);}int__initxxx_init(void) //设备驱动模块加载函数{ .. result=request_irq(xxx_irq,xxx_interrupt,SA_INTERRUPT,"XXX",NULL); //申请中断 ...}void__exitxxx_exit(void) //设备驱动卸载模块{ .. free_irq(xxx_irq,xxx_interrupt); //释放中断 ..}工作队列模版:structwork_structxxx_wq;voidxxx_
9、do_work(unsignedlong);voidxxx_do_work(unsignedlong) //中断处理底半部{ .....}irqreturn_txxx_interrupt(intirq,void*dev_id,structpt_regs*regs) //中断处理顶半部{ ... schedule_work(&xxx_wq);}intxxx_init(void) //设备驱动模块加载函数{ .. result=request_irq(xxx_irq,xxx_interrupt,SA_INTERRUPT,"XXX",NULL); //申请中断 ... INIT_WOR
10、K(&xxx_wq,(void(*)(void*))xxx_do_work,NULL); ...}void__exitxxx_exit(void) //设备驱动卸载模块{ .. free_irq(xxx_irq,xxx_interrupt); //释放中断 ..}3)在上节最后我还给你讲了有关中断共享的东西吧,小王,也把模版给你:irqreturn_txxx_interrupt(intirq,void*dev_id,structpt_regs*regs) //中断处理顶半部{ ... intstatus=read_int_status(); //获取终端源 if(!is_myin
11、t(dev_id,status)) //判断是否是本设备的中断 { return IRQ_NONE://立即返回 } .. returnIRQ_HANDLED;}int__initxxx_init(void) //设备驱动模块加载函数{ .. result=request_irq(xxx_irq,xxx_interrupt,SA_SHIRQ,"XXX",xxx_dev); //申请共享中断 ...}void__exitxxx