首页 > 系统服务 > 详细

linux内核学习:中断

时间:2014-05-07 17:57:01      阅读:474      评论:0      收藏:0      [点我收藏+]

编程相关

 注册中断

bubuko.com,布布扣
int request_irq( unsigned int irq,

        irq_handler_t handler,

        unsigned long flags,

        const char *name,

        void *dev) 
bubuko.com,布布扣
bubuko.com,布布扣
typedef irqreturn_t (*irq_handler_t)(int, void *);
bubuko.com,布布扣
bubuko.com,布布扣
IRQF_DISABLED
会禁用除本本身以外的其它中断,一般是不用的

IRQF_SAMPLE_RANDOM
可以帮助内核随机数的产生。如果中断产生地毫无规律,可以使用该标志

IRQF_TIMRE
专用于系统定时器中断

IRQF_SHARED
多个中断处理程序共享一条中断线(号),该标志较为常用
bubuko.com,布布扣
bubuko.com,布布扣
void *dev
用于共享中断线,每一个中断处理程序都应该对应自己唯一的 dev
bubuko.com,布布扣

返回值

bubuko.com,布布扣
0:成功
其它:失败
失败的原因:中断线被占用?
bubuko.com,布布扣

注意事项:request_irq函数可能会睡眠,不可在中断上下文中调用

 注销中断

bubuko.com,布布扣
void free_irq(unsigned int irq, void *dev)
bubuko.com,布布扣

 中断函数

bubuko.com,布布扣
static irqreturn_t irq_handler(unsigned int, void *)
bubuko.com,布布扣

返回值

bubuko.com,布布扣
IRQ_NONE
不是该设备产生的中断

IRQ_HANDLED
不是该设备产生的中断
bubuko.com,布布扣

注意事项:中断函数不会嵌套,不需处理重入

禁止和使能所有中断(当前处理器)

bubuko.com,布布扣
unsigned long flags;
local_irq_save(flags);
// 此处中断被关闭
local_irq_restore(flags);
bubuko.com,布布扣

注意:该段代码应位于同一栈帧中,即同一函数中。禁止和使能可嵌套。

禁止和使能单条中断线

bubuko.com,布布扣
// 禁止中断,当前中断处理程序完成后,该函数才返回
void disable_irq(unsigned int irq);

// 禁止中断,立即返回
void disable_irq_nosync(unsigned int irq);

// 使能中断
void enable_irq(unsigned int irq);

// 等待中断程序返回
void synchronize_irq(unsigned int irq);
bubuko.com,布布扣

注意:disable_irq[_nosync] 和 enable_irq必须配套使用,并可以嵌套。

bubuko.com,布布扣

中断上下文

尽量节约内核栈空间,不要再函数内定义大数组等。

 

linux内核学习:中断,布布扣,bubuko.com

linux内核学习:中断

原文:http://www.cnblogs.com/JonnyLulu/p/3709962.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!