local_irq_save和 local_irq_disable
2015-09-26 15:00
531 查看
如果你要禁止所有的中断该怎么办? 在2.6内核中,可以通过下面两个函数中的其中任何一个关闭当前处理器上的所有中断处理,这两个函数定义在 <asm/system.h>中:
void local_irq_save(unsigned long flags);
void local_irq_disable(void);
local_irq_save的调用把当前中断状态保存到flags中,然后禁用当前处理器上的中断发送。注意, flags 被直接传递, 而不是通过指针来传递。
local_irq_disable不保存状态而关闭本地处理器上的中断发送; 只有我们知道中断并未在其他地方被禁用的情况下,才能使用这个版本。
可通过如下函数打开中断:
void local_irq_restore(unsigned long flags);
void local_irq_enable(void);
第一个版本将local_irq_save保存的flags状态值恢复, 而local_irq_enable则无条件打开中断。与 disable_irq不同, local_irq_disable不会维护对多次的调用的跟踪。 如果调用链中有多个函数需要禁止中断, 应该使用local_irq_save.
在2.6内核, 没有方法全局禁用整个系统的所有中断。 内核开发者认为关闭所有中断的代价太高,因此没有必要提供这个能力。如果读者使用的老驱动程序调用了类似cli和sti这样的函数,为了该驱动程序能够在2.6下使用,则需要进行修改而使用正确的锁。
in_interrupt()是判断当前进程是否处于中断上下文,这个中断上下文包括底半部和硬件中断处理过程,
函数实现:
#define in_interrupt() ({ const int __cpu = smp_processor_id(); /
(local_irq_count(__cpu) + local_bh_count(__cpu) != 0); })
判断中断计数和底半部计数是否〉0,如果只希望判断是否在硬件中断上下文,则可以使用:in_irq()。
http://wmzjzwlzs.blog.163.com/blog/static/205014196201310174725996/
void local_irq_save(unsigned long flags);
void local_irq_disable(void);
local_irq_save的调用把当前中断状态保存到flags中,然后禁用当前处理器上的中断发送。注意, flags 被直接传递, 而不是通过指针来传递。
local_irq_disable不保存状态而关闭本地处理器上的中断发送; 只有我们知道中断并未在其他地方被禁用的情况下,才能使用这个版本。
可通过如下函数打开中断:
void local_irq_restore(unsigned long flags);
void local_irq_enable(void);
第一个版本将local_irq_save保存的flags状态值恢复, 而local_irq_enable则无条件打开中断。与 disable_irq不同, local_irq_disable不会维护对多次的调用的跟踪。 如果调用链中有多个函数需要禁止中断, 应该使用local_irq_save.
在2.6内核, 没有方法全局禁用整个系统的所有中断。 内核开发者认为关闭所有中断的代价太高,因此没有必要提供这个能力。如果读者使用的老驱动程序调用了类似cli和sti这样的函数,为了该驱动程序能够在2.6下使用,则需要进行修改而使用正确的锁。
in_interrupt()是判断当前进程是否处于中断上下文,这个中断上下文包括底半部和硬件中断处理过程,
函数实现:
#define in_interrupt() ({ const int __cpu = smp_processor_id(); /
(local_irq_count(__cpu) + local_bh_count(__cpu) != 0); })
判断中断计数和底半部计数是否〉0,如果只希望判断是否在硬件中断上下文,则可以使用:in_irq()。
http://wmzjzwlzs.blog.163.com/blog/static/205014196201310174725996/
相关文章推荐
- 采用hash_map进行表格之间数据的查找
- html5定位
- 项目实操Mono+Linux配置 实现ASP.NET运行
- vmtools安装完后为什么无法粘贴
- Emmet语法
- 设备访问机制------阻塞与非阻塞
- SQL Server分页存储过程的五种方法及性能比较
- 数制知识小结
- Android杂谈-RelativeLayout中的baseline是什么
- Android Provider获取通信录
- 微软称今后所有的Win10发行包都是累积的
- iOS基础-事件处理、响应者链
- 2015 ACM/ICPC Asia Regional Shanghai Online A Sweet Journey(简单题)
- 记录——《C Primer Plus (第五版)》第七章编程练习第八题
- android 解析XML方式(三)
- Hive 笔记之 加载数据时,找不到文件路径异常
- SQL中的case when then else end用法
- android MSM8974 上DeviceTree简介
- android 解析XML方式(二)
- android MSM8974 上DeviceTree简介