当前位置:文档之家› Linux Kernel and Android 休眠与唤醒

Linux Kernel and Android 休眠与唤醒

Linux Kernel and Android 休眠与唤醒
Linux Kernel and Android 休眠与唤醒

Linux Kernel and Android 休眠与唤醒

这是在网上看到的,关于linux电源管理说的比较清楚的还真不多。这篇不错,转过来。正好这几天在研究android电源管理机制。

?简介

?国际化

?版本信息

?对于休眠(suspend)的简单介绍

?Linux Suspend 的流程

o相关的文件:

o准备, 冻结进程

o让外设进入休眠

o Resume

?Android 休眠(suspend)

o涉及到的文件:

o特性介绍

?Early Suspend

?Late Resume

?Wake Lock

o Android Suspend

o Early Suspend

o Late Resume

o Wake Lock

o Suspend

o Android于标准Linux休眠的区别

简介

休眠/唤醒在嵌入式Linux中是非常重要的部分,嵌入式设备尽可能的进入休眠状态来延长电池的续航时间.这篇文章就详细介绍一下Linux中休眠/唤醒是如何工作的, 还有Android 中如何把这部分和Linux的机制联系起来的.

国际化

?English Version: link

?中文版: link

作者: zhangjiejing Date: 2010-04-07, https://www.doczj.com/doc/9d16010726.html,

版本信息

?Linux Kernel: v2.6.28

?Android: v2.0

对于休眠(suspend)的简单介绍

在Linux中,休眠主要分三个主要的步骤:

1. 冻结用户态进程和内核态任务

2. 调用注册的设备的suspend的回调函数,顺序是按照注册顺序

3. 休眠核心设备和使CPU进入休眠态冻结进程是内核把进程列表中所有的进程的状

态都设置为停止,并且保存下所有进程的上下文. 当这些进程被解冻的时候,他们是不知道自己被冻结过的,只是简单的继续执行.如何让Linux进入休眠呢?用户可以通过读写sys文件/sys /power/state 是实现控制系统进入休眠. 比如

# echo standby > /sys/power/state

命令系统进入休眠. 也可以使用

# cat /sys/power/state

来得到内核支持哪几种休眠方式.

Linux Suspend 的流程

相关的文件:

你可以通过访问Linux内核网站来得到源代码,下面是文件的路径:

?linux_soruce/kernel/power/main.c

?linux_source/kernel/arch/xxx/mach-xxx/pm.c

?linux_source/driver/base/power/main.c

接下来让我们详细的看一下Linux是怎么休眠/唤醒的. Let 's going to see how these happens.

用户对于/sys/power/state 的读写会调用到main.c中的state_store(), 用户可以写入const char * const pm_state[] 中定义的字符串, 比如"mem", "standby".

然后state_store()会调用enter_state(), 它首先会检查一些状态参数,然后同步文件系统. 下面是代码:

/**

* enter_state - Do common work of entering low-power state.

* @state: pm_state structure for state we're entering. *

* Make sure we're the only ones trying to enter a sleep state. Fail

* if someone has beat us to it, since we don't want anything weird to

* happen when we wake up.

* Then, do the setup for suspend, enter the state, and cleaup (after

* we've woken up).

*/

static int enter_state(suspend_state_t state)

{

int error;

if (!valid_state(state))

return -ENODEV;

if (!mutex_trylock(&pm_mutex))

return -EBUSY;

printk(KERN_INFO "PM: Syncing filesystems ... ");

sys_sync();

printk("done.\n");

pr_debug("PM: Preparing system for %s sleep\n",

pm_states[state]);

error = suspend_prepare();

if (error)

goto Unlock;

if (suspend_test(TEST_FREEZER))

goto Finish;

pr_debug("PM: Entering %s sleep\n", pm_states[state]);

error = suspend_devices_and_enter(state);

Finish:

pr_debug("PM: Finishing wakeup.\n");

suspend_finish();

Unlock:

mutex_unlock(&pm_mutex);

return error;

}

准备, 冻结进程

当进入到suspend_prepare()中以后, 它会给suspend分配一个虚拟终端来输出信息, 然后广播一个系统要进入suspend的Notify, 关闭掉用户态的helper进程, 然后一次调用suspend_freeze_processes()冻结所有的进程, 这里会保存所有进程当前的状态, 也许有一些进程会拒绝进入冻结状态, 当有这样的进程存在的时候, 会导致冻结失败,此函数就会

放弃冻结进程,并且解冻刚才冻结的所有进程.

/**

* suspend_prepare - Do prep work before entering low-power state. *

* This is common code that is called for each state that we're entering.

* Run suspend notifiers, allocate a console and stop all processes. */

static int suspend_prepare(void)

{

int error;

unsigned int free_pages;

if (!suspend_ops || !suspend_ops->enter)

return -EPERM;

pm_prepare_console();

error = pm_notifier_call_chain(PM_SUSPEND_PREPARE);

if (error)

goto Finish;

error = usermodehelper_disable();

if (error)

goto Finish;

if (suspend_freeze_processes()) {

error = -EAGAIN;

goto Thaw;

}

free_pages = global_page_state(NR_FREE_PAGES);

if (free_pages < FREE_PAGE_NUMBER) {

pr_debug("PM: free some memory\n");

shrink_all_memory(FREE_PAGE_NUMBER - free_pages); if (nr_free_pages() < FREE_PAGE_NUMBER) {

error = -ENOMEM;

printk(KERN_ERR "PM: No enough memory\n"); }

}

if (!error)

return 0;

Thaw:

suspend_thaw_processes();

usermodehelper_enable();

Finish:

pm_notifier_call_chain(PM_POST_SUSPEND);

pm_restore_console();

return error;

}

让外设进入休眠

现在, 所有的进程(也包括workqueue/kthread) 都已经停止了, 内核态人物有可能在停止的时候握有一些信号量, 所以如果这时候在外设里面去解锁这个信号量有可能会发生死锁, 所以在外设的suspend()函数里面作lock/unlock锁要非常小心,这里建议设计的时候就不要在suspend()里面等待锁. 而且因为suspend的时候,有一些Log是无法输出的,所以一旦出现问题,非常难调试.

然后kernel在这里会尝试释放一些内存.

最后会调用suspend_devices_and_enter()来把所有的外设休眠, 在这个函数中, 如果平台注册了suspend_pos(通常是在板级定义中定义和注册), 这里就会调用

suspend_ops->begin(), 然后driver/base/power/main.c 中的

device_suspend()->dpm_suspend() 会被调用,他们会依次调用驱动的suspend() 回调来

休眠掉所有的设备.

当所有的设备休眠以后, suspend_ops->prepare()会被调用, 这个函数通常会作一些准备

工作来让板机进入休眠. 接下来Linux,在多核的CPU中的非启动CPU会被关掉, 通过注释看到是避免这些其他的CPU造成race condion,接下来的以后只有一个CPU在运行了.

