1. 程式人生 > >[RK3288][Android6.0] CPU頻率排程策略小結

[RK3288][Android6.0] CPU頻率排程策略小結

Platform: Rockchip
OS: Android 6.0
Kernel: 3.10.92

CPU的頻率調節模式:
1. Performance. 不考慮耗電,只用最高頻率。
2. Interactive. 直接上最高頻率,然後看CPU負荷慢慢降低。
3. Powersave. 通常以最低頻率執行,流暢度會受影響,一般不會用這個吧!
4. Userspace. 可以在使用者空間手動調節頻率。
5. Ondemand. 定期檢查負載,根據負載來調節頻率。

檢視目錄:
位於 /sys/devices/system/cpu/cpuX, X表示cpu number.

[email protected]:/sys/devices/system/cpu/cpu0/cpufreq # ls
affected_cpus
cpuinfo_cur_freq
cpuinfo_max_freq
cpuinfo_min_freq
cpuinfo_transition_latency
related_cpus
scaling_available_frequencies
scaling_available_governors
scaling_cur_freq
scaling_driver
scaling_governor
scaling_max_freq
scaling_min_freq
scaling_setspeed
stats

cpuinfo_cur_freq 讀取的是 CPU 硬體暫存器中當前所處的執行頻率。
scaling_cur_freq 讀取的是快取的 CPU 當前執行頻率,而不會對 CPU 硬體暫存器進行檢查。

檢視當前支援策略:
[email protected]:/sys/devices/system/cpu/cpu0/cpufreq # cat scaling_available_governors
conservative ondemand userspace powersave interactive performance

檢視當前策略:
[email protected]

:/sys/devices/system/cpu/cpu0/cpufreq # cat scaling_governor
interactive

檢視當前支援cpu頻率:
[email protected]:/sys/devices/system/cpu/cpu0/cpufreq # cat scaling_available_frequencies
126000 216000 312000 408000 600000 696000 816000 1008000 1200000 1416000 1512000 1608000

檢視當前cpu頻率:
[email protected]:/sys/devices/system/cpu/cpu0/cpufreq # cat scaling_cur_freq
600000

cpufreq_interactive.c
cpufreq_performance.c
cpufreq_userspace.c
cpufreq_powersave.c
cpufreq_ondemand.c

平臺可以支援多種策略,每個策略單獨一個檔案.
策略由struct cpufreq_governor表示, 通過cpufreq_register_governor()介面註冊.
由於還有其他引數,比如當前cpu數量,當前策略最大最小支援頻率等, cpufreq_governor被包在struct cpufreq_policy用於cpu core子系統中.

cpufreq_governor.c

策略中有些控制行為是相同的,也獨立抽取出來.

rockchip-cpufreq.c:

系統中只存在一個cpu驅動, 而且驅動是平臺相關的,由struct cpufreq_driver表示,通cpufreq_register_driver()註冊到系統.
cpufreq_register_driver -> subsys_interface_register -> cpufreq_add_dev -> cpufreq_driver->init -> cpufreq_init*

cpufreq_init()主要用於設定相應策略的最大和最小工作頻率

策略只是根據不同情況如負載來計算出當前要設定的頻率,而最終對頻率的設定由驅動完成, 通過cpufreq_driver中的target()函式指標實現.

cpufreq.c
freq_table.c

cpu策略核心模組.

策略初始化註冊完之後,會開一個定時器,週期檢測系統負載變化來動態調節頻率,流程如下:

cpufreq_interactive_timer -> //timer會被定期執行計算當前系統負載
wake_up_process(speedchange_task) -> //喚醒負載計算執行緒
cpufreq_interactive_speedchange_task ->
__cpufreq_driver_target ->
cpufreq_driver->target ->
cpufreq_target -> rockchip-cpufreq.c
cpufreq_frequency_table_target //設定的target freq要在policy的執行範圍內
dvfs_clk_set_rate ->
clk_dvfs_node->vd->vd_dvfs_target ->
dvfs_target ->
dvfs_get_limit_rate //這裡會判斷溫度的litmit值(temp_limit_rate變數)
clk_set_rate

引述:

這裡寫圖片描述

相關推薦

[RK3288][Android6.0] CPU頻率排程策略小結

Platform: Rockchip OS: Android 6.0 Kernel: 3.10.92 CPU的頻率調節模式: 1. Performance. 不考慮耗電,只用最高頻率。 2. Interactive. 直接上最高頻率,然後看CPU負

[RK3288][Android6.0] GPU DVFS控制策略小結

Platform: Rockchip OS: Android 6.0 Kernel: 3.10.92 mali_device_driver 分為兩個部分 : platform_dependent_part 和 common_parts, 參見 mali_k

[RK3288][Android6.0] PMIC之RK818驅動小結

uboot部分: pmic_init ->    power_rockchip.c     pmic_rk818_init ->    pmic_rk818.c         rk818_parse_dt ->             fdt_get_i2c_info           

