Rockchip Android平台实时读取芯片频率和负载的脚本

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

使用方法

  1. 将以上代码复制成readfreq.sh;
  2. 通过adb 命令push到机器中,并修改权限
adb root
adb push script/readfreq.sh data/
adb shell chmod 777 data/readfreq.sh
  1. 执行脚本
-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%
------------------------------------------------------

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

loitawu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值