娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

android休眠喚醒驅動流程分析

發布者:溫暖的微風最新更新時間:2024-11-07 來源: cnblogs關鍵字:android  休眠喚醒 手機看文章 掃描二維碼
隨時隨地手機看文章

標準linux休眠過程:

l        power management notifiers are executed with PM_SUSPEND_PREPARE

l        tasks are frozen

l        target system sleep state is announced to the platform-handling code

l        devices are suspended

l        platform-specific global suspend preparation methods are executed

l        non-boot CPUs are taken off-line

l        interrupts are disabled on the remaining (main) CPU

l        late suspend of devices is carried out (一般有一些BUS driver的動作進行)?

l        platform-specific global methods are invoked to put the system to sleep

 

標準linux喚醒過程:

l         the main CPU is switched to the appropriate mode, if necessary

l        early resume of devices is carried out (一般有一些BUS driver的動作進行)?

l        interrupts are enabled on the main CPU

l        non-boot CPUs are enabled

l        platform-specific global resume preparation methods are invoked

l        devices are woken up

l        tasks are thawed

l        power management notifiers are executed with PM_POST_SUSPEND

 

用戶可以通過sys文件系統控制系統進入休眠:

 

查看系統支持的休眠方式:

#cat /sys/power/state

常見有standby(suspend to RAM)、mem(suspend to RAM)和disk(suspend to disk),只是standby耗電更多,返回到正常工作狀態的時間更短。

通過 #echo mem > /sys/power/state  讓系統進入休眠。

 

Android休眠與喚醒

android是在傳統的linux內核電源管理設計的基礎上,結合手機設計的實際需求而進化出的一套電源管理系統,其核心內容有:wakelock 、early_suspend與late_resume。

wakelock在Android的電源管理系統中扮演一個核心的角色。wakelock是一種鎖的機制, 只要有人拿著這個鎖,系統就無法進入休眠,可以被用戶態程序和內核獲得。這個鎖可以是有超時的或者是沒有超時的,超時的鎖會在時間過去以后自動解鎖。如果沒有鎖了或者超時了,內核就會啟動休眠的那套機制來進入休眠。

當系統在啟動完畢后,會自己去加一把名為“main“的鎖,而當系統有意愿去睡眠時則會先去釋放這把“main”鎖,在android中,在early_suspend的最后一步會去釋放“main”鎖(wake_unlock: main)。釋放完后則會去檢查是否還有其他存在的鎖,如果沒有則直接進入睡眠過程。

它的缺點是,如果有某一應用獲鎖而不釋放或者因一直在執行某種操作而沒時間來釋放的話,則會導致系統一直進入不了睡眠狀態,功耗過大。

 

early_suspend:先與linux內核的睡眠過程被調用。一般在手機系統的設計中對背光的操作等采用此類方法,因為背光需要的能耗過大。當然此操作與late_resume是配套使用的。一些在內核中要預先進行處理的事件可以先注冊上early_suspend函數,當系統要進入睡眠之前會首先調用這些注冊的函數。

 

本文中,linux kernel版本為 linux-2.6.29,android版本為 android 2.1

與android休眠喚醒主要相關的文件主要有:

l        linux_source/kernel/power/main.c

l        linux_source/kernel/power/earlysuspend.c

l        linux_source/kernel/power/wakelock.c

l        linux_source/kernel/power/process.c

l        linux_source/driver/base/power/main.c

l        linux_source/arch/xxx/mach-xxx/pm.c或linux_source/arch/xxx/plat-xxx/pm.c

 

 

Android 休眠過程如下:

當用戶讀寫/sys/power/state時,linux_source/kernel/power/main.c中的state_store()函數會被調用。其中,android的early_suspend會執行request_suspend_state(state); 而標準的linux休眠則執行error = enter_state(state);

static ssize_t state_store(struct kobject *kobj, struct kobj_attribute *attr,

                   const char *buf, size_t n)

