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.
root@rk3288:/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 硬件寄存器进行检查。
查看当前支持策略:
root@rk3288:/sys/devices/system/cpu/cpu0/cpufreq # cat scaling_available_governors
conservative ondemand userspace powersave interactive performance
查看当前策略:
root@rk3288:/sys/devices/system/cpu/cpu0/cpufreq # cat scaling_governor
interactive
查看当前支持cpu频率:
root@rk3288:/sys/devices/system/cpu/cpu0/cpufreq # cat scaling_available_frequencies
126000 216000 312000 408000 600000 696000 816000 1008000 1200000 1416000 1512000 1608000
查看当前cpu频率:
root@rk3288:/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策略核心模块.
默认使用策略可参考:
[RK3288][Android6.0] 调试笔记 — 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
引述:
参考:
Linux动态频率调节系统CPUFreq之二:核心(core)架构与API
Linux 2.6 内核中的最新电源管理技术综述,第 1 部分