linux内核3.x的电源管理研究
@gy810986741@yyy71cj 一起研究一下电源管理吧。物联网的很多实用场景对功耗都有要求,如果系统采用linux系统,那么功耗这部分的处理还是很值得研究的。
@sherwin @海中水 本帖最后由 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
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
这个先问问fae, 他们的所有设备都支持休眠了没 这个方面值得研究。我先打个样,最近工作牵扯到TBOX的功耗的问题,里面modem是用的Linux系统,低功耗整体方案是用的睡眠+外部RTC唤醒的机制。 yyy71cj 发表于 2020-3-20 10:15
这个省电,还需要程序控制,嗯嗯,我感觉比较高深。要是所有芯片,都支持一线休眠就好了…… ...
就是让系统(包括子系统,如外设)在空闲的时候就进入低功耗状态,变着法省电。 icecut 发表于 2020-3-19 22:24
这个先问问fae, 他们的所有设备都支持休眠了没
正想@你呢,没找到你的ID,哈哈
这是linux系统本身就支持的,我们只是想把它用起来。看看结果 海中水 发表于 2020-3-20 09:05
这个方面值得研究。我先打个样,最近工作牵扯到TBOX的功耗的问题,里面modem是用的Linux系统,低功耗整体方 ...
我们这次遇到的事情简直一模一样,多多交流,哈哈
请问TBOX是什么,我也听同事们说过,不懂。
给个TBOX的详细说明,让我扫扫盲 keer_zu 发表于 2020-3-20 10:29
我们这次遇到的事情简直一模一样,多多交流,哈哈
请问TBOX是什么,我也听同事们说过,不懂。
给个TBOX的 ...
啊啊啊!看起来接下来我们要多多交流。 海中水 发表于 2020-3-20 13:27
啊啊啊!看起来接下来我们要多多交流。
看来车载对低功耗的需求开始普遍了,TBOX我看了,跑的android,带定位和通信功能,但是不明白这东西为什么要单独整成一款产品。 keer_zu 发表于 2020-3-20 13:49
看来车载对低功耗的需求开始普遍了,TBOX我看了,跑的android,带定位和通信功能,但是不明白这东西为什 ...
没有不是全部跑的android 我在芯片公司的时候,旁边的那个哥们一个一个片内设备测试休眠的支持,重启后是不是还是正常的.太累了. icecut 发表于 2020-3-20 21:54
我在芯片公司的时候,旁边的那个哥们一个一个片内设备测试休眠的支持,重启后是不是还是正常的.太累了.
睡眠功能和操作系统的核心功能紧密相连,而且被各种事件(如中断)唤醒。 这个问题比较复杂,很多系统里面实际是没用实现这些低功耗的基础的。
可以分成几个部分讨论:
1. 应用的启动的多少,这个涉及到CPU Freq的提高导致的高功耗,这个是纯软件的,通过在HAL层,Lib库调用再调试可以解决。
2. 软件和硬件配合,每个子模块一路可关断的供电,这样可以根据HAL层的需求,再在底层驱动实现供电的开关,这样会比较明显,尤其是Sleep模式下。
3. 涉及到硬件
目前的硬件设计包括TBOX,NAVI都是要尽量节省成本,这个会导致很多供电合并,这样就实现不了低功耗了。
页:
[1]