
📢中央处理器频率调节(Central Processing Unit frequency,CPUFreq)技术可以降低 ARM 芯片的功耗,例如在系统对任务压力较小时,通过调整处理器工作频率与输入电压的大小降低系统功耗。
/sys/devices/system/cpu/cpufreq/policy0

需要关注节点:
cpuinfo_max_freqcpuinfo_min_freqscaling_available_governors:支持策略集合scaling_governor:当前的策略(需要你后期来配置)
一、CPUFreq 组成
CPUFreq 是一个能动态调整处理器电压和运行速度的系统框架。它主要由四个部分组成:
- 特定 CPU 的驱动程序:这是最底层的驱动程序,负责实现处理器实际的变频功能。
- 核心管理层:这一层把变频功能包装成标准接口,让上层更容易调用。
- 核心调节器:这是整个系统的"决策中心"。它会根据处理器的负载情况或用户指令,选择合适的调频策略。比如在 RK3399 芯片的 Linux 系统里,内置了 7 种不同的调节策略。用户可以通过命令查看当前可用的调频模式列表。
简单来说,这个系统就像一个自动变速器:底层硬件负责具体执行,中间层统一管理操作,顶层根据实际需求智能选择最佳方案。
支持:conservative ondemand userspace powersave interactive performance

- Performance:性能模式,CPU 始终保持最高运行速度;
- Powersave:省电模式,CPU 始终保持最低运行速度;
- Userspace:手动模式,用户可通过系统工具直接设定 CPU 速度,此时 CPU 不再自动调节。
- Sched:这是 Linux 的新一代 CPU 调度策略,能同时管理 CPU 的性能和省电。当程序运行时,它会自动在"足够快"和"最省电"之间找到平衡点,确保任务不卡顿的同时尽量少耗电。
- Interactive:根据 CPU 的工作量自动调整运行速度和电力。比如当你玩游戏时会加速提升性能,后台闲置时则降速省电,反应速度比较快。
- Ondemand:和 Interactive 类似,也是根据工作量调整速度和电力,但反应稍微慢一点,会在负载变化时稍等片刻再调整频率。
- Conservative:基于 Ondemand 改进的策略,降频时会优先保证 CPU 负载不超过 80%。简单来说,它会先确保 CPU 能轻松处理当前任务(保持 80% 以下负载),再选择能支持任务的最低频率运行,这样既省电又不会让任务变卡。
如何选择:
- 控制功耗 (功耗优先):
Powersave - 提高你算法的性能 (性能优先):
Performance - 兼容(平衡):
Interactive、Ondemand、Conservative(偏向功耗优先)
系统内置了 7 种不同的 CPU 调度方式,同一时间只能启用其中一种。这些调度方式可以在系统运行过程中随时切换,方便用户根据需求调整 CPU 的使用策略。
用户可以通过文件系统直接操作 CPU 频率设置:
- 打开路径:
/sys/devices/system/cpu/cpu0/cpufreq - 这里能看到 CPU0 的详细信息:
cpuinfo_max_freq:CPU 支持的最高频率cpuinfo_min_freq:CPU 支持的最低频率cpuinfo_cur_freq:当前实际运行频率scaling_available_frequencies:可设置的频率列表scaling_available_governors:可选的调度策略名称scaling_governor:当前正在使用的调度策略
简单来说,用户可以通过修改这些文件中的内容,直接控制 CPU 的运行频率和调度方式,就像在系统设置里切换不同模式那样方便。
例如 有 6 个 CPU 核心,CPU0-5,6 个 CPU 支持频率如图:

二、设备树配置

