如何记录和不寻常的唤醒中断源

       是否android系统或VxWorks与其他实时系统,经常有这样的情况系统中清醒过来发育异常和调试过程中断。系统被唤醒,有时是正常的唤醒,例如,当中断定时器来唤醒系统处理业务,有时,异常的觉醒,让我们设定的超时时间不合理,统会导致系统耗电量添加,电池电源非常快被耗尽,减短终端待机或者使用时间,此时我们须要一定的手段来记录是谁唤醒的系统,然后分析是否合理唤醒。不合理就让相关责任人改动。

那么在android系统中(Linux类似),我们能够在syscore级别的resume 回调注冊回调函数来记录中断状态;

       为什么选择syscore级别的回调函数呢,主要是syscore级别的suspend和resume回调是全然处于锁中断的,此时系统是不响应中断的。我们能够在此记录中断状态。有人可能会问。为什么不注冊dpm里边的suspend_noirq或者resume_noirq级别的回调函数呢?举个样例来讲。在唤醒时,在运行完syscore级别的resume后,在运行dpm的resume_noirq前,系统就已经能够响应中断了。假设注冊resume_noirq级别的回调。则在调用回调函数获取中断状态之前系统就已经响应中断并把中断清除掉了,此时是不可能获取到并记录中断状态的。

       原理介绍完了。下边我们还是简单看一下用法吧。

1、首先,定义自己的回调函数

     static void my_resume(void)

     {

              /*获取中断状态,依据实际须要选择是打印出来还是另作处理*/

     }

2、定义自己的注冊变量

     static syscore_ops  my_pm_ops = {

                 .resume = my_resume,

       };


3、在自己的初始化函数中注冊syscore ops

   static int __init my_init(void){

         register_syscore_ops(&my_pm_ops);

         return 0;

    }    


感兴趣的同学能够參考Linux核心syscore_ops.h和syscore.c


版权声明:本文博客原创文章,博客,未经同意,不得转载。

原文地址:https://www.cnblogs.com/mengfanrong/p/4746980.html