精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Linux是休眠/喚醒的步驟解析

454398 ? 來(lái)源:博客園 ? 作者:Shimejing ? 2020-10-08 09:52 ? 次閱讀

Linux中,休眠主要分三個(gè)主要的步驟:(1)凍結(jié)用戶態(tài)進(jìn)程和內(nèi)核態(tài)任務(wù);(2)調(diào)用注冊(cè)的設(shè)備的suspend的回調(diào)函數(shù);(3)按照注冊(cè)順序休眠核心設(shè)備和使CPU進(jìn)入休眠態(tài)。 凍結(jié)進(jìn)程是內(nèi)核把進(jìn)程列表中所有的進(jìn)程的狀態(tài)都設(shè)置為停止,并且保存下所有進(jìn)程的上下文。當(dāng)這些進(jìn)程被解凍的時(shí)候,他們是不知道自己被凍結(jié)過(guò)的,只是簡(jiǎn)單的繼續(xù)執(zhí)行。如何讓Linux進(jìn)入休眠呢?用戶可以通過(guò)讀寫sys文件/sys /power/state 是實(shí)現(xiàn)控制系統(tǒng)進(jìn)入休眠。比如: # echo standby 》 /sys/power/state命令系統(tǒng)進(jìn)入休眠。也可以使用 # cat /sys/power/state來(lái)得到內(nèi)核支持哪幾種休眠方式。

Linux Suspend 的流程。相關(guān)的文件的路徑: linux_soruce/kernel/power/main.c linux_source/kernel/arch/xxx/mach-xxx/pm.c

linux_source/driver/base/power/main.c

(1)接下來(lái)讓我們?cè)敿?xì)的看一下Linux是怎么休眠/喚醒的。

用戶對(duì)于/sys/power/state 的讀寫會(huì)調(diào)用到 main.c中的state_store(),用戶可以寫入 const char * const pm_state[] 中定義的字符串,比如“mem”、 “standby”。然后state_store()會(huì)調(diào)用enter_state(),它首先會(huì)檢查一些狀態(tài)參數(shù),然后同步文件系統(tǒng)。

(2)準(zhǔn)備凍結(jié)進(jìn)程。

當(dāng)進(jìn)入到suspend_prepare()中以后,它會(huì)給suspend分配一個(gè)虛擬終端來(lái)輸出信息,然后廣播一個(gè)系統(tǒng)要進(jìn)入suspend的Notify,關(guān)閉掉用戶態(tài)的helper進(jìn)程,然后一次調(diào)用suspend_freeze_processes()凍結(jié)所有的進(jìn)程,這里會(huì)保存所有進(jìn)程 當(dāng)前的狀態(tài),也許有一些進(jìn)程會(huì)拒絕進(jìn)入凍結(jié)狀態(tài),當(dāng)有這樣的進(jìn)程存在的時(shí)候,會(huì)導(dǎo)致凍結(jié)失敗,此函數(shù)就會(huì)放棄凍結(jié)進(jìn)程,并且解凍剛才凍結(jié)的所有進(jìn)程。

(3)讓外設(shè)進(jìn)入休眠。

現(xiàn)在,所有的進(jìn)程(也包括workqueue/kthread) 都已經(jīng)停止了,內(nèi)核態(tài)任務(wù)有可能在停止的時(shí)候握有一些信號(hào)量,所以如果這時(shí)候在外設(shè)里面去解鎖這個(gè)信號(hào)量有可能會(huì)發(fā)生死鎖,所以在外設(shè)的suspend()函數(shù)里面作lock/unlock鎖要非常小心,這里建議設(shè)計(jì)的時(shí)候就不要在suspend()里面等待鎖。 最后會(huì)調(diào)用suspend_devices_and_enter()來(lái)把所有的外設(shè)休眠,在這個(gè)函數(shù)中,如果平臺(tái)注冊(cè)了suspend_pos(通常是在板級(jí)定義中定義和注冊(cè)),這里就會(huì)調(diào)用suspend_ops-》begin(),然后driver/base/power/main.c 中的 device_suspend()-》dpm_suspend() 會(huì)被調(diào)用,他們會(huì)依次調(diào)用驅(qū)動(dòng)的suspend() 回調(diào)來(lái)休眠掉所有的設(shè)備。當(dāng)所有的設(shè)備休眠以后,suspend_ops-》prepare()會(huì)被調(diào)用,這個(gè)函數(shù)通常會(huì)作一些準(zhǔn)備工作來(lái)讓板機(jī)進(jìn)入休眠。接下來(lái)Linux,在多核的CPU中的非啟動(dòng)CPU會(huì)被關(guān)掉,通過(guò)注釋看到是避免這些其他的CPU造成race condion,接下來(lái)的以后只有一個(gè)CPU在運(yùn)行了。 suspend_ops 是板級(jí)的電源管理操作,通常注冊(cè)在文件 arch/xxx/mach-xxx/pm.c 中。接下來(lái),suspend_enter()會(huì)被調(diào)用,這個(gè)函數(shù)會(huì)關(guān)閉arch irq,調(diào)用 device_power_down(),它會(huì)調(diào)用suspend_late()函數(shù),這個(gè)函數(shù)是系統(tǒng)真正進(jìn)入休眠最后調(diào)用的函數(shù),通常會(huì)在這個(gè)函數(shù)中作最后的檢查。如果檢查沒(méi)問(wèn)題,接下來(lái)休眠所有的系統(tǒng)設(shè)備和總線,并且調(diào)用 suspend_pos-》enter() 來(lái)使CPU進(jìn)入省電狀態(tài)。這時(shí)候,就已經(jīng)休眠了,代碼的執(zhí)行也就停在這里了。