{

#ifdef CONFIG_SUSPEND

#ifdef CONFIG_EARLYSUSPEND

  suspend_state_t state = PM_SUSPEND_ON;

#else

  suspend_state_t state = PM_SUSPEND_STANDBY;

#endif

  const char * const *s;

#endif

  char *p;

  int len;

  int error = -EINVAL;

 

  p = memchr(buf, 'n', n);

  len = p ? p - buf : n;

 

  /* First, check if we are requested to hibernate */

  if (len == 4 && !strncmp(buf, 'disk', len)) {

         error = hibernate();

  goto Exit;

  }

 

#ifdef CONFIG_SUSPEND

  for (s = &pm_states[state]; state < PM_SUSPEND_MAX; s++, state++) {

         if (*s && len == strlen(*s) && !strncmp(buf, *s, len))

                break;

  }

  if (state < PM_SUSPEND_MAX && *s)

#ifdef CONFIG_EARLYSUSPEND

         if (state == PM_SUSPEND_ON || valid_state(state)) {

                error = 0;

                request_suspend_state(state);

         }

#else

         error = enter_state(state);

#endif

#endif

Exit:

  return error ? error : n;

}

 

 

在request_suspend_state(state)函數中,會調用early_suspend_work的工作隊列,從而進入early_suspend()函數中。

static DECLARE_WORK(early_suspend_work, early_suspend);

void request_suspend_state(suspend_state_t new_state)

{

  unsigned long irqflags;

  int old_sleep;

 

  spin_lock_irqsave(&state_lock, irqflags);

  old_sleep = state & SUSPEND_REQUESTED;

  if (debug_mask & DEBUG_USER_STATE) {

         struct timespec ts;

         struct rtc_time tm;

         getnstimeofday(&ts);

         rtc_time_to_tm(ts.tv_sec, &tm);

         pr_info('request_suspend_state: %s (%d->%d) at %lld '

                '(%d-%02d-%02d %02d:%02d:%02d.%09lu UTC)n',

                new_state != PM_SUSPEND_ON ? 'sleep' : 'wakeup',

                requested_suspend_state, new_state,

                ktime_to_ns(ktime_get()),

                tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday,

                tm.tm_hour, tm.tm_min, tm.tm_sec, ts.tv_nsec);

  }

  if (!old_sleep && new_state != PM_SUSPEND_ON) {

         state |= SUSPEND_REQUESTED;

         queue_work(suspend_work_queue, &early_suspend_work);

  } else if (old_sleep && new_state == PM_SUSPEND_ON) {

         state &= ~SUSPEND_REQUESTED;

         wake_lock(&main_wake_lock);

         queue_work(suspend_work_queue, &late_resume_work);

  }

  requested_suspend_state = new_state;

  spin_unlock_irqrestore(&state_lock, irqflags);

}

 

 

在early_suspend()函數中,首先要判斷當前請求的狀態是否還是suspend,若不是,則直接退出了;若是,函數會調用已經注冊的early_suspend的函數。然后同步文件系統,最后釋放main_wake_lock。

static void early_suspend(struct work_struct *work)

{

  struct early_suspend *pos;

  unsigned long irqflags;

  int abort = 0;

 

  mutex_lock(&early_suspend_lock);

  spin_lock_irqsave(&state_lock, irqflags);

  if (state == SUSPEND_REQUESTED)

         state |= SUSPENDED;

  else

         abort = 1;

  spin_unlock_irqrestore(&state_lock, irqflags);

 

  if (abort) {

         if (debug_mask & DEBUG_SUSPEND)

                pr_info('early_suspend: abort, state %dn', state);

         mutex_unlock(&early_suspend_lock);

         goto abort;

  }

 

  if (debug_mask & DEBUG_SUSPEND)

         pr_info('early_suspend: call handlersn');

  list_for_each_entry(pos, &early_suspend_handlers, link) {

         if (pos->suspend != NULL)

                pos->suspend(pos);

  }

  mutex_unlock(&early_suspend_lock);

 

  if (debug_mask & DEBUG_SUSPEND)

         pr_info('early_suspend: syncn');

 

  sys_sync();

abort:

  spin_lock_irqsave(&state_lock, irqflags);

  if (state == SUSPEND_REQUESTED_AND_SUSPENDED)

         wake_unlock(&main_wake_lock);

  spin_unlock_irqrestore(&state_lock, irqflags);

}

 

 

在wake_unlock()中,刪除鏈表中wake_lock節點,判斷當前是否存在wake_lock,若wake_lock的數目為0,則調用工作隊列suspend_work,進入suspend狀態。

static DECLARE_WORK(suspend_work, suspend);

void wake_unlock(struct wake_lock *lock)

