购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

4.2 实现自己的PM Core框架

前边我们分析了Linux内核的PM Core工作机制,对其涉及的主要数据类型、主要函数及处理流程有了一定的了解,能够在Linux系统下快速地使能低功耗特性。不过这只是我们的目的之一,我们还有一个目的,就是将Linux内核的优秀思想用在其他系统中,设计和开发属于我们自己的低功耗框架。

4.2.1 动手前的思考

在第1章中,我们知道要使能一个系统的低功耗睡眠/唤醒特性,需要用到wakeup source模块、DPM模块、syscore模块、CPUIdle模块(或者其他触发进入睡眠的任务)、CPU模块(负责从核的去使能与使能以及核相关的睡眠与唤醒流程)等,也需要PM Core流程来把这些模块组合起来以提供可以运行的全功能特性,这里我们简单回顾下低功耗主流程的组成及时序关系,如图4-5所示。

图4-5 低功耗主流程的组成及时序关系

4.2.2 运行时序设计

确定了特性的组成模块,接下来的工作就是把这些模块组合起来,基本思想如下:

1)sleep task负责进入PM Core流程。

2)PM Core负责去使能从核。

3)PM Core调用PM notifier,执行注册相关的一些notifier回调函数。

4)PM Core调用DPM回调,实现平台注册的DPM的suspend和resume流程。

5)PM Core负责调用syscore回调,实现平台注册的syscore级别的suspend/resume流程(可选)。

6)PM Core最后进入平台相关的CPU suspend流程(在CPU模块中实现),针对CPU相关的suspend动作需要认真梳理,否则可能会出现各种异常,包括但不限于l1cache、gic cpu interface、退出smp等。

7)向低功耗控制核请求下电。

8)唤醒流程为睡眠流程的逆流程,这里不再赘述。

自研睡眠流程时序图如图4-6所示。

4.2.3 设计与实现

1.主要结构体设计

(1)pm_core_debug_s结构体

首先需要定义一个pm_core_debug_s结构体来记录PM Core流程中的各种统计信息,比如进入睡眠和唤醒的次数、睡眠失败的次数等。

图4-6 自研睡眠流程时序图

实现代码段如下所示:

每个成员变量的用途可参见代码注释,在实际使用时,我们可以根据需要对变量进行动态添加和删除。

(2)pm_core_suspend_ops结构体

我们还需要设计一个pm_core_suspend_ops结构体,来记录不同平台各自注册的平台相关的低功耗处理回调函数。

结构体中每个变量的用途可参见代码注释,在实际使用时,我们可以根据需要对变量进行动态添加和删除。

2.主要接口设计

(1)suspend_enter

该函数为PM Core主入口,供sleep task直接调用。(sleep task在autosleep中实现,或者由idle任务直接调用。)

函数执行失败时返回错误码,执行成功则进入睡眠状态,当被唤醒后才返回执行成功的返回值。

相关设计实现伪码如下所示:

思考

d i s a b le_nonboot_cpu该如何实现呢?在实时操作系统中,实现机制可能和Linux完全不同,需要开发者根据不同平台做好定制化实现,可能与CPU的个数、芯片逻辑的部署等相关。需要注意的是,在睡眠流程中一定要在做DPM备份公共外设区之前把nonboot CPU关闭,然后在唤醒流程中要在DPM恢复公共外设区之后再使能nonboot CPU。

(2)set_platform_suspend_ops

设置与platform CPU相关的变量,供不同平台在设计自己的低功耗处理函数时调用,一旦设计成功,系统低功耗流程将会在睡眠流程的最深处调用。

当入参为非法值时返回-1,执行成功时返回0。

相关设计实现代码段如下所示:

(3)pm_core_init

主要负责与PM Core本模块相关的初始化功能。

执行成功时返回0,返回其他值则表示失败。通常在系统初始化时调用。

相关设计实现的原型如下: 6nl4iwFns26SlGtuZ2yp/Fd79ZP4qje7bbZd0tAaJhFIifo0Y4UN4byADEyevoEW

点击中间区域
呼出菜单
上一章
目录
下一章
×