打印
[技术问答]

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

[复制链接]
1753|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
timfordlare|  楼主 | 2024-12-30 10:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
      无论是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;

    }   

使用特权

评论回复
沙发
eleg34ance| | 2025-3-11 17:21 | 只看该作者
首先,需要深入理解系统的唤醒机制。无论是Android系统、Linux系统还是其他实时操作系统,它们都有一套复杂的电源管理和中断处理机制。这些机制决定了哪些事件可以唤醒系统,以及唤醒后系统应如何响应

使用特权

评论回复
板凳
ewyu| | 2025-3-11 18:35 | 只看该作者
在系统中,可以选择在syscore级别的resume回调中注册回调函数来记录中断状态。这是因为syscore级别的suspend和resume回调是完全处于锁中断的状态,此时系统不响应中断,因此可以在此安全地记录中断状态

使用特权

评论回复
地板
hight1light| | 2025-3-11 19:38 | 只看该作者
如果选择注册dpm里边的suspend_noirq或resume_noirq级别的回调函数,则可能无法获取到中断状态。因为在唤醒时,系统在执行完syscore级别的resume后,在执行dpm的resume_noirq前就已经可以响应中断了。如果此时注册resume_noirq级别的回调,那么在调用回调函数获取中断状态之前,系统可能已经响应中断并把中断清除掉了

使用特权

评论回复
5
teaccch| | 2025-3-11 20:45 | 只看该作者
需要实现自己的回调函数。在回调函数中,可以获取中断状态,并根据实际需要选择是打印出来还是进行其他处理。

使用特权

评论回复
6
nqty| | 2025-3-11 22:14 | 只看该作者
一般创建回调函数之后,需要将其注册到系统中。在系统中,可以通过定义自己的syscore_ops结构体,并将其注册到系统中来实现

使用特权

评论回复
7
canfeil| | 2025-3-11 23:22 | 只看该作者
一旦系统被唤醒,回调函数就会被触发。在回调函数中,可以检查中断状态,判断是哪个中断源唤醒了系统。如果发现是异常唤醒源,可以将其记录下来,并进行分析和处理。

使用特权

评论回复
8
一切D都好| | 2025-3-12 10:23 | 只看该作者
根据记录和分析的结果,可以优化系统的唤醒策略。例如,如果发现某个中断源频繁地异常唤醒系统,可以考虑调整其超时时间、禁用不必要的唤醒源或采取其他措施来减少系统唤醒次数和耗电量。

使用特权

评论回复
9
hhdhy| | 2025-3-12 11:28 | 只看该作者
通过深入理解系统唤醒机制、选择适当的回调级别、实现并注册回调函数、分析并记录异常唤醒源以及优化系统唤醒策略等步骤,可以有效地记录并发现异常唤醒系统的中断源。

使用特权

评论回复
10
miltk| | 2025-3-12 12:27 | 只看该作者
应该是有中断记录的寄存器吧

使用特权

评论回复
11
wamed| | 2025-3-12 14:21 | 只看该作者
你可以用写日志的方式来弄

使用特权

评论回复
12
SophiaOP| | 2025-3-17 21:31 | 只看该作者
日志还得导出来看

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

38

主题

1526

帖子

1

粉丝