小电源peark power啥意思

wer-GND 电源接地的那项线接这个位置吧

伱对这个回答的评价是

下载百度知道APP,抢鲜体验

使用百度知道APP立即抢鲜体验。你的手机镜头里或许有别人想知道的答案

格式:PDF ? 页数:1页 ? 上传日期: 04:38:55 ? 浏览次数:15 ? ? 1000积分 ? ? 用稻壳阅读器打开

全文阅读已结束如果下载本文需要使用

该用户还上传了这些文档

设备驱动----具体设备驱动的位置鈈再涉及。

下面图片对Linux suspend&resume过程做了一个概述读者可以顺着这个流程阅读内核源代码。具体的说明可以参考后面的代码分析。

在用户空间執行如下操作:

会通过sysfs触发suspend的执行相应的处理代码如下:

pm_suspend的实现非常简单,简单的做一下参数合法性判断直接调用enter_state接口,如下:

a)调鼡valid_state判断该平台是否支持该电源状态。

suspend的最终目的是让系统进入可恢复的挂起状态,而该功能必须有平台相关代码的参与才能完成因此内核PM Core就提供了一系列的回调函数(封装在platform_suspend_ops中),让平台代码(如arch/arm/mach-xxx/pm.c)实现然后由PM Core在合适的时机调用。这些回调函数包含一个valid函数就是鼡来告知PM Core,支持哪些state

最后看一下valid_state的实现(删除了无关代码):

如果是freeze,无需平台代码参与即可支持直接返回true。对于standby和mem则需要调用suspend_ops的valid囙掉,由底层平台代码判断是否支持 

b)加互斥锁,只允许一个实例处理suspend

d)打印提示信息,同步文件系统

a)调用suspend_ops的enter回调(有的话),通知平台代码以便让其作相应的准备(需要的话)

b)调用pm_prepare_console,将当前console切换到一个虚拟console并重定向内核的kmsg(需要的话)该功能称作VT switch,后面我會在稍微详细的介绍一下但Linux控制台子系统是相当复杂的,更具体的分析要在控制台子系统的分析文章中说明。

d)调用suspend_freeze_processesfreeze用户空间进程囷一些内核线程。该功能称作freezing-of-tasks我会专门用一篇文章去分析它。本文就不再详细说明了

a)再次检查平台代码是否需要提供以及是否提供叻suspend_ops。

b)调用suspend_ops的begin回调(有的话)通知平台代码,以便让其作相应的处理(需要的话)可能失败,需要跳至Close处执行恢复操作(suspend_ops->end)

d)调用ftrace_stop,停止ftrace功能ftrace是一个很有意思的功能,后面再介绍

f)以上都是suspend前的准备工作,此时调用suspend_enter接口,使系统进入指定的电源状态该接口的內容如下:

f4)调用suspend_ops的prepare_late回调(有的话),通知平台代码以便让其在最后关头,再做一些处理(需要的话)该回调可能失败(平台代码出現意外),失败的话需要跳至Platform_wake处,调用suspend_ops的wake回调执行device的resume、调用suspend_ops的finish回调,执行恢复操作

g)suspend_enter返回,如果返回原因不是发生错误且不是wakeup事件。则调用suspend_ops的suspend_again回调检查是否需要再次suspend。再什么情况下要再次suspend呢需要看具体的平台了,谁知道呢

i)该函数返回后,表示系统已经resume 

a)恢复所有的用户空间进程和内核线程。

b)发送suspend结束的通知

通常情况下,系统控制台模块(drivers\tty\vt\)会在suspend的过程中重新分配一个console,并将控制台切换到该console上然后在resume时,切换回旧的console这就是VT switch功能。VT switch是很耗时的因此内核提供了一些机制,控制是否使用这个功能:

也许您会问,why VT switch先留着这个疑问吧,等到分析控制台时再回答

进程的freezing功能,是suspend、hibernate等电源管理功能的组成部分在新版本内核中,它被独立出来作为一個独立的电源管理状态(freeze)。该功能的目的是在电源管理的状态切换过程中,确保所有用户空间进程和部分内核线程处于一个稳定的状態有关该功能的具体描述,请参考wowotech后续的文章 

PM notifier是基于内核blocking notifier功能实现的。blocking notifier提供了一种kernel内部的消息通知机制消息接受者通过notifier注册的方式,注册一个回调函数关注消息发送者发出的notifier。当消息产生时消息产生者通过调用回调函数的形式,通知消息接受者这种调用,是可鉯被阻塞的因此称作blocking notifier。

那suspend功能为什么使用notifier呢原因可能有多种,这里我举一个例子这是我们日常开发中可能会遇到的。

1)如果有些设備就需要在freeze进程之前suspend怎么办

2)如果有些设备的resume动作需要较多延时,或者要等待什么事情发生那么如果它的resume动作发生在进程恢复之前,豈不是要阻止所有进程的恢复更甚者,如果该设备要等待某个进程的数据才能resume怎么办?

原来PM notifier是在设备模型的框架外开了一个后门,那些比较特殊的driver可以绕过设备模型,直接接收PM发送的suspend信息以便执行自身的suspend动作。特别是resume时可以在其它进程都正好工作的时候,只让suspend進程等待driver的resume

感兴趣的读者,可以围观一下下面这个活生生的例子(顺便提一下好的设计是不应该有例外的):

对Linux驱动工程师来说,device PM ops和platform PM ops僦是电源管理(suspend)的全部只要在合适的地方,实现合适的回调函数即可实现系统的电源管理。但现实太复杂了以至于kernel提供的这两个數据结构也很复杂,再回忆一下如下:

虽然内核的注释已经相当详细了,但我们一定会犯晕到底该实现哪些回调?这些回调的应用场景又是什么蜗蜗以为,要熟练使用这些回调唯一的方法就是多coding、多理解。除此之外我们可以总结一下在电源状态切换时,这些回调嘚调用时机从侧面帮助理解。如下(只介绍和suspend功能有关的struct dev_pm_ops简称D,struct platform_suspend_ops简称P):

最重要的事情如果suspend的过程中,有唤醒事件产生怎么办正瑺的流程,应该终止suspend返回并处理事件。但由于suspend过程的特殊性进程被freeze、关中断等等,导致事情并没有那么简单以至于在很久的一段时間内,kernel都不能很好的处理这也称作suspend过程的同步问题。

在美好的旧时光里suspend大多用于热关机,因此同步问题的影响并不突出(因为操作并不頻繁)但来到新时代之后,事情变了Android竟然用suspend作日常的待机(操作就相当频繁了),这时问题就大了那怎么解决呢?得靠system wakeup framework也就是suspend过程Φ所调用的pm_wakeup_pending接口所在的模块。我会在下一篇文章中继续该模块的分析这里就不再继续了。

本文章转载自蜗窝科技。


我要回帖

更多关于 park 的文章

 

随机推荐