其中 cluster0_opp 定义如下:
c
cluster0_opp: opp-table0 {
compatible = "operating-points-v2";
opp-shared;
rockchip,temp-hysteresis = <5000>;
rockchip,low-temp = <0>;
rockchip,low-temp-min-volt = <900000>;
nvmem-cells = <&cpul_leakage>, <&specification_serial_number>,
<&customer_demand>;
nvmem-cell-names = "cpu_leakage",
"specification_serial_number",
"customer_demand";
clocks = <&cru PLL_APLLL>;
rockchip,avs-scale = <20>;
rockchip,bin-scaling-sel = <
0 30
1 34
>;
rockchip,pvtm-voltage-sel = <
0 143500 0
143501 148500 1
148501 152000 2
152001 999999 3
>;
rockchip,pvtm-freq = <408000>;
rockchip,pvtm-volt = <1000000>;
rockchip,pvtm-ch = <0 0>;
rockchip,pvtm-sample-time = <1000>;
rockchip,pvtm-number = <10>;
rockchip,pvtm-error = <1000>;
rockchip,pvtm-ref-temp = <41>;
rockchip,pvtm-temp-prop = <115 66>;
rockchip,thermal-zone = "soc-thermal";
opp-408000000 {
opp-hz = /bits/ 64 <408000000>;
opp-microvolt = <825000 825000 1250000>;
opp-microvolt-L0 = <825000 825000 1250000>;
opp-microvolt-L1 = <825000 825000 1250000>;
opp-microvolt-L2 = <825000 825000 1250000>;
opp-microvolt-L3 = <825000 825000 1250000>;
clock-latency-ns = <40000>;
};
opp-600000000 {
opp-hz = /bits/ 64 <600000000>;
opp-microvolt = <825000 825000 1250000>;
opp-microvolt-L0 = <825000 825000 1250000>;
opp-microvolt-L1 = <825000 825000 1250000>;
opp-microvolt-L2 = <825000 825000 1250000>;
opp-microvolt-L3 = <825000 825000 1250000>;
clock-latency-ns = <40000>;
};
opp-816000000 {
opp-hz = /bits/ 64 <816000000>;
opp-microvolt = <850000 850000 1250000>;
opp-microvolt-L0 = <850000 850000 1250000>;
opp-microvolt-L1 = <825000 825000 1250000>;
opp-microvolt-L2 = <825000 825000 1250000>;
opp-microvolt-L3 = <825000 825000 1250000>;
clock-latency-ns = <40000>;
opp-suspend;
};
opp-1008000000 {
opp-hz = /bits/ 64 <1008000000>;
opp-microvolt = <925000 925000 1250000>;
opp-microvolt-L0 = <925000 925000 1250000>;
opp-microvolt-L1 = <900000 900000 1250000>;
opp-microvolt-L2 = <875000 875000 1250000>;
opp-microvolt-L3 = <850000 850000 1250000>;
clock-latency-ns = <40000>;
};
opp-1200000000 {
opp-hz = /bits/ 64 <1200000000>;
opp-microvolt = <1000000 1000000 1250000>;
opp-microvolt-L0 = <1000000 1000000 1250000>;
opp-microvolt-L1 = <975000 975000 1250000>;
opp-microvolt-L2 = <950000 950000 1250000>;
opp-microvolt-L3 = <925000 925000 1250000>;
clock-latency-ns = <40000>;
};
opp-1416000000 {
opp-hz = /bits/ 64 <1416000000>;
opp-microvolt = <1125000 1125000 1250000>;
opp-microvolt-L0 = <1125000 1125000 1250000>;
opp-microvolt-L1 = <1100000 1100000 1250000>;
opp-microvolt-L2 = <1075000 1075000 1250000>;
opp-microvolt-L3 = <1050000 1050000 1250000>;
clock-latency-ns = <40000>;
};
};1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
opp-hz填充对应的CPU的工作主频,单位为Hz;opp-microvolt填充对应频率的工作电压,单位为微伏;clock-latency-ns为每个工作时钟的延迟时间,单位为纳秒。 配置好上述电压后,需要在应用层设置CPU调度策略,在Linux控制台输入如下命令:
bash
echo sched > /sys/devices/system/cpu0/cpufreq/policy0/scaling_governor1
输入如上命令后则可以将 CPU0 的调度策略设置为 Sched 策略,同理设置 CPU1、CPU2、CPU3、CPU4 和 CPU5。