1. 程式人生 > >CPUIDLE 之低功耗定時器

CPUIDLE 之低功耗定時器

在 Linux 作業系統中,Idle 程序(又叫 Swapper 程序)的 pid 號是 0,是所有程序的祖先,它是在 Linux 初始化階段從無到有建立的一個核心執行緒。stark_kernel() 函式初始化核心需要的所有資料結構,啟用中斷,建立另一個叫程序 1 的核心執行緒(init 程序)。新建立核心執行緒的 PID 為 1,並與程序 0 共享程序所有的核心資料結構。建立 init 程序後,程序 0 執行無限迴圈, cpu_idle_loop() 函式,只有當沒有其它程序處於 TASK_RUNNING 狀態時,排程器才會選擇程序 0,也就是執行 Idle 執行緒,讓 CPU 進入 Idle 模式。
當 CPU 進入比較深層次的 Idle 模式時,為了達到最大程度的節省功耗,CPU 會把系統時鐘給關閉掉。那麼怎麼保證 CPU 從 Idle 模式重新進入工作模式,從而保證系統正常執行呢?本文主要探討低功耗定時器在該情況下扮演什麼樣的角色。
Idle的執行流程
這裡先大概的列出 Idle 程序的執行流程,怎麼執行到讓 CPU 進入各級 Idle 模式。
Idle 程序建立
Linux Kernel 會在系統啟動完成後,在 Idle 程序中,處理 CPUIdle 相關的事情。在多核系統中,CPU 啟動的過程是,先啟動主 CPU,啟動過程和傳統的單核系統類似。其函式呼叫關係如下:
stext –> start_kernel –> rest_init –> cpu_startup_entry
而啟動其它 CPU,可以有多種方式,例如 CPU hotplug 等,啟動過程:
secondary_startup –> __secondary_switched –> secondary_start_kernel –> cpu_startup_entry
無論是上述的哪種啟動,最終都會執行至 cpu_startup_entry 函式,在這個函式中,最終程式會掉進無限迴圈裡 cpu_idle_loop。到此,Idle 程序建立完成。
Tickless 和 CPUIdle 的關係
Tickless 是指動態時鐘,即系統的週期 Tick 可動態地關閉和開啟。這個功能可通過核心配置項 CONFIG_NO_HZ 開啟,而 Idle 正是使用了這項技術,使系統儘量長時間處於空閒狀態,從而儘可能地節省功耗.
開啟核心配置項 CONFIG_NO_HZ_IDLE,即可讓系統在 Idle 前關閉週期 Tick,退出 Idle 時重新開啟週期 Tick。
那麼在關閉了週期 Tick 之後,系統何時被喚醒呢?
在關閉週期 Tick 時,同時會根據時鐘子系統計算下一個時鐘中斷到來的時間,以這個時間為基準來設定一個 hrtimer 用於喚醒系統(高精度時鐘框架),而這個時間的計算方法也很簡單,即在所有註冊到時鐘框架的定時器中找到離此時最近的那一個的時間點作為這個時間。當然,用什麼定時器來喚醒系統還要根據 CPU Idle 的深度來決定,後面會介紹。
不同層級的 CPU Idle 對喚醒時鐘源的處理
前面提到了,系統關閉週期 Tick 的同時,會計算出下一個時鐘中斷到來的時間,以這個時間為基準來設定一個 hrtimer 用於喚醒系統。那麼,如果有些 CPU 進入的層級比較深,關閉了 CPU 中的 hrtimer,系統將無法再次被喚醒。針對這種情況,則需要低功耗 Timer 去喚醒系統,這裡先以 MTK 平臺為例,在 CPU 進入 dpidle 和 soidle (兩種 Idle 模式)時都會關閉 hrtimer ,另外起用一個 GPT Timer,而這個 GPT Timer 的超時時間直接從被關閉的 hrtimer 中的暫存器獲取。這樣就保證時間的延續性。因為 GPT Timer 是以 32K 晶振作為時鐘源,所以在 CPU 進入 dpidle 時可以把 26M 的主時鐘源給關閉,從而達到最大程度的省電。
以下我們通過原始碼探討一下 MTK 的 CPU Idle 的實現,到底哪裡設定 GPT Timer。其實很多平臺為了實現 CPU 達到最省電的效果,都是使用這種做法。
MTK 的 CPU 一般有以下幾種 Idle 模式
rgidle,淺度 Idle 模式,即 WFI
soidle,亮屏 Idle 模式
dpidle,滅屏 Idle 模式

相關推薦

CPUIDLE 功耗定時

在 Linux 作業系統中,Idle 程序(又叫 Swapper 程序)的 pid 號是 0,是所有程序的祖先,它是在 Linux 初始化階段從無到有建立的一個核心執行緒。stark_kernel() 函式初始化核心需要的所有資料結構,啟用中斷,建立另一個叫程序

STM32L0Cube功耗定時LPTIM程式設計筆記

