仿照linux dpm机制,实现自己的dpm【转】

简介:

转自:http://blog.csdn.net/lixiaojie1012/article/details/23788713

前边我们讨论分析了linux 内核的dpm实现,分析的目的在于学以致用;在好多实时操作系统中,并没有dpm这个框架,所以我们可以仿照linux的dpm框架,来实现我们自己的dpm,可以运用到需要dpm的系统中。

 知识点:链表,回调函数,函数指针,互斥锁,锁中断

为便于描述,本文使用伪代码,仅个别地方具体实现;

 

1、首先,我们需要定义两个结构体类型,一个用于控制,一个用于各个模块注册;

      (1)控制结构体

               struct my_dpm{

                       list_head    dpm_list;

                       list_head    prepare_list;

                       list_head   early_list;

                       list_head    suspend_list;

                       list_head    late_list;

                       spinlock_t      lock_mutx;

               }dpm_ctrl;

         (2)各模块注册dpm使用的结构体

               struct dpm_device{

                        char *device_name;

                         list_head     entry;

                         void *data;

                         int  (*prepare)(struct dpm_device *dev);

                         int  (*suspend_early)(struct dpm_device *dev);

                         int (*suspend)(struct dpm_device *dev);

                         int (*suspend_late)(struct dpm_device *dev);

                        int  (*resume_early)(struct dpm_device *dev);

                         int  (*resume)(struct dpm_device *dev);

                         int  (*resume_late)(struct dpm_device *dev);

                         int  (*complete)(struct dpm_device *dev);

               };

2、OK,结构体我们已经定义完了,那么我们接下来需要初始化一下控制结构体的变量

                int  my_dpm_init(void){

                       初始化五个链表;

                       初始化spin_lock锁;

                       return OK;

                }

3、到此,我们自己的dpm已初始化完成,各个模块想要注册dpm,就差一个注册接口了,下面我们来实现注册接口

              int dpm_register(struct dpm_device *device

                  获取互斥锁;

                  初始化设备结构体中的entry;

                  加入到dpm_list链表中;

                 释放互斥锁;

                 return OK;

           }

 4、这样,用户就可以调用dpm_register来注册dpm了;但是注册完后,得需要提供接口来供低功耗流程来调用啊,莫急,我们这就来实现供低功耗调用的接口,    dpm_suspend和dpm_resume

       (1)dpm_suspend:主要回调各个模块注册的保存信息的回调函数,包括prepare、suspend_early、suspend、suspend_late

                 int dpm_suspend(void){

                      if(prepare())

                               return -1;

                      if(suspend_early())

                                return -1;

                      if(suspend())

                               return -1;

                      if(suspend_late())

                                return -1;

                       return 0;

                    }

         (2)dpm_resume:主要用在唤醒阶段,按照优先级回调各个模块注册的恢复信息的回调函数,包括resume_early、resume、resume_late、complete

                 int dpm_resume(void)

                {

                       if(resume_early())

                               return -1;

                      if(resume())

                                return -1;

                      if(resume_late())

                               return -1;

                      if(complete())

                                return -1;

                       return 0;

                }

5、大家可以看到,上面两个接口中分别调用了4个函数,供8个函数,分别用在suspend阶段和resume阶段,接下来我们简单实现一下其中一个函数prepare

        int prepare(void)

       {

              获取互斥锁;

              遍历dpm_list链表,检查每个结点是否注册prepare回调函数,如果注册,则执行回调函数:ret=dev->prepare(dev),如果成功,则移入prepare_list,否则,执行恢复操作;

              释放互斥锁;

        }

        其他的suspend_early()、suspend()、suspend_late()、resume()、resume_early()、resume_late()、complete()等具体函数实现基本大致相同,只不过所操作的链表不同罢了。

 

好了,我们的dpm框架实现完成了,简单吧,我们尝试注册一个吧:

