keer_zu 发表于 2020-3-19 14:24

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

@gy810986741@yyy71cj   一起研究一下电源管理吧。
物联网的很多实用场景对功耗都有要求,如果系统采用linux系统,那么功耗这部分的处理还是很值得研究的。
@sherwin @海中水

keer_zu 发表于 2020-3-19 14:43

本帖最后由 keer_zu 于 2020-3-19 15:08 编辑

通过下面程序:


/*************************** Main ***********************************/
int main(int argc, char **argv)
{
    XX_Autosleep_Enable(1);

    while (deamon_flag) {
      sleep(1);
    }

    return 0;
}



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

221.312292] Freezing remaining freezable tasks ... (elapsed 0.003 seconds) done.
Suspending console(s) (use no_console_suspend to debug)
quectel_low_consume_suspend: OK ###############################
msm_serial_hs_suspend(): jun test
PM: suspend of devices complete after 32.311 msecs
PM: late suspend of devices complete after 1.340 msecs
PM: noirq suspend of devices complete after 1.614 msecs
suspend ns:   221365144824      suspend cycles:       9966203615
CPU0:msm_cpu_pm_enter_sleep mode:3 during suspend
resume cycles:      10196593398
PM: noirq resume of devices complete after 1.049 msecs
PM: early resume of devices complete after 0.644 msecs
Resume: sysfs_notify wakeup_in
quectel_low_consume_resume:###############################
msm_otg 78d9000.usb: phy_reset: success
PM: resume of devices complete after 68.291 msecs
msm_otg 78d9000.usb: msm_otg_reset motg->inputs=1, motg->id_state=1
msm_otg 78d9000.usb: USB exited from low power mode
Restarting tasks ... done.
cpufreq: Frequency violation fixed for CPU0
PM: suspend exit 1980-01-06 03:25:28.091607828 UTC
PM: suspend entry 1980-01-06 03:25:29.575692202 UTC
msm_otg 78d9000.usb: USB in low power mode
PM: Syncing filesystems ... done.
Freezing user space processes ...
mbim_read: Waiting failed
(elapsed 0.013 seconds) done.
Freezing remaining freezable tasks ... (elapsed 0.003 seconds) done.
Suspending console(s) (use no_console_suspend to debug)

在bing下搜索:
Freezing remaining freezable tasks
可以找到linux下关于power manager的内容:



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


1:待机节点创建



static int __init pm_init(void)
{
      int error = pm_start_workqueue();
      if (error)
                return error;
      hibernate_image_size_init();
      hibernate_reserved_size_init();
      power_kobj = kobject_create_and_add("power", NULL);
      if (!power_kobj)
                return -ENOMEM;
#ifdef CONFIG_X86_INTEL_XGOLD
      power_hal_kobj = kobject_create_and_add("power_HAL_suspend",
                                        power_kobj);
      if (!power_hal_kobj)
                return -ENOMEM;
#endif
      error = sysfs_create_group(power_kobj, &attr_group);
      if (error)
                return error;
      pm_print_times_init();
      return pm_autosleep_init();
}

core_initcall(pm_init);

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

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

kernel-src/kernel/power/main.c





keer_zu 发表于 2020-3-19 15:14

power节点下子节点群创建

继续拿来主义.....

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

static struct attribute * g[] = {
        &state_attr.attr,
#ifdef CONFIG_PM_TRACE
        &pm_trace_attr.attr,
        &pm_trace_dev_match_attr.attr,
#endif
#ifdef CONFIG_PM_SLEEP
        &pm_async_attr.attr,
        &wakeup_count_attr.attr,
#ifdef CONFIG_PM_AUTOSLEEP
        &autosleep_attr.attr,
#endif
#ifdef CONFIG_PM_WAKELOCKS
        &wake_lock_attr.attr,
        &wake_unlock_attr.attr,
#endif
#ifdef CONFIG_PM_DEBUG
        &pm_test_attr.attr,
#endif
#ifdef CONFIG_PM_SLEEP_DEBUG
        &pm_print_times_attr.attr,
#endif
#endif
#ifdef CONFIG_FREEZER
        &pm_freeze_timeout_attr.attr,
#endif
        NULL,
};

例如,以下是子节点:

# ls /sys/power/
autosleep          pm_freeze_timeoutwake_lock          wakeup_count
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
我在芯片公司的时候,旁边的那个哥们一个一个片内设备测试休眠的支持,重启后是不是还是正常的.太累了.

睡眠功能和操作系统的核心功能紧密相连,而且被各种事件(如中断)唤醒。

bg4ajb 发表于 2020-4-17 10:50

这个问题比较复杂,很多系统里面实际是没用实现这些低功耗的基础的。
可以分成几个部分讨论:
1. 应用的启动的多少,这个涉及到CPU Freq的提高导致的高功耗,这个是纯软件的,通过在HAL层,Lib库调用再调试可以解决。
2. 软件和硬件配合,每个子模块一路可关断的供电,这样可以根据HAL层的需求,再在底层驱动实现供电的开关,这样会比较明显,尤其是Sleep模式下。
3. 涉及到硬件
目前的硬件设计包括TBOX,NAVI都是要尽量节省成本,这个会导致很多供电合并,这样就实现不了低功耗了。
页: [1]
查看完整版本: linux内核3.x的电源管理研究