1 在STM32Cube中啟用LPTIM 一.LPTIM超時產生中斷詳解 使用的庫函式為: HAL_StatusTypeDefHAL_LPTIM_TimeOut_Start_IT(LPTIM_HandleTypeDef *hlptim, uint32_t Period

KL25利用功耗定時進行MCU功耗喚醒

轉自:http://www.tuicool.com/articles/MN3ANnV 除錯了一天啊!!!!整整一天!!!鬱悶之極,最後才成功。 KL25支援9種低功耗模式,最常用的是LLS模式。在這種模式下,MCU停止運作,大部分外設都不能工作,只有某些外設通過設定還

Linux時間子系統四:定時的引擎:clock_event_device

到來 開始 register 工作模式 統一 10個 net 說過 序列 早期的內核版本中,進程的調度基於一個稱之為tick的時鐘滴答,通常使用時鐘中斷來定時地產生tick信號,每次tick定時中斷都會進行進程的統計和調度,並對tick進行計數,記錄在一個jiffies變量

Linux時間子系統七:定時的應用--msleep(),hrtimer_nanosleep()

get 關系 警告 mov signed num wakeup sch switch 我們已經在前面幾章介紹了低分辨率定時器和高精度定時器的實現原理,內核為了方便其它子系統,在時間子系統中提供了一些用於延時或調度的API,例如msleep,hrtimer_nanosleep

stm32打怪升級瞥眼定時

idt blog app include 定時器 rip 搜索 lcm clas 定時器TIM------->DMA(不用看功能直接忽略介紹) 外部中斷得開啟復用功能 定時器TIM)時鐘源:stm32時鐘系統框圖(需要下載)外部中斷得開啟復用功能實驗目的:定時1s讓燈

Android藍芽開發功耗藍芽(藍芽4.0)開發全記錄

主要內容概況 前面我記錄了開發藍芽2.0的過程,今天準備介紹現在的主流藍芽技術,藍芽4.0的開發,該藍芽技術是在Android4.3(API級別18)版本引入的API。 官方文件 具體的區別主要以下幾點: 1.新的藍芽技術提供了連線服務的方法,以前是沒有提供連線藍芽的方法

Java幾種定時的使用

沒有去仔細研究這兩種定時器的API,會使用及能在專案中應用即可; import org.quartz.CronExpression; import org.quartz.CronTrigger; import org.quartz.JobDetail; import org.quartz.S

iOS -- GCD延遲與定時

我們開發常用的定時器有三種:NSTimer,CADisplyLink,CGD 本文詳細說一下CGD的延遲與定時器方法。文章最後,也會說說GCD與前兩個的區別。 直接上程式碼,首先是延遲的程式碼: 其中的delayInSeconds就是延遲的時間,執行之後,輸出臺會在2s之後,列

STM32TIM1高階定時

定時器應用之PWM輸出 1.1 TIM1_CH1N 與 TIM1_CH1 的區別 在剛準備使用定時器的時候,我看了下原理圖,發現對於定時器1,它的每一個輸出通道都是成對的,即TIM1_CH1N與TIM1_CH1兩個一組,通過網路查詢後,明白了晶片這樣設計的原因。 TIM1是

androidhandler做定時,獲取經緯度資訊

package com.example.gpslocation; import android.app.Activity; import android.content.Context; import android.location.Criteria; import an

golang 高效精度定時實現

    golang預設定時器是通過time模組提供的,不管是golang,libev,libevent也好,定時器都是通過最小堆實現的,導致加入定時器時間複雜度為O(lgn),在需要大量定時器時效率較低,所以Linux提供了基於時間輪的實現,我們本次提供的貼一張Linux時

[HAL庫學習路]7.定時中斷

記錄自己的STM32的HAL庫的學習之路,不定期更新… 一、Pinout 二、Clock Configuration 三、Configuration 定時器溢位時

AndroidAlarmManager(全域性定時/鬧鐘)指定時長或以週期形式執行某項操作

1、AlarmManager,顧名思義,就是“提醒”,是Android中常用的一種系統級別的提示服務,可以實現從指定時間開始,以一個固定的間隔時間執行某項操作,所以常常與廣播(Broadcast)連用,實現鬧鐘等提示功能 2、AlarmManager的常用方法有三個: (1)set(int t

Linux 核心定時使用 一 精度定時

核心定時器是一個數據結構,它告訴核心在使用者定義的時間點使用使用者定義的引數來執行一個使用者定義的函式。其實現位於 <linux/timer.h>中。 核心提供了一組用來宣告、註冊和刪除核心定時器的函式,相關介面如下: struct timer_list {

STM32CubeMX學習教程四:定時中斷

完整原始碼下載:https://github.com/simonliu009/STM32CubeMX-TIM1-Interrupt軟體:STM32CubeMX V4.25.0  System Workbench V2.4韌體庫版本:STM32Cube FW_F1 V1.6.1

Android硬體操作功耗藍芽(一) 硬體篇

一、綜述 我入手的藍芽模組是HC08模組,屬於低功耗藍芽的一種,廠家已經做好了一些封裝,直接使用串列埠 就能通訊。我挺喜歡這種傻瓜式的操作方式的,我和同學一起買了4塊藍芽模組,HC08和HC06個一塊

IC設計基礎系列功耗篇1:(數字IC)功耗設計入門(一)——功耗設計目的與功耗的型別

低功耗設計這個專題整理了好久,有一個月了,有圖有證據:                                然而最近一直有些煩心事、鬱悶事,拖延了一下,雖然現在還是有點煩,但是還是先發表了吧。下面我們就來聊聊低功耗設計吧,由於文章比較長,因此我就不一次

嵌入式系統功耗YDS演算法

在低功耗設計中,有一種動態分配CPU頻率的演算法稱之為YDS演算法。這種演算法可以根據任務所需進行CPU頻率的控制,以達到節約功耗的目的。 不過YDS分為兩種,一種線上一種離線,先說一下離線的吧! 再說一下線上的吧! 線上的話不知道每個任務的DDL,只能知

巨集康HY19系列微控制器功耗

一、前言 網上關於巨集康微控制器的資料非常的少,因為幾個專案一直在用這個微控制器,所以一直在 學習這個微控制器,這款微控制器有24bit的ADC和LCD驅動,還有就是低功耗,sleep模式手冊上寫的是2.5uA,現在的板子做到了50uA,還是比較低。 二、低功耗 手冊上關於