int my_prepare(struct dpm_device *dev){}

int my_suspend dpm_device *dev){}

int my_resumet dpm_device *dev){}

int my_completedpm_device *dev){}

 

               struct dpm_device test_device={

                     .device_name = "my_test_device";

                     .prepare = my_prepare;

                     .suspend = mysuspend;

                    .resume = my_resume;

                   .omplete = my_complete;

};

在合适的地方调用dpm_register(&test_device)即可,需要注意的是,dpm回调函数注册一定要配对:prepare--complete       suspend--resume        suspend_late--resume_early                suspend_late--resume_early











本文转自张昺华-sky博客园博客,原文链接:http://www.cnblogs.com/sky-heaven/p/5333668.html,如需转载请自行联系原作者

相关文章
|
1月前
|
消息中间件 Unix Linux
Linux进程间通信(IPC)介绍:详细解析IPC的执行流程、状态和通信机制
Linux进程间通信(IPC)介绍:详细解析IPC的执行流程、状态和通信机制
55 1
|
4月前
|
存储 缓存 Linux
哇~~真的是你呀!今天是LInux安装方法和systemd管理机制。
Linux服务安装和systemd管理机制是Linux操作系统中重要的服务管理机制。systemd是Linux下一种基本的系统服务管理器,负责管理Linux中的各种服务,如进程管理、启动和停止服务、日志记录、挂载文件系统等等。在systemd中,每个服务都以一个Unit的形式存在,Unit定义了该服务相关的一些属性,如服务名称、启动脚本的路径、依赖关系等。
82 0
哇~~真的是你呀!今天是LInux安装方法和systemd管理机制。
|
5月前
|
Linux 编译器 API
深度剖析Linux内核同步机制:实现高效可靠的并发编程
深度剖析Linux内核同步机制:实现高效可靠的并发编程
|
6月前
|
Linux
Linux多线程同步机制(下)
Linux多线程同步机制(下)
34 0
|
1月前
|
资源调度 算法 Linux
Linux进程/线程的调度机制介绍:详细解析Linux系统中进程/线程的调度优先级规则
Linux进程/线程的调度机制介绍:详细解析Linux系统中进程/线程的调度优先级规则
92 0
|
3天前
|
缓存 Linux
linux系统缓存机制
linux系统缓存机制
|
9天前
|
算法 Linux 调度
深入理解Linux内核的进程调度机制
【4月更文挑战第17天】在多任务操作系统中,进程调度是核心功能之一,它决定了处理机资源的分配。本文旨在剖析Linux操作系统内核的进程调度机制,详细讨论其调度策略、调度算法及实现原理,并探讨了其对系统性能的影响。通过分析CFS(完全公平调度器)和实时调度策略,揭示了Linux如何在保证响应速度与公平性之间取得平衡。文章还将评估最新的调度技术趋势,如容器化和云计算环境下的调度优化。
|
14天前
|
算法 Linux 调度
深度解析:Linux内核的进程调度机制
【4月更文挑战第12天】 在多任务操作系统如Linux中,进程调度机制是系统的核心组成部分之一,它决定了处理器资源如何分配给多个竞争的进程。本文深入探讨了Linux内核中的进程调度策略和相关算法,包括其设计哲学、实现原理及对系统性能的影响。通过分析进程调度器的工作原理,我们能够理解操作系统如何平衡效率、公平性和响应性,进而优化系统表现和用户体验。
20 3
|
1月前
|
监控 算法 Unix
【Linux 异步操作】深入理解 Linux 异步通知机制:原理、应用与实例解析
【Linux 异步操作】深入理解 Linux 异步通知机制:原理、应用与实例解析
61 0
|
1月前
|
开发框架 算法 Linux
【知识点回顾 】Qt信号槽与Linux信号处理 的处理机制 深入探讨
【知识点回顾 】Qt信号槽与Linux信号处理 的处理机制 深入探讨
36 0