如何记录并发现异常唤醒系统的中断源

       无论是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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值