Linux省电相关idle和suspend

suspend流程借用其他图和链接,比较详细了http://www.wowotech.net/linux_kenrel/suspend_and_resume.html

我这边记录下wakelock的相关接口和suspend过程中的frozenthread实现原理,还有部分idle流程。

wakelock内核和应用使用的相关接口
static inline void wake_lock(struct wake_lock *lock)
{
	__pm_stay_awake(&lock->ws);
}

static inline void wake_lock_timeout(struct wake_lock *lock, long timeout)
{
	__pm_wakeup_event(&lock->ws, jiffies_to_msecs(timeout));
}

static inline void wake_unlock(struct wake_lock *lock)
{
	__pm_relax(&lock->ws);
}
wakelock通过一个32位值来表示,高16位表示总的wakeevent发生次数,低16位标志当前置位的wakelock数量
没有wakelock时候触发suspend流程

wakeup.c可以看wakelock当前状态,是debug接口

在kernel\power\main.c封装着给应用层使用的接口,应用通过写文件来设置wakelock,/sys/power/wake_lock|wake_unlock
#ifdef CONFIG_PM_WAKELOCKS
static ssize_t wake_lock_show(struct kobject *kobj,
                  struct kobj_attribute *attr,
                  char *buf)
{
    return pm_show_wakelocks(buf, true);
}
static ssize_t wake_lock_store(struct kobject *kobj,struct kobj_attribute *attr,const char *buf, size_t n)
{
    int error = pm_wake_lock(buf);
    return error ? error : n;
}
power_attr(wake_lock);
static ssize_t wake_unlock_show(struct kobject *kobj,struct kobj_attribute *attr,char *buf)
{
    return pm_show_wakelocks(buf, false);
}
static ssize_t wake_unlock_store(struct kobject *kobj,struct kobj_attribute *attr,const char *buf, size_t n)
{
    int error = pm_wake_unlock(buf);
    return error ? error : n;
}
power_attr(wake_unlock);


在suspend流程中的suspend_prepare->suspend_freeze_processes会冻结线程
freeze_processes
freeze_kernel_threads
...
pm_freezing = true;
...
freeze_task
对于用户线程:
    if (!(p->flags & PF_KTHREAD)) {
        fake_signal_wake_up(p);
发送一个空的信号给各个应用线程
信号处理中do_signal,调用接口设置当前线程为unint,然后切换出去
try_to_freeze_nowarn
__refrigerator
    set_current_state(TASK_UNINTERRUPTIBLE);
    schedule();

对于内核线程,要宽松的多,主要操作只是唤醒int状态的线程,然后由线程自己去处理
freeze_task
    wake_up_state(p, TASK_INTERRUPTIBLE);
线程创建的时候需要如下:
while(kthread_freezable_should_stop)
{
    ...
}
kthread_freezable_should_stop
__refrigerator
set_current_state(TASK_UNINTERRUPTIBLE);
current->flags |= PF_FROZEN;

这样线程就不会参与调度了,切出去后不会再加入就绪队列,等到系统resume的时候再反过来依次恢复线程状态


cpu_suspend(0, XX_finish_suspend)
cpu_suspend(0, XX_finish_suspend)
cpu_suspend(0, XX_finish_suspend)





关于降低功耗,除了suspend,还可以让系统进入idle,毕竟suspend属于深度睡眠,进入和退出的成本都比较高。

当线程处于无事可做的时候,系统会调度到idle线程,idle线程中可以进入arm的wfi模式,具体的进入的低功耗模式还跟实际的体系架构有关,可以实现多级,每级有他对应的功耗级别和退出延迟值,系统根据运行情况选择进入哪种模式。

cpu_idle
tick_nohz_idle_enter
...
cpuidle_idle_call
    next_state = cpuidle_curr_governor->select(drv, dev)
    cpuidle_enter_state(dev, drv, next_state)    //选择调用定制的低功耗模式,如果没有的话会进入默认的wfi模式
...
tick_nohz_idle_exit
接口类型如下:
struct cpuidle_state {
    char        name[CPUIDLE_NAME_LEN];
    char        desc[CPUIDLE_DESC_LEN];

    unsigned int    flags;
    unsigned int    exit_latency; /* in US */
    int        power_usage; /* in mW */
    unsigned int    target_residency; /* in US */
    unsigned int    disable;

    int (*enter)    (struct cpuidle_device *dev,
            struct cpuidle_driver *drv,
            int index);

    int (*enter_dead) (struct cpuidle_device *dev, int index);
};









  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python IDLE是Python的集成开发环境(Integrated Development Environment),它提供了一个交互式的Python解释器和代码编辑。引用中提到了在Python IDLE下调用anaconda中的库的教程,这对于使用Python进行数据分析和科学计算的人们来说具有很好的参考价值。 另外,Python有多种实现方式。其中最常见的是CPython,它是用C语言实现的Python解释器。除此之外,还有其他实现方式,如用Java实现的JPython和用.NET实现的IronPython等。这些不同的实现方式提供了更多的选择和灵活性。引用 此外,Python PEP(Python Enhancement Proposal)文档对Python的发展起到了重要的作用。PEP主要用于通知Python核心开发者的重要信息,标准化代码风格、文档或其他指导意见,以及对提交的功能进行说明。所有提交过的PEP都被汇总在PEP 0文档中。引用<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [了解python及其IDLE的使用](https://blog.csdn.net/cloudless_sky/article/details/116082968)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [在Python IDLE 下调用anaconda中的库教程](https://download.csdn.net/download/weixin_38607311/12854569)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值