博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
irq_exit中触发软件中断
阅读量:4216 次
发布时间:2019-05-26

本文共 1295 字,大约阅读时间需要 4 分钟。

在硬件中断退出时会调用irq_exitvoid irq_exit(void){	if (!in_interrupt() && local_softirq_pending())		invoke_softirq();}在这个函数中我们看到会调用invoke_softirq()来触发软件中断,但是这里有个条件是in_interrupt()#define in_interrupt()		(irq_count())#define irq_count()	(preempt_count() & (HARDIRQ_MASK | SOFTIRQ_MASK \				 | NMI_MASK))这里很清楚的可以看到这里的中断上下文包含硬件中断和软件中断不能处于中断上下文,这里的中断中断上下文分为硬件中断和软件中断一般在调用irq_exit的时候且没有中断嵌套的时候就不会再硬件中断上下文中同样如果这次的中断不是发生在一个软件中断中,则也符合不在软件中断上下文中符合不在中断上下文的条件后还要检测当前是否有软件中断在等待运行即#define local_softirq_pending() \	__IRQ_STAT(smp_processor_id(), __softirq_pending)如果都符合则调用invoke_softirq来触发软件中断static inline void invoke_softirq(void){	#如果软件中断的守护进程已经开始处理软件中断,则就没有必要再触发软件中断了。直接退出	if (ksoftirqd_running())		return;	#是否强制开机中断中断线程化	if (!force_irqthreads) {#ifdef CONFIG_HAVE_IRQ_EXIT_ON_IRQ_STACK		/*		 * We can safely execute softirq on the current stack if		 * it is the irq stack, because it should be near empty		 * at this stage.		 */		 #在irq的自己的stack上处理软件中断,从这里可以知道如果打开CONFIG_HAVE_IRQ_EXIT_ON_IRQ_STACK的话,irq就有自己的stack		__do_softirq();#else		/*		 * Otherwise, irq_exit() is called on the task stack that can		 * be potentially deep already. So call softirq in its own stack		 * to prevent from any overrun.		 */		 #在task的stack上开始处理软件中断		do_softirq_own_stack();#endif	} else {	#使用这个函数来唤醒守护进程来处理软件中断		wakeup_softirqd();	}}

转载地址:http://annmi.baihongyu.com/

你可能感兴趣的文章
win下创建win32控制台工程,执行lua脚本
查看>>
cocos2dx android启动错误
查看>>
eclipse: android rename package name
查看>>
cocos2dx c++调用java思想
查看>>
cocos2dx lua Node节点 私有数据存取
查看>>
lua math.ceil math.ceil
查看>>
cocos2dx CCNode计算node的大小
查看>>
cocos2dx 布局记录(1)
查看>>
lua 多行注释和取消多行注释
查看>>
缩放系数计算
查看>>
cocos2dx --- 按钮点击居中放大
查看>>
cocos2dx menu位置计算
查看>>
cocos2dx资源加载机制(同步/异步)
查看>>
cocos2dx C++调用java -- 字符串传递
查看>>
git学习网站
查看>>
JavaScript 学习网站
查看>>
cocos2dx java调用c++ -- 字符串传递
查看>>
CCScaleTo与CCScaleBy比较
查看>>
cocos2dx CCObject引用计数,内存释放分析(1)
查看>>
cocos2dx2.X 编译时,传递编译选项
查看>>