无论是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
如何记录并发现异常唤醒系统的中断源