suspend_ops 是板级的电源管理操作, 通常注册在文件arch/xxx/mach-xxx/pm.c 中.

接下来, suspend_enter()会被调用, 这个函数会关闭arch irq, 调用device_power_down(), 它会调用suspend_late()函数, 这个函数是系统真正进入休眠最后调用的函数, 通常会在

这个函数中作最后的检查. 如果检查没问题, 接下来休眠所有的系统设备和总线, 并且调

用suspend_pos->enter() 来使CPU进入省电状态. 这时候,就已经休眠了.代码的执行也就停在这里了.

/**

* suspend_devices_and_enter - suspend devices and enter the desired system

* sleep state.

* @state: state to enter

*/

int suspend_devices_and_enter(suspend_state_t state)

{

int error, ftrace_save;

if (!suspend_ops)

return -ENOSYS;

if (suspend_ops->begin) {

error = suspend_ops->begin(state);

if (error)

goto Close;

}

suspend_console();

ftrace_save = __ftrace_enabled_save();

suspend_test_start();

error = device_suspend(PMSG_SUSPEND);

if (error) {

printk(KERN_ERR "PM: Some devices failed to suspend\n"); goto Recover_platform;

}

suspend_test_finish("suspend devices");

if (suspend_test(TEST_DEVICES))

goto Recover_platform;

if (suspend_ops->prepare) {

error = suspend_ops->prepare();

if (error)

goto Resume_devices;

}

if (suspend_test(TEST_PLATFORM))

goto Finish;

error = disable_nonboot_cpus();

if (!error && !suspend_test(TEST_CPUS)) suspend_enter(state);

enable_nonboot_cpus();

Finish:

if (suspend_ops->finish)

suspend_ops->finish();

Resume_devices:

suspend_test_start();

device_resume(PMSG_RESUME);

suspend_test_finish("resume devices"); __ftrace_enabled_restore(ftrace_save); resume_console();

Close:

if (suspend_ops->end)

suspend_ops->end();

return error;

Recover_platform:

if (suspend_ops->recover)

suspend_ops->recover();

goto Resume_devices;

}

Resume

如果在休眠中系统被中断或者其他事件唤醒, 接下来的代码就会开始执行, 这个唤醒的顺序是和休眠的循序相反的,所以系统设备和总线会首先唤醒,使能系统中断, 使能休眠时候停止掉的非启动CPU, 以及调用suspend_ops->finish(), 而且在

suspend_devices_and_enter()函数中也会继续唤醒每个设备,使能虚拟终端, 最后调用suspend_ops->end().

在返回到enter_state()函数中的, 当suspend_devices_and_enter() 返回以后, 外设已经唤醒了, 但是进程和任务都还是冻结状态, 这里会调用suspend_finish()来解冻这些进程和任务, 而且发出Notify来表示系统已经从suspend状态退出, 唤醒终端.

到这里, 所有的休眠和唤醒就已经完毕了, 系统继续运行了.

Android 休眠(suspend)

在一个打过android补丁的内核中, state_store()函数会走另外一条路,会进入到

request_suspend_state()中, 这个文件在earlysuspend.c中. 这些功能都是android系统加的, 后面会对earlysuspend和late resume 进行介绍.

涉及到的文件:

?linux_source/kernel/power/main.c

?linux_source/kernel/power/earlysuspend.c

?linux_source/kernel/power/wakelock.c

特性介绍

Early Suspend

Early suspend 是android 引进的一种机制, 这种机制在上游备受争议,这里不做评论. 这个机制作用在关闭显示的时候, 在这个时候, 一些和显示有关的设备, 比如LCD背光, 比如重力感应器, 触摸屏, 这些设备都会关掉, 但是系统可能还是在运行状态(这时候还有wake lock)进行任务的处理, 例如在扫描SD卡上的文件等. 在嵌入式设备中, 背光是一个很大的电源消耗,所以android会加入这样一种机制.

Late Resume

Late Resume 是和suspend 配套的一种机制, 是在内核唤醒完毕开始执行的. 主要就是唤醒在Early Suspend的时候休眠的设备.

Wake Lock

Wake Lock 在Android的电源管理系统中扮演一个核心的角色. Wake Lock是一种锁的机制, 只要有人拿着这个锁, 系统就无法进入休眠, 可以被用户态程序和内核获得. 这个锁可以是有超时的或者是没有超时的, 超时的锁会在时间过去以后自动解锁. 如果没有锁了或者超时了, 内核就会启动休眠的那套机制来进入休眠.

Android Suspend

当用户写入mem 或者standby到/sys/power/state中的时候, state_store()会被调用, 然后Android会在这里调用request_suspend_state() 而标准的Linux会在这里进入

enter_state()这个函数. 如果请求的是休眠, 那么early_suspend这个workqueue就会被调用,并且进入early_suspend状态.

void request_suspend_state(suspend_state_t new_state)

