linux内核3.x的电源管理研究

[复制链接]
3204|15
 楼主| keer_zu 发表于 2020-3-19 14:24 | 显示全部楼层 |阅读模式
@gy810986741  @yyy71cj   一起研究一下电源管理吧。
物联网的很多实用场景对功耗都有要求,如果系统采用linux系统,那么功耗这部分的处理还是很值得研究的。
@sherwin @海中水
 楼主| keer_zu 发表于 2020-3-19 14:43 | 显示全部楼层
本帖最后由 keer_zu 于 2020-3-19 15:08 编辑

通过下面程序:


  1. /*************************** Main ***********************************/
  2. int main(int argc, char **argv)
  3. {
  4.     XX_Autosleep_Enable(1);

  5.     while (deamon_flag) {
  6.         sleep(1);
  7.     }

  8.     return 0;
  9. }



在打开开发板上linux系统的auto sleep之后,将进程杀掉,这时候系统会进入休眠模式,可以看到下面打印信息:

  1.   221.312292] Freezing remaining freezable tasks ... (elapsed 0.003 seconds) done.
  2. [  221.322026] Suspending console(s) (use no_console_suspend to debug)
  3. [  221.356825] [gale] quectel_low_consume_suspend: OK ###############################
  4. [  221.362071] msm_serial_hs_suspend(): jun test
  5. [  221.362078] PM: suspend of devices complete after 32.311 msecs
  6. [  221.363456] PM: late suspend of devices complete after 1.340 msecs
  7. [  221.365111] PM: noirq suspend of devices complete after 1.614 msecs
  8. [  221.365161] suspend ns:     221365144824        suspend cycles:       9966203615
  9. [  221.365144] CPU0:msm_cpu_pm_enter_sleep mode:3 during suspend
  10. [  221.365144] resume cycles:      10196593398
  11. [  221.367060] PM: noirq resume of devices complete after 1.049 msecs
  12. [  221.368093] PM: early resume of devices complete after 0.644 msecs
  13. [  221.377232] Resume: sysfs_notify wakeup_in
  14. [  221.377525] [gale] quectel_low_consume_resume:  ###############################
  15. [  221.378102] msm_otg 78d9000.usb: phy_reset: success
  16. [  221.436430] PM: resume of devices complete after 68.291 msecs
  17. [  221.499950] msm_otg 78d9000.usb: msm_otg_reset motg->inputs=1, motg->id_state=1
  18. [  221.500070] msm_otg 78d9000.usb: USB exited from low power mode
  19. [  221.530945] Restarting tasks ... done.
  20. [  221.553122] cpufreq: Frequency violation fixed for CPU0
  21. [  221.558334] PM: suspend exit 1980-01-06 03:25:28.091607828 UTC
  22. [  223.042426] PM: suspend entry 1980-01-06 03:25:29.575692202 UTC
  23. [  223.047464] msm_otg 78d9000.usb: USB in low power mode
  24. [  223.052538] PM: Syncing filesystems ... done.
  25. [  223.062319] Freezing user space processes ...
  26. [  223.073352] mbim_read: Waiting failed
  27. [  223.080123] (elapsed 0.013 seconds) done.
  28. [  223.083133] Freezing remaining freezable tasks ... (elapsed 0.003 seconds) done.
  29. [  223.092845] Suspending console(s) (use no_console_suspend to debug)


在bing下搜索:
  1. Freezing remaining freezable tasks

可以找到linux下关于power manager的内容:

117285e7313f8d3747.png

这里正好有待机流程的分析,先向别人学习一下,哈哈


1:待机节点创建



  1. static int __init pm_init(void)
  2. {
  3.         int error = pm_start_workqueue();
  4.         if (error)
  5.                 return error;
  6.         hibernate_image_size_init();
  7.         hibernate_reserved_size_init();
  8.         power_kobj = kobject_create_and_add("power", NULL);
  9.         if (!power_kobj)
  10.                 return -ENOMEM;
  11. #ifdef CONFIG_X86_INTEL_XGOLD
  12.         power_hal_kobj = kobject_create_and_add("power_HAL_suspend",
  13.                                         power_kobj);
  14.         if (!power_hal_kobj)
  15.                 return -ENOMEM;
  16. #endif
  17.         error = sysfs_create_group(power_kobj, &attr_group);
  18.         if (error)
  19.                 return error;
  20.         pm_print_times_init();
  21.         return pm_autosleep_init();
  22. }

  23. core_initcall(pm_init);

可以看到,内核创建了一个核心节点 ----- "power"节点。如何创建核心节点,参看:linux如何创建核心节点
power节点是在sysfs的ops下创建。它的位置就是 /sys/power

同时,在linux内核代码中找到这些内容的出处:

  1. kernel-src/kernel/power/main.c






 楼主| keer_zu 发表于 2020-3-19 15:14 | 显示全部楼层
power节点下子节点群创建

继续拿来主义.....