(4)Resume。

如果在休眠中系統(tǒng)被中斷或者其他事件喚醒,接下來(lái)的代碼就會(huì)開(kāi)始執(zhí)行,這個(gè)喚醒的順序是和休眠的順序相反的,所以系統(tǒng)設(shè)備和總線會(huì)首先喚醒,使能系統(tǒng)中斷,使能休眠時(shí)候停止掉的非啟動(dòng)CPU,以及調(diào)用suspend_ops-》finish(),而且在suspend_devices_and_enter()函數(shù)中也會(huì)繼續(xù)喚醒每個(gè)設(shè)備,使能虛擬終端。最后調(diào)用 suspend_ops-》end()。再返回到enter_state()函數(shù)中的,當(dāng)suspend_devices_and_enter() 返回以后,外設(shè)已經(jīng)喚醒了,但是進(jìn)程和任務(wù)都還是凍結(jié)狀態(tài),這里會(huì)調(diào)用suspend_finish()來(lái)解凍這些進(jìn)程和任務(wù),而且發(fā)出Notify來(lái)表示系統(tǒng)已經(jīng)從suspend狀態(tài)退出,喚醒終端。到這里,所有的休眠和喚醒就已經(jīng)完畢了,系統(tǒng)繼續(xù)運(yùn)行了。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • cpu
    cpu
    +關(guān)注

    關(guān)注

    68

    文章

    10825

    瀏覽量

    211157
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11229

    瀏覽量

    208931
  • 休眠
    +關(guān)注

    關(guān)注

    0

    文章

    5

    瀏覽量

    8428
  • 休眠喚醒
    +關(guān)注

    關(guān)注

    0

    文章

    8

    瀏覽量

    7547
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    干貨分享 | TSMaster—LIN 喚醒休眠機(jī)制

    在汽車總線中常見(jiàn)的喚醒方式有硬線喚醒、網(wǎng)絡(luò)喚醒和特定信號(hào)喚醒,而LIN總線則是通過(guò)休眠幀與喚醒
    的頭像 發(fā)表于 09-25 08:03 ?1360次閱讀
    干貨分享 | TSMaster—LIN <b class='flag-5'>喚醒</b>與<b class='flag-5'>休眠</b>機(jī)制

    STM32休眠不能喚醒的原因?

    休眠之后,會(huì)拉低相關(guān)的GPIO,確保省電;配置一些外部中斷,用來(lái)喚醒停止模式;休眠前寫入一個(gè)值到備份寄存器。 然后休眠休眠26秒后,看門狗
    發(fā)表于 05-13 08:47

    解析OMAPL138的休眠喚醒的過(guò)程!

    外設(shè)的PSC!現(xiàn)在不知道是什么原因!麻煩你們看一下這個(gè)問(wèn)題! 或者有什么參考的例子! 可以詳細(xì)的說(shuō)一下OMAPL138的休眠喚醒的過(guò)程!謝謝了!
    發(fā)表于 08-22 12:51

    如何作休眠定時(shí)喚醒

    芯片休眠前,打開(kāi)全局中斷使能和定時(shí)器0中斷使能,定時(shí)器0時(shí)鐘源選擇內(nèi)部32768 WDT時(shí)鐘,僅當(dāng)內(nèi)部WDT晶振打開(kāi)時(shí)有效,芯片通過(guò)定時(shí)器0間斷喚醒。這樣休眠功耗較低,增加5uA左右。
    發(fā)表于 03-24 14:03

    Wi-Fi休眠喚醒失敗的問(wèn)題該如何去解決呢

    R18公板使用RTL8723ds模組,通過(guò)Wi-Fi ping的方式喚醒失敗。Wi-Fi喚醒的一般測(cè)試步驟有哪些呢?Wi-Fi休眠喚醒失敗的
    發(fā)表于 12-29 06:35

    CH582M freeRTOS如何實(shí)現(xiàn)休眠休眠后如何喚醒

    有以下以后望解答:如何實(shí)現(xiàn)休眠休眠后如何喚醒?目前嘗試用裸機(jī)例程中的休眠函數(shù),僅LowPower_Shutdown(0); 可以正常睡眠并且成功
    發(fā)表于 08-01 06:19

    lightsleep休眠不同喚醒方式的功耗問(wèn)題求解

    我用arduino對(duì)esp32c3開(kāi)發(fā)板進(jìn)行編程測(cè)試lightsleep的休眠功耗,GPIO2口接紅外,發(fā)現(xiàn)了一個(gè)問(wèn)題,當(dāng)我僅使用GPIO喚醒時(shí),休眠后電流為5.16ma,僅使用Timer喚醒
    發(fā)表于 03-07 07:07

    基于S3C2440和WindowsCE5.0的平臺(tái)休眠喚醒方案

    ]。Windows CE 作為一個(gè)廣泛應(yīng)用于嵌入式設(shè)備上的操作系統(tǒng),提供了完善的電源管理功能。其中,休眠喚醒便是一個(gè)重要的功能。本文在結(jié)合S3C2440硬件基礎(chǔ)上分析休眠喚醒過(guò)程,分別
    發(fā)表于 10-31 15:51 ?0次下載
    基于S3C2440和WindowsCE5.0的平臺(tái)<b class='flag-5'>休眠</b><b class='flag-5'>喚醒</b>方案

    MSP430休眠喚醒裝置設(shè)計(jì)詳析

    針對(duì)礦用救災(zāi)指揮裝置網(wǎng)絡(luò)視頻服務(wù)器采用電池供電工作時(shí)間短的缺點(diǎn), 采用 MSP430 低功耗單片機(jī)設(shè)計(jì)了一種休眠喚醒裝置, 實(shí)現(xiàn)了網(wǎng)絡(luò)視頻服務(wù)器的休眠喚醒功能, 延長(zhǎng)了網(wǎng)絡(luò)視頻服務(wù)器電
    發(fā)表于 04-24 14:27 ?14次下載
    MSP430<b class='flag-5'>休眠</b><b class='flag-5'>喚醒</b>裝置設(shè)計(jì)詳析

    Linux Kernel suspend/resume 過(guò)程

    休眠/喚醒在嵌入式Linux中是非常重要的部分,嵌入式設(shè)備盡可能的進(jìn)入休眠狀 態(tài)來(lái)延長(zhǎng)電池的續(xù)航時(shí)間.這篇文章就詳細(xì)介紹一下Linux
    發(fā)表于 05-08 14:25 ?2172次閱讀

    單片機(jī)休眠喚醒二三事

    想知道單片機(jī)休眠如何像吃了德芙一樣絲滑么?想讓你的單片機(jī)產(chǎn)品在合適的時(shí)候休眠待機(jī)不再失眠么?想讓你的單片機(jī)項(xiàng)目隨叫隨醒不再怠惰長(zhǎng)眠么?答案-關(guān)于單片機(jī)休眠喚醒的配置都在這里了
    發(fā)表于 12-20 19:00 ?24次下載
    單片機(jī)<b class='flag-5'>休眠</b>與<b class='flag-5'>喚醒</b>二三事

    LIN控制器休眠喚醒類型方式及測(cè)試案例

    雖然新架構(gòu)的發(fā)展促進(jìn)著通信技術(shù)的升級(jí)換代,但作為車載通信技術(shù)的常青樹(shù)之一的LIN通信,由于其自身的特點(diǎn),將會(huì)繼續(xù)發(fā)光發(fā)熱。其中LIN的休眠喚醒作為整車休眠喚醒的重要組成部分,需引起開(kāi)發(fā)
    的頭像 發(fā)表于 12-16 09:18 ?1816次閱讀

    網(wǎng)絡(luò)關(guān)閉但ECU沒(méi)有休眠前如何進(jìn)行網(wǎng)絡(luò)喚醒呢?

    最近在做CAN網(wǎng)絡(luò)管理的工作,發(fā)現(xiàn)網(wǎng)絡(luò)休眠(關(guān)閉)后在ECU系統(tǒng)沒(méi)有休眠/下電前如果又收到了NM報(bào)文,ECU的網(wǎng)絡(luò)沒(méi)有被重新喚醒(開(kāi)啟)
    的頭像 發(fā)表于 03-29 09:06 ?2894次閱讀

    ECU系統(tǒng)休眠后通過(guò)診斷報(bào)文喚醒ECU且喚醒網(wǎng)絡(luò)

    ECU系統(tǒng)休眠后TJA1043的INH腳處于floating高阻態(tài),系統(tǒng)休眠后通過(guò)硬件外部電路下拉到低電平狀態(tài)/Low-level,ECU系統(tǒng)休眠前把TJA1043的INH腳配置為喚醒
    的頭像 發(fā)表于 04-04 09:40 ?8218次閱讀

    LIN休眠喚醒及測(cè)試心得

    這次我們的介紹主題是LIN休眠喚醒,一起看看標(biāo)準(zhǔn)和差異性,開(kāi)發(fā)和測(cè)試的關(guān)系,實(shí)際的案例分享也來(lái)了。
    的頭像 發(fā)表于 11-23 08:43 ?1098次閱讀
    LIN<b class='flag-5'>休眠</b><b class='flag-5'>喚醒</b>及測(cè)試心得