Rockchip Android平台实时读取芯片频率和负载的脚本
脚本适用于Rockchip Android平台的所有芯片,可以实时读取cpu/gpu/ddr/npu等模块的频率和负载情况。
脚本代码如下
#!/system/bin/sh
# 读取 /proc/stat 中的 CPU 数据
read_cpu_stat() {
cat /proc/stat | grep '^cpu[0-9]' | awk '{print $1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11}'
}
# 计算 CPU 负载
calculate_cpu_load() {
local core=$1
local user=$2
local nice=$3
local system=$4
local idle=$5
local iowait=$6
local irq=$7
local softirq=$8
local steal=$9
local guest=${10}
local guest_nice=${11}
local total_time=$((user + nice + system + idle + iowait + irq + softirq + steal + guest + guest_nice))
local busy_time=$((user + nice + system + irq + softirq + steal))
if [ "$total_time" -eq 0 ]; then
echo "0%"
else
local cpu_load=$((busy_time * 100 / total_time))
echo "$core: $cpu_load%"
fi
}
# 主程序
calculate_cpu_core_usage() {
# 第一次读取数据
read_cpu_stat > /data/cpu_stat1
sleep 1
# 第二次读取数据
read_cpu_stat > /data/cpu_stat2
# 读取第一次数据
while read -r core1 user1 nice1 system1 idle1 iowait1 irq1 softirq1 steal1 guest1 guest_nice1 <&3; do
#first_stats["$core"]=$user:$nice:$idle:$iowait:$irq:$softirq:$steal:$guest:$guest_nice
#first_stats[$core]=$user:$nice:$idle:$iowait:$irq:$softirq:$steal:$guest:$guest_nice
while read -r core2 user2 nice2 system2 idle2 iowait2 irq2 softirq2 steal2 guest2 guest_nice2 <&3; do
if [ "$core1" = "$core2" ]; then
break;
fi
done 3< /data/cpu_stat2
calculate_cpu_load "$core1" $((user2 - user1)) $((nice2 - nice1)) $((system2 - system1)) $((idle2 - idle1)) $((iowait2 - iowait1)) $((irq2 - irq1)) $((softirq2 - softirq1)) $((steal2 - steal1)) $((guest2 - guest1)) $((guest_nice2 - guest_nice1))
done 3< /data/cpu_stat1
}
cpu_tread=0
while true
do
# 扫描 /sys/devices/system/cpu/ 目录下的所有子目录(通常代表CPU核心)
cpu_nodes=($(ls /sys/devices/system/cpu/cpufreq | grep -E 'policy[0-9]+'))
# 扫描 /sys/class/devfreq/ 目录下的所有子目录(可能包含NPU, UFS等设备)
devfreq_nodes=($(ls /sys/class/devfreq/))
# 读取 CPU 频率信息
for node in "${cpu_nodes[@]}"
do
# 读取CPU频率,频率信息存储在/sys/devices/system/cpu/<node>/cpufreq/scaling_cur_freq
freq=$(cat /sys/devices/system/cpu/cpufreq/$node/cpuinfo_cur_freq)
echo "$node frequency: $freq Hz"
done
# 读取 devfreq 下的设备频率信息
for node in "${devfreq_nodes[@]}"
do
# 频率信息可能存储在/sys/class/devfreq/<node>/cur_freq
freq=$(cat /sys/class/devfreq/$node/cur_freq)
echo "$node frequency: $freq Hz"
done
# 扫描 /sys/class/thermal/ 目录下的所有子目录(通常代表各个温度传感器的温度)thermal_zone*
thermal_nodes=($(ls /sys/class/thermal/ | grep -E 'thermal_zone[0-9]+'))
# 读取芯片温度
for node in "${thermal_nodes[@]}"
do
# 频率信息可能存储在/sys/class/devfreq/<node>/cur_freq
type=$(cat /sys/class/thermal/$node/type)
local temp=$(cat /sys/class/thermal/$node/temp)
echo "$type: $(($temp / 1000)) °C"
done
#cpu负载
#cpu_tread=$((cpu_tread + 1))
#busybox yes > /dev/null &
#echo "\n start cpu load $cpu_tread"
calculate_cpu_core_usage
# 读取 devfreq 下的设备频率和负载情况
for node in "${devfreq_nodes[@]}"
do
# 频率信息可能存储在/sys/class/devfreq/<node>/cur_freq
if [ -e "/sys/class/devfreq/$node/load" ]; then
load=$(cat /sys/class/devfreq/$node/load)
echo "$node load(%)@freq(Hz): $load"
fi
done
echo "------------------------------------------------------"
#sleep 1
done
使用方法
- 将以上代码复制成readfreq.sh;
- 通过adb 命令push到机器中,并修改权限
adb root
adb push script/readfreq.sh data/
adb shell chmod 777 data/readfreq.sh
- 执行脚本
-pc:~/work/0_download$ adb shell ./data/readfreq.sh
policy0 frequency: 1992000 Hz
dmc frequency: 780000000 Hz
fde60000.gpu frequency: 200000000 Hz
fdf40000.rkvenc frequency: 0 Hz
fdf80200.rkvdec frequency: 0 Hz
fe040000.vop frequency: 396000000 Hz
soc-thermal: 57 °C
gpu-thermal: 54 °C
test_battery: 2 °C
cpu0: 15%
cpu1: 10%
cpu2: 9%
cpu3: 7%
------------------------------------------------------
policy0 frequency: 1800000 Hz
dmc frequency: 780000000 Hz
fde60000.gpu frequency: 200000000 Hz
fdf40000.rkvenc frequency: 0 Hz
fdf80200.rkvdec frequency: 0 Hz
fe040000.vop frequency: 396000000 Hz
soc-thermal: 57 °C
gpu-thermal: 55 °C
test_battery: 2 °C
cpu0: 13%
cpu1: 7%
cpu2: 7%
cpu3: 6%
------------------------------------------------------