在本节,我们通过相关数据结构、变量、函数设计来聚焦自研autosleep的实现。首先我们要梳理出实现的关键组成部分,然后再动手实现。
在3.1节中,我们介绍了Linux autosleep的功能实现和工作机制。如果我们使用的系统不是Linux而是其他系统,且这个系统碰巧缺少类似autosleep的机制,那么我们能否借鉴这个优秀的功能呢?当然是可以的。其实autosleep的关键实现在于以下3点:
1)需要一个工作队列或者任务来负责触发进入睡眠流程。
2)需要一个配套的持锁机制来提供接口,以判断是否满足睡眠入口条件。
3)需要配套的PM Core提供进入睡眠流程的接口(具体实现见第4章)。
可以看到autosleep在这个过程中起到的是衔接的作用,先判断是否满足睡眠条件。如果满足则进入PM Core流程;如果不满足,就等待下次触发调度。既然梳理清楚了工作流程,接下来我们就来动手实现我们自己的autosleep。
我们要设计一个结构体,来维护autosleep相关关键信息和维测记录。
相关变量说明如下。
autosleep_in_cnt:记录进入autosleep的次数。
autosleep_out_cnt:记录退出autosleep的次数。
autosleep_task:记录创建的autosleep任务句柄。
设计完结构体,我们会定义一个该类型的全局变量来维护autosleep的模块内部信息:
该函数主要负责autosleep模块初始化。
返回0表示执行初始化成功,返回其他值表示初始化失败。通常在系统初始化阶段调用。
具体实现代码段如下所示:
该函数是实际任务处理的函数体实现。
任务函数通常并不会返回,而是一个等待条件→运行→等待条件的循环体。
task_handler的相关设计实现代码段如下所示:
该函数的工作流程如图3-3所示。
图3-3 task_handler工作流程图