{

unsigned long irqflags;

int old_sleep;

spin_lock_irqsave(&state_lock, irqflags);

old_sleep = state & SUSPEND_REQUESTED;

if (debug_mask & DEBUG_USER_STATE) {

struct timespec ts;

struct rtc_time tm;

getnstimeofday(&ts);

rtc_time_to_tm(https://www.doczj.com/doc/9d16010726.html,_sec, &tm);

pr_info("request_suspend_state: %s (%d->%d) at %lld " "(%d-%02d-%02d %02d:%02d:%02d.%09lu UTC)\n", new_state != PM_SUSPEND_ON ? "sleep" : "wakeup", requested_suspend_state, new_state,

ktime_to_ns(ktime_get()),

tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec, https://www.doczj.com/doc/9d16010726.html,_nsec); }

if (!old_sleep && new_state != PM_SUSPEND_ON) {

state |= SUSPEND_REQUESTED;

queue_work(suspend_work_queue, &early_suspend_work); } else if (old_sleep && new_state == PM_SUSPEND_ON) {

state &= ~SUSPEND_REQUESTED;

wake_lock(&main_wake_lock);

queue_work(suspend_work_queue, &late_resume_work); }

requested_suspend_state = new_state;

spin_unlock_irqrestore(&state_lock, irqflags);

}

Early Suspend

在early_suspend()函数中, 首先会检查现在请求的状态还是否是suspend, 来防止suspend的请求会在这个时候取消掉(因为这个时候用户进程还在运行),如果需要退出, 就简单的退出了. 如果没有, 这个函数就会把early suspend中注册的一系列的回调都调用一次, 然后同步文件系统, 然后放弃掉main_wake_lock, 这个wake lock是一个没有超时的锁,如果这个锁不释放, 那么系统就无法进入休眠.

static void early_suspend(struct work_struct *work)

{

struct early_suspend *pos;

unsigned long irqflags;

int abort = 0;

mutex_lock(&early_suspend_lock);

spin_lock_irqsave(&state_lock, irqflags);

if (state == SUSPEND_REQUESTED)

state |= SUSPENDED;

else

abort = 1;

spin_unlock_irqrestore(&state_lock, irqflags);

if (abort) {

if (debug_mask & DEBUG_SUSPEND)

pr_info("early_suspend: abort, state %d\n", state);

mutex_unlock(&early_suspend_lock);

goto abort;

}

if (debug_mask & DEBUG_SUSPEND)

pr_info("early_suspend: call handlers\n");

list_for_each_entry(pos, &early_suspend_handlers, link) { if (pos->suspend != NULL)

pos->suspend(pos);

}

mutex_unlock(&early_suspend_lock);

if (debug_mask & DEBUG_SUSPEND)

pr_info("early_suspend: sync\n");

sys_sync();

abort:

spin_lock_irqsave(&state_lock, irqflags);

if (state == SUSPEND_REQUESTED_AND_SUSPENDED)

wake_unlock(&main_wake_lock);

spin_unlock_irqrestore(&state_lock, irqflags);

}

Late Resume

当所有的唤醒已经结束以后, 用户进程都已经开始运行了, 唤醒通常会是以下的几种原因: 来电

如果是来电, 那么Modem会通过发送命令给rild来让rild通知WindowManager有来电响应,这样就会远程调用PowerManagerService来写"on" 到/sys/power/state 来执行late resume的设备, 比如点亮屏幕等.

?用户按键用户按键事件会送到WindowManager中, WindowManager会处理这些按键事件,按键分为几种情况, 如果案件不是唤醒键(能够唤醒系统的按键) 那么

WindowManager会主动放弃wakeLock来使系统进入再次休眠, 如果按键是唤醒键,那么WindowManger就会调用PowerManagerService中的接口来执行Late Resume.

?Late Resume 会依次唤醒前面调用了Early Suspend的设备.

static void late_resume(struct work_struct *work)

{

struct early_suspend *pos;

unsigned long irqflags;

int abort = 0;

mutex_lock(&early_suspend_lock);

spin_lock_irqsave(&state_lock, irqflags);

if (state == SUSPENDED)

state &= ~SUSPENDED;

else

abort = 1;

spin_unlock_irqrestore(&state_lock, irqflags);

if (abort) {

if (debug_mask & DEBUG_SUSPEND)

pr_info("late_resume: abort, state %d\n", state); goto abort;

}

if (debug_mask & DEBUG_SUSPEND)

pr_info("late_resume: call handlers\n");

list_for_each_entry_reverse(pos, &early_suspend_handlers, link)

if (pos->resume != NULL)

pos->resume(pos);

if (debug_mask & DEBUG_SUSPEND)

pr_info("late_resume: done\n");

abort:

mutex_unlock(&early_suspend_lock);

}

Wake Lock

我们接下来看一看wake lock的机制是怎么运行和起作用的, 主要关注wakelock.c文件就可以了.

wake lock 有加锁和解锁两种状态, 加锁的方式有两种, 一种是永久的锁住, 这样的锁除非显示的放开, 是不会解锁的, 所以这种锁的使用是非常小心的. 第二种是超时锁, 这种锁会锁定系统唤醒一段时间, 如果这个时间过去了, 这个锁会自动解除.

锁有两种类型:

1. WAKE_LOCK_SUSPEND 这种锁会防止系统进入睡眠

2. WAKE_LOCK_IDLE 这种锁不会影响系统的休眠, 作用我不是很清楚.

在wake lock中, 会有3个地方让系统直接开始suspend(), 分别是:

1. 在wake_unlock()中, 如果发现解锁以后没有任何其他的wake lock了, 就开始休眠

2. 在定时器都到时间以后, 定时器的回调函数会查看是否有其他的wake lock, 如果没

有, 就在这里让系统进入睡眠.

3. 在wake_lock() 中, 对一个wake lock加锁以后, 会再次检查一下有没有锁, 我想这

里的检查是没有必要的, 更好的方法是使加锁的这个操作原子化, 而不是繁冗的检查.

而且这样的检查也有可能漏掉.

Suspend

当wake_lock 运行suspend()以后, 在wakelock.c的suspend()函数会被调用,这个函数首先sync文件系统,然后调用pm_suspend(request_suspend_state),接下来pm_suspend()就会调用enter_state()来进入Linux的休眠流程..

static void suspend(struct work_struct *work)

{

int ret;

int entry_event_num;

if (has_wake_lock(WAKE_LOCK_SUSPEND)) {

if (debug_mask & DEBUG_SUSPEND)

pr_info("suspend: abort suspend\n");

return;

}

entry_event_num = current_event_num;

sys_sync();

if (debug_mask & DEBUG_SUSPEND)

pr_info("suspend: enter suspend\n");

ret = pm_suspend(requested_suspend_state);

if (current_event_num == entry_event_num) {

wake_lock_timeout(&unknown_wakeup, HZ / 2);

}

}

Android于标准Linux休眠的区别

pm_suspend() 虽然会调用enter_state()来进入标准的Linux休眠流程,但是还是有一些区别:

?当进入冻结进程的时候, android首先会检查有没有wake lock,如果没有, 才会停止这些进程, 因为在开始suspend和冻结进程期间有可能有人申请了wake lock,如果是这样, 冻结进程会被中断.

?在suspend_late()中, 会最后检查一次有没有wake lock, 这有可能是某种快速申请wake lock,并且快速释放这个锁的进程导致的,如果有这种情况, 这里会返回错误, 整个suspend就会全部放弃.如果pm_suspend()成功了,LOG的输出可以通过在kernel cmd 里面增加"no_console_suspend" 来看到suspend和resume过程中的log输出。

标准linux休眠和唤醒机制分析

标准linux休眠和唤醒机制分析 说明: 1. Based on linux 2.6.32, only for mem(SDR) 2. 有兴趣请先参考阅读:电源管理方案APM和ACPI比较.doc Linux系统的休眠与唤醒简介.doc 3. 本文先研究标准linux的休眠与唤醒,android对这部分的增改在另一篇文章中讨论 4. 基于手上的一个项目来讨论,这里只讨论共性的地方 虽然linux支持三种省电模式:standby、suspend to ram、suspend to disk,但是在使用电池供电的手持设备上,几乎所有的方案都只支持STR模式(也有同时支持standby模式的),因为STD模式需要有交换分区的支持,但是像手机类的嵌入式设备,他们普遍使用nand 来存储数据和代码,而且其上使用的文件系统yaffs一般都没有划分交换分区,所以手机类设备上的linux都没有支持STD省电模式。 一、项目power相关的配置 目前我手上的项目的linux电源管理方案配置如下,.config文件的截图,当然也可以通过make menuconfig使用图形化来配置: # # CPU Power Management # # CONFIG_CPU_IDLE is not set # # Power management options

# CONFIG_PM=y # CONFIG_PM_DEBUG is not set CONFIG_PM_SLEEP=y CONFIG_SUSPEND=y CONFIG_SUSPEND_FREEZER=y CONFIG_HAS_WAKELOCK=y CONFIG_HAS_EARLYSUSPEND=y CONFIG_WAKELOCK=y CONFIG_WAKELOCK_STAT=y CONFIG_USER_WAKELOCK=y CONFIG_EARLYSUSPEND=y # CONFIG_NO_USER_SPACE_SCREEN_ACCESS_CONTROL is not set # CONFIG_CONSOLE_EARLYSUSPEND is not set CONFIG_FB_EARLYSUSPEND=y # CONFIG_APM_EMULATION is not set # CONFIG_PM_RUNTIME is not set CONFIG_ARCH_SUSPEND_POSSIBLE=y CONFIG_NET=y 上面的配置对应下图中的下半部分图形化配置。。。,看来是直接在Kconfig文件中删除了配置STD模式的选项。

Linux+Kernel+and+Android+休眠与唤醒实现与优化

Linux Kernel and Android 休眠与唤醒(中文版) 四月 18th, 2010 0 Comments/1664 hits Table of Contents ?简介 ?国际化 ?版本信息 ?对于休眠(suspend)的简单介绍 ?Linux Suspend 的流程 o相关的文件: o准备, 冻结进程 o让外设进入休眠 o Resume ?Android 休眠(suspend) o涉及到的文件: o特性介绍 ?Early Suspend ?Late Resume ?Wake Lock o Android Suspend o Early Suspend o Late Resume o Wake Lock o Suspend o Android于标准Linux休眠的区别 简介 休眠/唤醒在嵌入式Linux中是非常重要的部分,嵌入式设备尽可能的进入休眠状态来延长电池的续航时间.这篇文章就详细介绍一下Linux中休眠/唤醒是如何工作的, 还有Android中如何把这部分和Linux的机制联系起来的. 国际化 ?English Version: link ?中文版: link 作者: zhangjiejing Date: 2010-04-07, https://www.doczj.com/doc/9d16010726.html,

版本信息 ?Linux Kernel: v2.6.28 ?Android: v2.0 对于休眠(suspend)的简单介绍 在Linux中,休眠主要分三个主要的步骤: 1.冻结用户态进程和内核态任务 2.调用注册的设备的suspend的回调函数 o顺序是按照注册顺序 3.休眠核心设备和使CPU进入休眠态冻结进程是内核把进程列表中所有的 进程的状态都设置为停止,并且保存下所有进程的上下文. 当这些进程被 解冻的时候,他们是不知道自己被冻结过的,只是简单的继续执行.如何让 Linux进入休眠呢?用户可以通过读写sys文件/sys /power/state 是实 现控制系统进入休眠. 比如 命令系统进入休眠. 也可以使用 来得到内核支持哪几种休眠方式. Linux Suspend 的流程 相关的文件: 你可以通过访问Linux内核网站来得到源代码,下面是文件的路径: ?linux_soruce/kernel/power/main.c ?linux_source/kernel/arch/xxx/mach-xxx/pm.c ?linux_source/driver/base/power/main.c 接下来让我们详细的看一下Linux是怎么休眠/唤醒的. Let 's going to see how these happens.

android的休眠和唤醒

android休眠与唤醒驱动流程分析 标准linux休眠过程: ●power management notifiers are executed with PM_SUSPEND_PREPARE ●tasks are frozen ●target system sleep state is announced to the platform-handling code ●devices are suspended ●platform-specific global suspend preparation methods are executed ●non-boot CPUs are taken off-line ●interrupts are disabled on the remaining (main) CPU ●late suspend of devices is carried out (一般有一些BUS driver的动作进行)? ●platform-specific global methods are invoked to put the system to sleep 标准linux唤醒过程: ●t he main CPU is switched to the appropriate mode, if necessary ●early resume of devices is carried out (一般有一些BUS driver的动作进行)? ●interrupts are enabled on the main CPU ●non-boot CPUs are enabled ●platform-specific global resume preparation methods are invoked ●devices are woken up ●tasks are thawed ●power management notifiers are executed with PM_POST_SUSPEND 用户可以通过sys文件系统控制系统进入休眠: 查看系统支持的休眠方式: #cat /sys/power/state 常见有standby(suspend to RAM)、mem(suspend to RAM)和disk(suspend to disk),只是standby耗电更多,返回到正常工作状态的时间更短。 通过#echo mem > /sys/power/state 让系统进入休眠。 Android休眠与唤醒 android是在传统的linux内核电源管理设计的基础上,结合手机设计的实际需求而进化出的一套电源管理系统,其核心内容有:wakelock 、early_suspend与late_resume。 wakelock在Android的电源管理系统中扮演一个核心的角色。wakelock是一种锁的机制,只要有人拿着这个锁,系统就无法进入休眠,可以被用户态程序和内核获得。这个锁可以是有超时的或者是没有超时的,超时的锁会在时间过去以后自动解锁。如果没有锁了或者超时了,内核就会启动休眠的那套机制来进入休眠。 当系统在启动完毕后,会自己去加一把名为“main“的锁,而当系统有意愿去睡眠时则会先去释放这把“main”锁,在android中,在early_suspend的最后一步会去释放“main”锁(wake_unlock: main)。释放完后则会去检查是否还有其他存在的锁,如果没有则直接进入睡眠过程。 它的缺点是,如果有某一应用获锁而不释放或者因一直在执行某种操作而没时间来释放的话,则会导致系统一直进入不了睡眠状态,功耗过大。 early_suspend:先与linux内核的睡眠过程被调用。一般在手机系统的设计中对背光的操

Android休眠式快速开机设计讲座.doc

/ Android休眠式快速開機設計講座金融研訓院(台北市羅斯福路三段62號)/2011年9月9日/13:00-16:30 發票開立資料 公司抬頭統一編號 聯絡地址電話( ) 發票開立□兩聯式發票□三聯式發票團體報名是否 各別開立發票 □是□否 報名者資料 1 姓名部門職務 電話mail 2 姓名部門職務 電話mail Mail 3 姓名部門職務 電話mail 課程費用 □定價一人NT2,600元 9/1 (四)前報名享早鳥優惠價 □單人報名NT 2,200 ;□團體報名2人以上每人NT 2,000;□團體報名3人以上每人NT 1,800付款方式□ATM轉帳□匯款□支票□信用卡(請填寫信用卡授權單後傳真或MAIL) 付款資訊 .請於9/1(四) 前完成匯款 .戶名:遠播資訊股份有限公司 .銀行:國泰世華中山分行 .帳號:國泰世華013帳號042-03-500039-3匯款帳號末五碼匯款日期匯款金額 / / 課前問題 辦法希望講師說明之主題或問題(也可於報名後隨時來信提出) 問題填寫 零組件科技論壇VIP施行辦法 內容您是公司人事/教育訓練窗口嗎?可參加VIP計畫,取得同仁報名最低優惠價 勾選□我想參加VIP計畫,請寄合作方案給我□暫時不需要,謝謝□已參加聯絡人MAIL (請於此處填寫VIP合作方案寄送郵件地址) 報名注意事項 1.報名表填寫完畢請回寄至conny@https://www.doczj.com/doc/9d16010726.html,或傳真(02)2585-5519 2.研討會前三天寄發上課通知單,收到方完成報名手續,未收到請電洽(02)2585-5526 # 335 蔡岡陵小姐2.手開三聯式發票,當日於上課報到處領取

Linux Kernel and Android休眠与唤醒

Linux Kernel and Android休眠与唤醒时间:2010-06-26 21:47:04来源:网络作者:未知点击:1767次 版本信息 Linux Kernel: v2.6.28 Android: v2.0 对于休眠(suspend)的简单介绍 在Linux中,休眠主要分三个主要的步骤: Android 休眠(suspend) 在一个打过android补丁的内核中, state_store()函数会走另外一条路,会进入到request_suspend_state()中, 这个文件在earlysuspend.c中. 这些功能都是android系统加的, 后面会对earlysuspend和late resume 进行介绍. 涉及到的文件: linux_source/kernel/power/main.c linux_source/kernel/power/earlysuspend.c linux_source/kernel/power/wakelock.c 特性介绍 Early Suspend Early suspend 是android 引进的一种机制, 这种机制在上游备受争议,这里不做评论. 这个机制作用在关闭显示的时候, 在这个时候, 一些和显示有关的设备, 比如LCD背光, 比如重力感应器, 触摸屏, 这些设备都会关掉, 但是系统可能还是在运行状态(这时候还有wake lock)进行任务的处理, 例如在扫描SD卡上的文件等. 在嵌入式设备中, 背光是一个很大的电源消耗,所以android会加入这样一种机制.

Late Resume Late Resume 是和suspend 配套的一种机制, 是在内核唤醒完毕开始执行的. 主要就是唤醒在Early Suspend的时候休眠的设备. Wake Lock Wake Lock 在Android的电源管理系统中扮演一个核心的角色. Wake Lock是一种锁的机制, 只要有人拿着这个锁, 系统就无法进入休眠, 可以被用户态程序和内核获得. 这个锁可以是有超时的或者是没有超时的, 超时的锁会在时间过去以后自动解锁. 如果没有锁了或者超时了, 内核就会启动休眠的那套机制来进入休眠. Android Suspend 当用户写入mem 或者standby到/sys/power/state中的时候, state_store()会被调用, 然后Android会在这里调用request_suspend_state() 而标准的Linux会在这里进入enter_state()这个函数. 如果请求的是休眠, 那么early_suspend这个workqueue就会被调用,并且进入early_suspend状态. void request_suspend_state(suspend_state_t new_state) { unsigned long irqflags; int old_sleep; spin_lock_irqsave(&state_lock, irqflags); old_sleep = state & SUSPEND_REQUESTED; if (debug_mask & DEBUG_USER_STATE) { struct timespec ts; struct rtc_time tm; getnstimeofday(&ts); rtc_time_to_tm(https://www.doczj.com/doc/9d16010726.html,_sec, &tm); pr_info("request_suspend_state: %s (%d->%d) at %lld " "(%d-%02d-%02d %02d:%02d:%02d.%09lu UTC)",

Android Linux的休眠和唤醒

Android Linux的休眠和唤醒 Android下有三种省电方式: Early_suspend::主要是屏幕省电需要。进入early_suspend后,注册了early_suspend的外设进入休眠,大部分进程都还在运行,CPU处于正常工作状态。外设可以通过 register_early_suspend注册为early_suspend设备。 LPAUDION_MODE:系统进入early_suspend模式之后,通过has_audio_wake_lock判断是否进入LPAUDION_MODE模式,进入LPAUDION_MODE后,音乐正常播放,CPU 进入省电模式。 Suspend:系统运行状态保存到内存,CPU进入省电模式,所有外设电源关闭,只有内存保持供电和工作。 跟休眠唤醒相关的文件: /kernel/power/main.c /kernel/power/earlysuspend.c /kernel/power/wakelock.c /kernel/power/suspend.c /drivers/base/power/main.c /arch/arm/plat-samsung/pm.c /arch/arm/mach-s5pv210 /arch/arm/plat-s5p/sleep.s /arch/arm/mach-s5pv210/cpuidle.c Android linux休眠流程: 休眠的入口在/kernel/power/main.c的state_store函数。State_store函数通过 power_attr(state)宏,在sysfs中定义了一个属性。用户空间可以通过向state写入MEM,就可以使系统进入休眠状态。也可以通过cat state查看支持哪些休眠方式 在state_store函数中,调用request_suspend_state函数请求休眠。在request_suspend_state 中,如果判断到系统不处于休眠状态,则调用early_suspend。这里是通过将early_suspend 插入到休眠工作队列来实现调用的。 在early_suspend中,通过early_suspend设备链表依次调用设备各自的suspend函数(early_suspend设备通过register_early_suspend注册)。接下来判断是否申请了 audio_wake_lock,如果是,进入LPAUDIO_MODE模式。最后,调用 wake_unlock(&main_wake_lock) 在wake_unlock中,系统判断lock是否为0,若不为0,则系统处于early_suspend模式。因此,在kernel层,我们可以使用wake_lock去申请使系统不进入休眠;若为0则将suspend 插入工作队列(wakelock.c) Suspend函数中,调用pm_suspend,pm_suspend调用enter_state,准备进入休眠模式。到此为止,休眠进入标准的linux模式的休眠。在enter_state中,经过三步进入休眠 1.调用suspend_prepare 冻结用户程序。 2.调用dpm_suspend_start 分别调用设备的suspend函数 3.调用suspend_enter 进入suspend模式

Android系统的休眠

Thinking beyond Source Code 一个喜欢科学的家伙记录生活,技术,爱情,梦想的地方。 z Home z z Emacs配置 提交查询内容 Home androidlinux Linux Kernel and Android 休眠与唤醒(中文版) Linux Kernel and Android 休眠与唤醒(中文版) 四月 18th, 2010 0 Comments/155 hits Table of Contents z简介 z国际化 z版本信息 z对于休眠(suspend)的简单介绍 z Linux Suspend 的流程 {相关的文件: {准备, 冻结进程 {让外设进入休眠 {Resume z Android 休眠(suspend) {涉及到的文件: {特性介绍 Early Suspend Late Resume Wake Lock {Android Suspend {Early Suspend {Late Resume {Wake Lock {Suspend {Android于标准Linux休眠的区别 简介 休眠/唤醒在嵌入式Linux中是非常重要的部分,嵌入式设备尽可能的进入休眠状 态来延长电池的续航时间.这篇文章就详细介绍一下Linux中休眠/唤醒是如何工作 的, 还有Android中如何把这部分和Linux的机制联系起来的. 国际化 z English Version: link z中文版: link

作者: zhangjiejing Date: 2010-04-07, https://www.doczj.com/doc/9d16010726.html, 版本信息 z Linux Kernel: v2.6.28 z Android: v2.0 对于休眠(suspend)的简单介绍 在Linux 中,休眠主要分三个主要的步骤: 1.冻结用户态进程和内核态任务 2.调用注册的设备的suspend 的回调函数 {顺序是按照注册顺序 3.休眠核心设备和使CPU 进入休眠态冻结进程是内核把进程列表中所有的进程的状态都设置为停止,并且保存下所有进程的上下文. 当这些进程被解冻的时候,他们是不知道自己被冻结过的,只是简单的继续执行.如何让Linux 进入休眠呢?用户可以通过读写sys 文 件/sys /power/state 是实现控制系统进入休眠. 比如 命令系统进入休眠. 也可以使用 来得到内核支持哪几种休眠方式. Linux Suspend 的流程 相关的文件: 你可以通过访问 Linux 内核网站 来得到源代码,下面是文件的路径: z linux_soruce/kernel/power/main.c z linux_source/kernel/arch/xxx/mach-xxx/pm.c z linux_source/driver/base/power/main.c 接下来让我们详细的看一下Linux 是怎么休眠/唤醒的. Let 's going to see how these happens. 用户对于/sys/power/state 的读写会调用到 main.c 中的state_store(), 用户可以写入 const char * const pm_state[] 中定义的字符串, 比如"mem", "standby". 然后state_store()会调用enter_state(), 它首先会检查一些状态参数,然后同步文件系统. 下面是代码: # echo standby > /sys/power/state # cat /sys/power/state

linux驱动程序之电源管理之标准linux休眠与唤醒机制分析(一)

linux驱动程序之电源管理之标准linux休眠与唤醒机制分析 (一) linux驱动程序之电源管理之标准linux休眠与唤醒机制分析(一) 1. Based on linux 2.6.32, only for mem(SDR) 2. 有兴趣请先参考阅读:电源管理方案APM和ACPI比较.doc Linux系统的休眠与唤醒简介.doc 3. 本文先研究标准linux的休眠与唤醒,android对这部分的增改在另一篇文章中讨论 4. 基于手上的一个项目来讨论,这里只讨论共性的地方 虽然linux支持三种省电模式:standby、suspend to ram、suspend to disk,但是在使用电池供电的手持设备上,几乎所有的方案都只支持STR模式(也有同时支持standby模式的),因为STD模式需要有交换分区的支持,但是像手机类的嵌入式设备,他们普遍使用nand来存储数据和代码,而且其上使用的文件系统yaffs一般都没有划分交换分区,所以手机类设备上的linux都没有支持STD省电模式。

一、项目power相关的配置 目前我手上的项目的linux电源管理方案配置如下,.config 文件的截图,当然也可以通过make menuconfig使用图形化来配置: # # CPU Power Management # # CONFIG_CPU_IDLE is not set # # Power management options # CONFIG_PM=y # CONFIG_PM_DEBUG is not set CONFIG_PM_SLEEP=y CONFIG_SUSPEND=y CONFIG_SUSPEND_FREEZER=y CONFIG_HAS_WAKELOCK=y CONFIG_HAS_EARLYSUSPEND=y CONFIG_WAKELOCK=y CONFIG_WAKELOCK_STAT=y

待机与休眠死机或重启

待机与休眠死机或重启.txt39人生旅程并不是一帆风顺的,逆境失意会经常伴随着我们,但人性的光辉往往在不如意中才显示出来,希望是激励我们前进的巨大的无形的动力。40奉献是爱心,勇于付出,你一定会收到意外之外的馈赠。待机与休眠死机或重启 你试试下面的方法是否可以解决问题。 因为你的电脑主板BIOS启用了高级电源管理功能,同时windows系统也启用了高级电源管理功能,两者发生冲突造成死机或重启。 解决方法如下: 开机或重启电脑,按DEL键进入BIOS,找到“power managemant features”回车进入,把里面参数设置为“on”的项全部设置为“off”,按ESC返回上级界面,选择Save&exit step(保存设置),当然直接按F10也可以. 按Y回车.电脑自动重起登陆系统。 另一个原因,你的C盘空间不足也可引起休眠死机故障的发生,如果使用休眠功能,最少C 盘要保留1个G的使用空间。 如果使用待机与休眠功能,经常发生故障,尽量不要使用待机与休眠功能了,因为遇到这样的故障,是系统的本身故障造成的,有时无法修复,除非重装操作系统(如果故障依旧就要换系统安装盘了)。平是长时间不用就关机,短时间不用有屏幕保护呢。 屏幕保护,待机状态下死机的几个常见原因及解决方法 发布者:观兰电脑维修发布时间:2009-10-30 20:20:31 阅读:5次 屏幕保护状态下死机: 这很可能是系统的问题,当系统文件损坏,特别是部分屏保程序损坏时出现这问题。你可以尝试不使用屏保,当然,你点桌面属性,屏幕保护时想设置会出现死机现象,这时候你根本不能操作,你可以尝试在SYSTEM32下删除该程序,删除后就没有屏保程序了!你可以试着使用系统自带的!!当然了,解决该问题你也可以试着更新下芯片的驱动,一般VIA 的驱动最好使用4IN1的!!当然你可以直接重装系统 我一个朋友的电脑经常在屏幕保护后出现死机的现象,不但工作不能正常进行,而且还把正在调用的资料破坏了,这是怎么回事呢?经过仔细观察,发现并不是只要进行屏幕保护就会死机,这就说明死机故障与屏幕保护本身无关。 待机状态下: 我们所遇到的死机现象有真假两种,其中“假死机”实际上没有死,而是因为唤醒系统、启动硬盘、开启显示器等情况需要一定时间的等待,有些性子急的朋友往往在几秒钟之 内就判断它是死机了。

待机之后无法唤醒解决之一

待机之后无法唤醒解决之一 问:为什么进入桌面的“电源选项→休眠”选项后,“启用休眠支持”复选框为灰色不可选? 答:当前系统盘的剩余空间小于内存空间,而休眠时要将内存中的所有内容保存到硬盘上,所以硬盘剩余空间要大于等于内存的容量。清理磁盘,在系统盘中腾出足够的空间即可。 问:为什么我的Windows XP自动从待机状态恢复,但过了两分钟后又自动进入待机呢? 答:这一般是由于网卡的网络唤醒(Wake-on-LAN)功能导致的。请按下Win+Break组合键打开“系统属性”窗口,接着进入“硬件→设备管理器”,双击展开“网络适配器”,然后再双击其中的网卡项打开属性窗口,在“电源管理”选项卡中取消“允许这台设备使计算机脱离待机状态”的勾选。 问:为什么我的Windows XP在待机恢复后,无法识别USB存储设备呢? 答:如果你是这样的操作流程:将USB存储设备插入电脑→进入待机状态→在待机过程中取下存储设备并插入另外一个USB端口→从待机中恢复。便会遇到无法识别USB存储设备的故障。解决起来也很简单,只要将存储设备插回原来的USB端口即可。 另外,在Windows XP从待机和休眠中恢复回来时,请不要马上插入USB存储设备,这样会造成无法识别设备的问题。而应该等5秒钟以上。 问:为什么我的Windows 2000不能从待机状态中恢复回来? 答:Windows 2000对于BIOS中设定APM待机时间支持得不好。如果你在Windows“控制面板→电源选项”中启用了“高级电源管理”,而主板中设置的待机时间要短于电源选项中设置的时间,那么当你希望从Windows的待机模式中恢复的时候,会发现无法恢复成功,因为当前处于BIOS级别的待机,Windows系统无法干预它。 另外,Windows 2000的待机功能并不十分完善,比如:我们就曾经遇到过在采用待机后无法恢复,之后电脑再也无法正常关机。因此,建议最好在Windows 2000中少使用待机功能。 问:为什么我在Windows XP中选择重启,但电脑却进入了待机状态? 答:这个故障一般出现在点击“开始→关机”出现的关机对话框后,你不是用鼠标选择重启,而是直接用键盘的箭头按键选择到重启,然后再按下回车键。微软并没有给出解决办法或相关补丁,因此遇到此故障后,建议使用鼠标来选择“重新启动”,然后按单击“确定”按钮进行重启。

Android休眠suspend_console_kernel_log

休眠唤醒打开log调试: Kernel/power/suspend.c int suspend_devices_and_enter(suspend_state_t state) --> suspend_console(); void suspend_console(void) { if (!console_suspend_enabled) 注释这一行,可以看到休眠后printk的打印return; printk("Suspending console(s) (use no_console_suspend to debug)\n"); console_lock(); console_suspended = 1; up(&console_sem); } Kernel/drivers/base/power/main.c int dpm_suspend_start(pm_message_t state) { int error; error = dpm_prepare(state); if (!error) error = dpm_suspend(state); return error; } dpm_suspend() --> device_suspend() --> __device_suspend() static void pm_dev_dbg(struct device *dev, pm_message_t state, char *info) { dev_dbg(dev, "%s%s%s\n", info, pm_verb(state.event), ((state.event & PM_EVENT_SLEEP) && device_may_wakeup(dev)) ? ", may wakeup" : ""); } 改成 static void pm_dev_dbg(struct device *dev, pm_message_t state, char *info) { dev_printk(KERN_ERR,dev, "%s%s%s\n", info, pm_verb(state.event), ((state.event & PM_EVENT_SLEEP) && device_may_wakeup(dev)) ? ", may wakeup" : ""); }

4@标准linux休眠和唤醒机制分析

标准linux休眠和唤醒机制分析 标准linux休眠和唤醒机制分析(一) 说明: 1.Based on linux 2.6.32,only for mem(SDR) 2.有兴趣请先参考阅读:电源管理方案APM和ACPI比较.doc Linux系统的休眠与唤醒简介.doc 3.本文先研究标准linux的休眠与唤醒,android对这部分的增改在另一篇文章中讨论 4.基于手上的一个项目来讨论,这里只讨论共性的地方 虽然linux支持三种省电模式:standby、suspend to ram、suspend to disk,但是在使用电池供电的手持设备上,几乎所有的方案都只支持STR模式(也有同时支持standby模式的),因为STD模式需要有交换分区的支持,但是像手机类的嵌入式设备,他们普遍使用nand 来存储数据和代码,而且其上使用的文件系统yaffs一般都没有划分交换分区,所以手机类设备上的linux都没有支持STD省电模式。 一、项目power相关的配置 目前我手上的项目的linux电源管理方案配置如下,.config文件的截图,当然也可以通过make menuconfig使用图形化来配置: # #CPU Power Management # #CONFIG_CPU_IDLE is not set # #Power management options

# CONFIG_PM=y #CONFIG_PM_DEBUG is not set CONFIG_PM_SLEEP=y CONFIG_SUSPEND=y CONFIG_SUSPEND_FREEZER=y CONFIG_HAS_WAKELOCK=y CONFIG_HAS_EARLYSUSPEND=y CONFIG_WAKELOCK=y CONFIG_WAKELOCK_STAT=y CONFIG_USER_WAKELOCK=y CONFIG_EARLYSUSPEND=y #CONFIG_NO_USER_SPACE_SCREEN_ACCESS_CONTROL is not set #CONFIG_CONSOLE_EARLYSUSPEND is not set CONFIG_FB_EARLYSUSPEND=y #CONFIG_APM_EMULATION is not set #CONFIG_PM_RUNTIME is not set CONFIG_ARCH_SUSPEND_POSSIBLE=y CONFIG_NET=y 上面的配置对应下图中的下半部分图形化配置。。。,看来是直接在Kconfig文件中删除了配置STD模式的选项。

android 屏幕保持唤醒

Android电源管理(转) 一、相关概念 1. 出于节电的需要,一般应用在用户一段时间无操作的情况下屏幕变暗,然后进后休眠状态 2. 用户只能在”设置->声音和显示”中设置所有应用默认的屏幕亮度和进行待机的时间 3. 电源管理的实现分内核应用两部分,通过下面介绍的接口,我们可以设置应用程序的电源管理,以控制与其休眠相关的状态(是否需要进入休眠,调整cpu频率,键盘灯的开关,屏幕的亮暗等) 二、设置电源管理常用的几种状态 PARTIAL_WAKE_LOCK 屏幕关,键盘灯关,不休眠 SCREEN_MID_WAKE_LOCK 屏幕灰,键盘灯关,不休眠 SCREEN_BRIGHT_WEEK_LOCK 屏幕亮,键盘灯关,不休眠 FULL_WAKE_LOCK 屏幕亮,键盘灯亮,不休眠 三、使用电源管理注意事项 1. 可在onCreate时设置该界面的电源管理,在onDestroy时取消设置 2. 可在onResume时设置该界面的电源管理,在onPause时取消设置 3. 注意设置是以Activity为单位,不是以应用为单位 4. 注意在AndroidManifest.xml中声明该应用有设置电源管理的权限 5. 注意加锁解锁要成对出现 6. 注意多个用途最好用多个锁,不要一锁多用,以免出错 7. 注意对运行在后台和异常时对锁的处理 8. 注意在网络连接或传输时最好加锁,以免传输被中断 9. 注意加锁以保证程序逻辑 四、代码举例 1. 源码修改 1) 引入电源管理包,以使用相关类

view sourceprint? 1 import android.os.PowerManager; 2) 类中加入变量 view sourceprint? 2 PowerManager.WakeLock mWakeLock; 3) 修改onCreate view sourceprint? 1 publicvoidonCreate(Bundle savedInstanceState) { 2 super.onCreate(savedInstanceState ); 3 PowerManager pm = 4 (PowerManager) getSystemService(Context.POWER_SERVICE); 5 mWakeLock = pm.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK, 6 "XYTEST"); 7 mWakeLock.acquire(); 8 } 4) 修改onDestroy view sourceprint? 1 publicvoidonDestr oy() 2 { 3 super.onDestroy(); 4 mWakeLock.release(); 5 } 2. AndroidManifest.xml文件修改

zigbee的睡眠与唤醒

CC2530有3种睡眠模式,pm2模式比较省功耗而且可以被定时唤醒;pm3模式最省电但是只能被外部中断唤醒 1、sensordemo的sensor在入网以后,为什么灯在不断地闪? 其实,闪一次就是睡眠了一次:亮的时候睡过来,灭的时候睡下去。具体代码在halSleep函数里。要做的,就是读懂这个机制是怎么运作的。 2、为什么闪的频率那么高? zstack的睡眠机制就是在操作系统没事干的时候才睡眠,频率高说明应用程序让操作系统不断做事。你想让它长时间睡眠,那要做的就是不要不断地给操作系统事情做,找到分配系统任务的地方。 要设置低功耗模式,先确认: 1.f8wConfig.cfg文件中DRFD_RCVC_ALWAYS_ON定义为FALSE 2.Options->C/C++Compiler->Defined symbols中添加预编译“POWER_SAVING”;重要函数void halSleep( uint16 osal_timeout ) 1.首先将osal_timeout转成以320US为单位 2.获取下一次MAC定时器到期时间 3. halPwrMgtMode = (timeout == 0) ? HAL_SLEEP_DEEP : HAL_SLEEP_TIMER; //为PM2,PM3模式。没有任务要执行就进入PM3深度睡眠,否则进入PM2睡眠,可以定时器唤醒。 4.唤醒 OSAL机制的ZigBee低功耗管理(CC2530) 涉及文件 OSAL_PwrMgr.h OSAL电源管理的API头文件 OSAL_PwrMgr.C OSAL电源管理的API C文件 hal_sleep.c 底层的电源管理文件 电源管理结构体 typedef struct

Android 禁止屏幕休眠和锁屏的方法

Android 禁止屏幕休眠和锁屏的方法 Introduction 常常我们开发程序的时候我们不需要系统唤醒系统锁屏功能,比如我们在做xxxNowTV或XXX播放器这样的程序,用户有时候在看电视或视频的时候不希望系统的锁屏功能启动,既不想锁频,然而系统却在我们看电视或者视频的时候出来个锁屏的界面进行锁频拉,我们还要想继续看的话还要去解锁,这样好麻烦,不是我们想要的,那我们该怎么做呢,其实很简单,我这里只讲其中的两种 一:我们只要在程序中用代码实现。代码如下: [java:showcolumns:firstline[1]]view plaincopyprint?.........10........20........30........40........50........60........70........80........90........100.......110.......120.......130.......140. (150) 1. //方法一 getWindow().setFlags(https://www.doczj.com/doc/9d16010726.html,youtParams.FLAG_KEEP_SCREE N_ON, https://www.doczj.com/doc/9d16010726.html,youtParams.FLAG_KEEP_SCREEN_ON); setContentView(https://www.doczj.com/doc/9d16010726.html,yout.main); 2. //方法二 @Override protected void onResume() { super.onResume(); pManager = ((PowerManager) getSystemService(POWER_SERVICE));

linux 休眠唤醒

简介 国际化 版本信息 对于休眠(suspend)的简单介绍 Linux Suspend 的流程 相关的文件: 准备, 冻结进程 让外设进入休眠 Resume Android 休眠(suspend) 涉及到的文件: 特性介绍 Early Suspend Late Resume Wake Lock Android Suspend Early Suspend Late Resume Wake Lock Suspend Android于标准Linux休眠的区别 简介 休眠/唤醒在嵌入式Linux中是非常重要的部分,嵌入式设备尽可能的进入休眠状态来延长电池的续航时间.这篇文章就详细介绍一下Linux中休眠/唤醒是如何工作的, 还有Android中如何把这部分和Linux的机制联系起来的. 国际化 English Version: link 中文版: link 作者: zhangjiejing Date: 2010-04-07, https://www.doczj.com/doc/9d16010726.html, 版本信息 Linux Kernel: v2.6.28 Android: v2.0 对于休眠(suspend)的简单介绍 在Linux中,休眠主要分三个主要的步骤: 冻结用户态进程和内核态任务 调用注册的设备的suspend的回调函数 顺序是按照注册顺序 休眠核心设备和使CPU进入休眠态冻结进程是内核把进程列表中所有的进程的状态都设置为停止,并且保存下所有进程的上下文. 当这些进程被解冻的时候,他们是不知道自己被冻结过的,只是简单的继续执行.如何让Linux进入休眠呢?用户可以通过读写sys文件/sys /power/state 是实现控制系统进入休眠. 比如# echo standby > /sys/power/state

Rockchip 休眠唤醒 开发指南 V0.1-20160729

Rockchip 休眠唤醒开发指南 发布版本:0.1 日期:2016.07

前言概述 产品版本 读者对象 本文档(本指南)主要适用于以下工程师: 技术支持工程师 软件开发工程师 修订记录

目录 1休眠唤醒 .................................................................................................... 1-1 1.1概述.................................................................................................. 1-1 1.2重要概念............................................................................................. 1-1 1.3功能特点............................................................................................. 1-1 1.4开发指引............................................................................................. 1-1

Rockchip休眠唤醒开发指南1休眠唤醒 1休眠唤醒1.1概述 1.现在芯片级的休眠唤醒操作主要在ATF中,这部分代码是没有开放的,为满足不同的产品 需求,可以通过DTS配置系统SLEEP时进入不同的低功耗模式。 2.不同的项目对唤醒源的需求不同,在DTS中可以配置对应的唤醒源使能。 3.RK3399有4路PWM,不同的硬件上可能有用到若干路作为调压使用,为保证稳定性需 要再休眠之前必须设置PWM控制的几路电压为默认电压,唤醒恢复。 1.2重要概念 ●SLEEP mode:休眠模式,RK3399支持Core断电,Logic断电,DDR进入Retention 状态,OSC Disable(系统由32.768k时钟)。 ●唤醒源:系统处在休眠时,能耐唤醒系统的中断。 1.3功能特点 能较为灵活的定位问题,同一个IMG满足不同项目的要求。 1.4开发指引 在对应的DTS中做如下的配置: rockchip,sleep-mode-config:配置休眠时系统支持哪些低功耗操作,配置对应的功能,休眠时代码就会执行对应的流程; rockchip,wakeup-config:配置休眠时能唤醒系统的唤醒源,休眠时对应的唤醒源能够唤醒系统; rockchip,pwm-regulator-config :硬件中有哪一个PWM做调压功能,休眠之前会将这路电压恢复到默认电压。

相关主题
文本预览
相关文档 最新文档