{

  int type;

  unsigned long irqflags;

  spin_lock_irqsave(&list_lock, irqflags);

  type = lock->flags & WAKE_LOCK_TYPE_MASK;

#ifdef CONFIG_WAKELOCK_STAT

  wake_unlock_stat_locked(lock, 0);

#endif

  if (debug_mask & DEBUG_WAKE_LOCK)

         pr_info('wake_unlock: %sn', lock->name);

  lock->flags &= ~(WAKE_LOCK_ACTIVE | WAKE_LOCK_AUTO_EXPIRE);

  list_del(&lock->link);

  list_add(&lock->link, &inactive_locks);

  if (type == WAKE_LOCK_SUSPEND) {

         long has_lock = has_wake_lock_locked(type);

         if (has_lock > 0) {

                if (debug_mask & DEBUG_EXPIRE)

                       pr_info('wake_unlock: %s, start expire timer, '

                              '%ldn', lock->name, has_lock);

[1] [2] [3] [4] [5]
關鍵字:android  休眠喚醒 引用地址:android休眠喚醒驅動流程分析

上一篇:LED 將為我閃爍: 控制發光二級管
下一篇:基于gnu-arm-linux的LPC2220的簡單工程模板

推薦閱讀最新更新時間:2025-04-18 18:01

LG V60 ThinQ美版推送Android 12更新
盡管 LG 已經退出智能手機市場,但這家韓國公司對軟件支持的態度出奇地好,將為部分機型更新至 Android 12 甚至 Android 13。   近日,美版 LG V60 ThinQ 已經獲得了 Android 12 更新,大小為 1.17GB,包括 2022 年 3 月的安全補丁。官方在更新日志中沒有說明具體的更新內容,但預計將獲得原生 Android 12 的許多設計、隱私改進等。   IT之家了解到,LG V60 ThinQ 是該品牌的旗艦機型,搭載高通驍龍 865 處理器,6400 萬像素主攝,支持 OIS 光學防抖。這款手機具備專屬雙屏外殼套件,可自由變換使用方式,提高工作效率。存儲方面,手機配備 8G
[手機便攜]
谷歌Pixel 7 Pro渲染圖解密 外觀變化不大首發安卓13
近日有外媒爆料稱,谷歌即將在不久后推出全新的一代的Pixel旗艦。并且,也有網友曝光了新一代谷歌Pixel 7 Pro的渲染圖,一起來看看這部手機的外觀設計究竟如何! 通過渲染圖可以看到,谷歌Pixel 7 Pro的整體外觀設計基本與谷歌Pixel 6系列一致。它的正面采用一塊挖孔屏,屏占比看上去很高,背部則采用長條形的影像系統。但與上一代不同的是,谷歌Pixel 7 Pro的影像系統開孔采用了“感嘆號”形狀,并且內部的長焦鏡頭也采用潛望式長焦,配合谷歌提供的軟件支撐,拍攝表現值得期待。 在硬件層面,去年發布的谷歌Pixel 6首發了自研Tensor芯片,因此今年谷歌Pixel 7系列大概也會采用這款自研芯片。同時,谷歌P
[手機便攜]
谷歌確認,Android 12L將首批登陸三星、聯想與微軟設備
谷歌的 Android 工程副總裁 Andrei Popescu 宣布,三星 (Samsung)、聯想 (Lenovo) 和微軟 (Microsoft) 將會首批推出安卓 12L 系統,正式版預計將會在今年晚些時候到來,新系統旨在為平板電腦和可折疊設備提供更好的優化。   聯想已經有多款平板電腦已經可以運行 Android 12L 測試版,因此首批推出 Android 12L 并不算意外,只是目前還不清楚其他兩家公司的哪些設備將獲得更新,預計微軟 Surface Duo / 2、三星的 Galaxy Tab 平板電腦或 Z Fold 系列手機可能會獲得更新。   Android 12L 將帶來多種新功能,可以幫助你更好地
[手機便攜]
微信安卓8.0.18版適配OPPO Find N,支持平行視窗雙欄顯示
微信安卓 8.0.18 版于 1 月 13 日正式發布,將“我”標簽中的支付改為服務,同時搜一搜功能支持通過拍照進行物品或商品搜索。   根據一加劉作虎的消息,新版微信已經適配 OPPO Find N 折疊屏手機,支持平板模式、平行視窗功能。在內屏使用微信時,左側為聊天列表,右側可顯示具體聊天內容。   IT之家獲悉,用戶更新微信 8.0.18 版之后,需要到設置→大屏專區開啟微信的平行視窗功能。登錄微信后,手機上的微信即為平板版本,可實現分欄顯示。   用戶在視頻聊天、瀏覽文章時,左側屏幕依舊顯示正常的聊天窗口,大大提高使用效率,視頻聊天兩不誤。
[手機便攜]
微信<font color='red'>安卓</font>8.0.18版適配OPPO Find N,支持平行視窗雙欄顯示
Android 12翻車!用戶更新后后悔 bug太多
據PhoneArena報道,在安裝了最新版Android 12操作系統之后,多名用戶反映自己的谷歌Pixel設備出現了嚴重問題。 這些設備包括谷歌Pixel 3、Pixel 4 XL、Pixel 4a、Pixel 4、Pixel 5等等,以Pixel 4系列為例,這款手機在更新Android 12之后,3D人臉識別停止工作,Pixel 4a 5G更新后則是續航大幅縮水,一些應用程序會閃退。 更糟糕的是Pixel 5,用戶反映該手機更新到Android 12之后出現應用崩潰的bug,即便是恢復了出廠設置仍然無濟于事。 谷歌方面表示,該問題可能是Android 12與第三方應用程序不兼容導致。 開發者表示,Android 12目前才剛
[手機便攜]
<font color='red'>Android</font> 12翻車!用戶更新后后悔 bug太多
中國五大移動應用商店攜手啟動64位安卓生態遷移
(2021年4月19日)為協助中國安卓開發者無縫對接全球64位開發環境,并進一步向終端用戶提供最佳體驗,中國五大移動應用商店(排名不計先后)—小米應用商店、OPPO軟件商店、vivo應用商店、騰訊應用寶、百度手機助手,于今日共同宣布,今后發布于各應用商店的所有應用必須有序支持64位Arm架構,今年底前全體應用及游戲均需按計劃上傳含有64位構建的APK(涵蓋存量應用更新及新版本發布),以便中國市場上所有的移動安卓應用程序能在2022年8月底前為64位架構的全面普及做好準備,從而緊隨全球移動科技領域的發展趨勢,更好更快地為中國數億手機用戶提供沉浸式的使用體驗。此前,Arm于2020年10月首次揭曉,所有Arm? Cortex?-A C
[手機便攜]
中國五大移動應用商店攜手啟動64位<font color='red'>安卓</font>生態遷移
安卓取代者:谷歌Fuchsia OS操作系統獲藍牙認證
Android雖然由谷歌操盤,但這套系統實質上基于Linux,且因為Java使用的問題,甲骨文一直沒有放棄對谷歌的訴訟。   于是,放棄Linux內核,基于Zircon微核,采用Flutter引擎+Dart語言編寫的Fuchsia OS便浮出水面,它有著取代Android、Chrome OS等系統、可跨平臺運行的定位。   經查,沉寂一段時間后,Fuchsia OS的最新動態曝光,其通過了藍牙5.0認證,“Sapphire”是Fuchsia藍牙堆棧的代號。   業內觀點認為,Fuchsia已經處于內部測試階段,事實上早在2018年,谷歌就通過一次秘密非公開活動展示了帶GUI的系統基本形態。   不過,Fuchsia OS
[手機便攜]
<font color='red'>安卓</font>取代者:谷歌Fuchsia OS操作系統獲藍牙認證
利用STM32F4和Android控制六足機器人演示介紹
利用和控制六足機器人 六足機器人又叫蜘蛛機器人,是多足機器人的一種。仿生式六足機器人,顧名思義,六足機器人在我們理想架構中,我們借鑒了自然界。
[機器人]
小廣播
設計資源 培訓 開發板 精華推薦

最新單片機文章
何立民專欄 單片機及嵌入式寶典

北京航空航天大學教授,20余年來致力于單片機與嵌入式系統推廣工作。

 
EEWorld訂閱號

 
EEWorld服務號

 
汽車開發圈

 
機器人開發圈

電子工程世界版權所有 京ICP證060456號 京ICP備10001474號-1 電信業務審批[2006]字第258號函 京公網安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 景洪市| 河间市| 富阳市| 中山市| 伊春市| 江都市| 深泽县| 志丹县| 诏安县| 泊头市| 江阴市| 比如县| 上虞市| 马关县| 冕宁县| 崇文区| 临清市| 尖扎县| 六盘水市| 金溪县| 龙胜| 长汀县| 明溪县| 吴川市| 堆龙德庆县| 东山县| 屏南县| 虹口区| 成武县| 双牌县| 屏东县| 绥棱县| 三门县| 石楼县| 永泰县| 铅山县| 曲阳县| 平定县| 安国市| 巴里| 齐齐哈尔市|