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

3.2 实现自己的autosleep框架

在本节,我们通过相关数据结构、变量、函数设计来聚焦自研autosleep的实现。首先我们要梳理出实现的关键组成部分,然后再动手实现。

3.2.1 动手前的思考

在3.1节中,我们介绍了Linux autosleep的功能实现和工作机制。如果我们使用的系统不是Linux而是其他系统,且这个系统碰巧缺少类似autosleep的机制,那么我们能否借鉴这个优秀的功能呢?当然是可以的。其实autosleep的关键实现在于以下3点:

1)需要一个工作队列或者任务来负责触发进入睡眠流程。

2)需要一个配套的持锁机制来提供接口,以判断是否满足睡眠入口条件。

3)需要配套的PM Core提供进入睡眠流程的接口(具体实现见第4章)。

可以看到autosleep在这个过程中起到的是衔接的作用,先判断是否满足睡眠条件。如果满足则进入PM Core流程;如果不满足,就等待下次触发调度。既然梳理清楚了工作流程,接下来我们就来动手实现我们自己的autosleep。

3.2.2 设计与实现

1.结构体设计

我们要设计一个结构体,来维护autosleep相关关键信息和维测记录。

相关变量说明如下。

autosleep_in_cnt:记录进入autosleep的次数。

autosleep_out_cnt:记录退出autosleep的次数。

autosleep_task:记录创建的autosleep任务句柄。

设计完结构体,我们会定义一个该类型的全局变量来维护autosleep的模块内部信息:

2.关键函数设计

(1)my_autosleep_init

该函数主要负责autosleep模块初始化。

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

具体实现代码段如下所示:

(2)task_handler

该函数是实际任务处理的函数体实现。

任务函数通常并不会返回,而是一个等待条件→运行→等待条件的循环体。

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

该函数的工作流程如图3-3所示。

图3-3 task_handler工作流程图 YkY4Xa3LMCkO5cHxOtKDDIEsHED+tDSkys4/qRD66LzpPJQXpJT0yQmqBHLb3ifq

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