[RK3288][Android6.0] DDR Frequency控制流程小結

    freq-table = <        /*status        freq(KHz)*/        SYS_STATUS_NORMAL    400000        SYS_STATUS_SUSPEND    200000        SYS_STATUS_VIDEO_108

[RK3288][Android6.0] 除錯筆記 --- CPU預設排程策略

Platform: Rockchip OS: Android 6.0 Kernel: 3.10.92 CPU的頻率調節策略: 1. Performance. 不考慮耗電,只用最高頻率。 2. Interactive. 直接上最高頻率,然後看CPU負

[RK3288][Android6.0] 除錯筆記 --- CPU使用的頻率

Platform: Rockchip OS: Android 6.0 Kernel: 3.10.92 系統中有三張CPU相關的頻率表: 1. rockchip-cpufreq.c: /* Fr

[RK3288][Android6.0] 控制匯流排通用介面regmap小結

Platform: RockchipOS: Android 6.0Kernel: 3.10.92看音訊模組時發現了一個叫regmap的東西,看了下以後勢必會用到,也把小結分享給大家。之前使用I2C或者SPI匯流排進行讀寫時的框架:需要自己再對讀寫函式進行封裝,這樣每個裝置驅動

[RK3288][Android6.0] AT24C02驅動分析及功能增加小結

Platform: Rockchip OS: Android 6.0 Kernel: 3.10.92 Spec: 網上很多,如 https://wenku.baidu.com/view/0020131fff00bed5b8f31d05.html驅動: 檔案: kernel/

[RK3288][Android6.0] 系統除錯串列埠驅動流程小結

Platform: ROCKCHIP OS: Android 6.0 Kernel: 3.10.92 rk3288提供了fiq debugger功能, 因此rk將debug uart和普通uart區分開來, debug uart的初始化整合到了fiq debugger程式碼中完成,不過uart的初始化 方法還

[RK3288][Android6.0] PMIC之RK818硬體部分小結

電源分類: 主要分兩種: DC/DC 和 LDO, 兩種特性如下: DC/DC: 即直流變壓器.分buck(降壓),boost(升壓),buck-boost(升降壓).效率高,成本高,大電流使用,不過

[RK3288][Android6.0] Audio的音量設定流程小結

Platform: Rockchip OS: Android 6.0 Kernel: 3.10.92 說明一:  AudioManager提供了兩個調節音量介面 adjustSuggestedSt

[RK3288][Android6.0] 網路服務Netd初始化流程小結

Platform: Rockchip OS: Android 6.0 Kernel: 3.10.92 Netd: Network Daemon. 負責網路配置,操作,管理,查詢等功能. 封裝底層各種型別網路,如PPP,SOFTAP等,給framework提供統一介面. 說

[RK3288][Android6.0] 除錯筆記 --- CPU溫度降頻控制

rk3288平臺關於溫度調節cpu頻率有個bug. 在rk3288.dtsi中,有: temp-limit-enable = <1>; target-temp = <80>; min_temp_limit = <48>

[RK3288][Android6.0] Display驅動初始化流程小結

Platform: RK3288 OS: Android 6.0 Kernel: 3.10.92 以MIPI DSI介面的lcd為例.rk_screen.c: 讀取lcd timing引數。lcd_mipi.c: 螢幕mipi配置資訊。rk_fb.c: fb驅動。rk3288_lcdc.c lcdc cont

[RK3288][Android6.0] 有線耳機驅動小結

Platform: Rockchip OS: Android 6.0 Kernel: 3.10.92 Overview Rockchip針對有線耳機的驅動單獨建了目錄, 在kernel/drivers/headset_observe/下 ro

[RK3288][Android6.0] WiFi之Framework連線過程小結

Platform: Rockchip OS: Android 6.0Kernel: 3.10.92 onPreferenceTreeClick -> WifiSettings.java   preference.getAccessPoint //獲取當前選擇的ap

[RK3288][Android6.0] Audio中的混音過程小結

Platform: Rockchip OS: Android 6.0 Kernel: 3.10.92 bool AudioFlinger::PlaybackThread::threadLoop

[RK3288][Android6.0] 除錯筆記 --- 讀取當前DDR頻率方法

Platform: Rockchip OS: Android 6.0 Kernel: 3.10.92 ddr和gpu的clock都受dvfs模組管控, 所以只要執行:[email protected]:/ # cat /sys/dvfs/dvfs_tree kernel log中打印出來: [ 2

[RK3288][Android6.0] SettingsProvider資料庫小結

Platform: RK3288OS: Android 6.0Kernel: 3.10.92 資料庫從db改成了xml的形式 /data/data/com.android.providers.sett

[RK3288][Android6.0] 除錯筆記 --- 普通串列埠的新增

Platform: ROCKCHIP OS: Android 6.0 Kernel: 3.10.92 uart0,1,3,4 (普通串列埠) 用的是同一個串列埠驅動. uart2(除錯串列埠)的驅動程式碼嵌在fiq debugger的code中. 相關的配置在rk3288.dtsi中: