critical section 中断唤醒系统流程(4)

电脑杂谈  发布时间:2018-02-14 08:19:31  来源:网络整理

技术分享图片

1) 首先执行syscore resume,马上为你讲解syscore的用意。

2) arch_suspend_enable_irqs()结束后就会进入中断服务函数,因为中断打开了,interrupt controller的pending寄存器没有清除,因此触发中断。你以为此时会调用到你注册的中断handle吗?错了!此时中断服务函数还没执行你注册的handle就返回了。马上为你揭晓为什么。先等等。

先说到这里,先看看什么是syscore。

2.4. system core operations有什么用?

先想一想为什么要等到syscore_resume之后才arch_suspend_enable_irqs()之后呢?试想一下,系统刚被唤醒,最重要的事情是不是先打开相关的时钟以及最基本driver(例如:gpio、irq_chip等)呢?因此syscore_resume主要是clock以及gpio的驱动resume,因为这是其他设备依赖的最基本设备。回想一下上一节中Susoend to RAM流程中,syscore_suspend也同样是最后suspend的,毕竟人家是大部分设备的基础,当然最后才能suspend。可以通过register_syscore_ops()接口注册syscore operation。

2.5. gic interrupt controller中断执行流程

接下来arch_suspend_enable_irqs()之后就是中断流程了,其函数执行流程如下。

技术分享图片

图片中是一个中断从汇编开始到结束的流程。假设我们的设备是边沿触发中断,那么一定会执行到handle_edge_irq(),如果你不想追踪代码,或者对中断流程不熟悉,我教你个方法,在注册的中断handle中加上一句WARN_ON(1);语句,请查看log信息即可。handle_edge_irq()代码如下:

void handle_edge_irq(struct irq_desc *desc)

{

raw_spin_lock(&desc->lock);

desc->istate &= ~(IRQS_REPLAY | IRQS_WAITING);

if (!irq_may_run(desc)) {

desc->istate |= IRQS_PENDING;

mask_ack_irq(desc);

critical section_ccriticalsection 死锁_signal waite

goto out_unlock;

}

/*

* If its disabled or no action available then mask it and get

* out of here.

*/

if (irqd_irq_disabled(&desc->irq_data) || !desc->action) {

desc->istate |= IRQS_PENDING;

mask_ack_irq(desc);

goto out_unlock;

}

kstat_incr_irqs_this_cpu(desc);

/* Start handling the irq */

desc->irq_data.chip->irq_ack(&desc->irq_data);

do {

if (unlikely(!desc->action)) {

mask_irq(desc);

goto out_unlock;

}

/*

* When another irq arrived while we were handling


本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-77051-4.html

相关阅读
    发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

    • 倪子和
      倪子和

      毛主席的分析还是很透彻的

    • 刘童
      刘童

      这是教育体制落后的具体体现

    热点图片
    拼命载入中...