power作为内核待机主要节点。也能够说是父节点,非常多相关节点都在它低下创建。这就要看它的attribute_group

  1. static struct attribute * g[] = {
  2.         &state_attr.attr,
  3. #ifdef CONFIG_PM_TRACE
  4.         &pm_trace_attr.attr,
  5.         &pm_trace_dev_match_attr.attr,
  6. #endif
  7. #ifdef CONFIG_PM_SLEEP
  8.         &pm_async_attr.attr,
  9.         &wakeup_count_attr.attr,
  10. #ifdef CONFIG_PM_AUTOSLEEP
  11.         &autosleep_attr.attr,
  12. #endif
  13. #ifdef CONFIG_PM_WAKELOCKS
  14.         &wake_lock_attr.attr,
  15.         &wake_unlock_attr.attr,
  16. #endif
  17. #ifdef CONFIG_PM_DEBUG
  18.         &pm_test_attr.attr,
  19. #endif
  20. #ifdef CONFIG_PM_SLEEP_DEBUG
  21.         &pm_print_times_attr.attr,
  22. #endif
  23. #endif
  24. #ifdef CONFIG_FREEZER
  25.         &pm_freeze_timeout_attr.attr,
  26. #endif
  27.         NULL,
  28. };


例如,以下是子节点:

  1. # ls /sys/power/
  2. autosleep          pm_freeze_timeout  wake_lock          wakeup_count
  3. pm_async           state              wake_unlock




icecut 发表于 2020-3-19 22:24 | 显示全部楼层
这个先问问fae, 他们的所有设备都支持休眠了没
海中水 发表于 2020-3-20 09:05 | 显示全部楼层
这个方面值得研究。我先打个样,最近工作牵扯到TBOX的功耗的问题,里面modem是用的Linux系统,低功耗整体方案是用的睡眠+外部RTC唤醒的机制。
 楼主| keer_zu 发表于 2020-3-20 10:27 | 显示全部楼层
yyy71cj 发表于 2020-3-20 10:15
这个省电,还需要程序控制,嗯嗯,我感觉比较高深。要是所有芯片,都支持一线休眠就好了…… ...

就是让系统(包括子系统,如外设)在空闲的时候就进入低功耗状态,变着法省电。
 楼主| keer_zu 发表于 2020-3-20 10:28 | 显示全部楼层
icecut 发表于 2020-3-19 22:24
这个先问问fae, 他们的所有设备都支持休眠了没

正想@你呢,没找到你的ID,哈哈
这是linux系统本身就支持的,我们只是想把它用起来。看看结果
 楼主| keer_zu 发表于 2020-3-20 10:29 | 显示全部楼层
海中水 发表于 2020-3-20 09:05
这个方面值得研究。我先打个样,最近工作牵扯到TBOX的功耗的问题,里面modem是用的Linux系统,低功耗整体方 ...

我们这次遇到的事情简直一模一样,多多交流,哈哈
请问TBOX是什么,我也听同事们说过,不懂。
给个TBOX的详细说明,让我扫扫盲
海中水 发表于 2020-3-20 13:27 | 显示全部楼层
keer_zu 发表于 2020-3-20 10:29
我们这次遇到的事情简直一模一样,多多交流,哈哈
请问TBOX是什么,我也听同事们说过,不懂。
给个TBOX的 ...

啊啊啊!看起来接下来我们要多多交流。
 楼主| keer_zu 发表于 2020-3-20 13:49 | 显示全部楼层
海中水 发表于 2020-3-20 13:27
啊啊啊!看起来接下来我们要多多交流。

看来车载对低功耗的需求开始普遍了,TBOX我看了,跑的android,带定位和通信功能,但是不明白这东西为什么要单独整成一款产品。
海中水 发表于 2020-3-20 14:40 | 显示全部楼层
keer_zu 发表于 2020-3-20 13:49
看来车载对低功耗的需求开始普遍了,TBOX我看了,跑的android,带定位和通信功能,但是不明白这东西为什 ...

没有不是全部跑的android
icecut 发表于 2020-3-20 21:54 | 显示全部楼层
我在芯片公司的时候,旁边的那个哥们一个一个片内设备测试休眠的支持,重启后是不是还是正常的.太累了.
 楼主| keer_zu 发表于 2020-3-22 10:47 | 显示全部楼层
icecut 发表于 2020-3-20 21:54
我在芯片公司的时候,旁边的那个哥们一个一个片内设备测试休眠的支持,重启后是不是还是正常的.太累了.[em:1: ...

睡眠功能和操作系统的核心功能紧密相连,而且被各种事件(如中断)唤醒。
bg4ajb 发表于 2020-4-17 10:50 | 显示全部楼层
这个问题比较复杂,很多系统里面实际是没用实现这些低功耗的基础的。
可以分成几个部分讨论:
1. 应用的启动的多少,这个涉及到CPU Freq的提高导致的高功耗,这个是纯软件的,通过在HAL层,Lib库调用再调试可以解决。
2. 软件和硬件配合,每个子模块一路可关断的供电,这样可以根据HAL层的需求,再在底层驱动实现供电的开关,这样会比较明显,尤其是Sleep模式下。
3. 涉及到硬件
目前的硬件设计包括TBOX,NAVI都是要尽量节省成本,这个会导致很多供电合并,这样就实现不了低功耗了。

评论

@keer_zu :这个是实际的!  发表于 2020-4-18 11:10
@海中水  发表于 2020-4-17 16:46
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1489

主题

12954

帖子

55

粉丝
快速回复 在线客服 返回列表 返回顶部