【漂移菌】阿加犀犀牛派X1 如何快速测试满载功耗

群里聊天真的能制造话题,哈哈,我刚才在群里扯犊子,有群友问:


然后我回复完就觉得有点儿仓促了,我赶紧检查了一下我手里的犀牛派X1,哈哈,发现果然可以用软件简单测试。
下面就是测试方法和原理,这不就又水了一篇?哈哈,速度杠杠滴。
我先看了看设备的硬件监控有哪些:

接着检查了一下设备树:

power_supply(电源供应)

• battery —— 不是真电池,是高通电量计对 VBAT 主电源轨 的遥测,voltage_now × current_now 就是我们刚才用来估算整机功耗的口子
• usb —— USB 充电口检测,当前 online=0(板子走的 DC 供电,没插 USB 供电)
• ucsi-source-psy-… —— USB-C PD 协议层(pmic_glink),同样未启用
• wireless —— 无线充电检测,未接

hwmon(硬件监控)

• hwmon0: pwmfan —— 风扇自身(转速回读等)
• hwmon1/2: usb、hwmon3/4: wireless、hwmon5/6: battery —— 上面各 power_supply 对应的 hwmon 接口,同样能读电压电流
• hwmon7: ucsi_source_psy… —— PD 输入的 hwmon 接口

结论不变:全板唯一有效的软件功耗数据源就是 battery 节点的 VBAT 轨遥测,PD/USB 路径都没启用。要墙端真值只能上外部功率计了。

我仔细想了想,如果直接软件测试也不是不行,可以尝试顺藤摸瓜哈哈。

下面让我来给你们分析一下怎么测试的。

RhinoPi X1 峰值功耗测试方法:从找到传感器到实测

下面就是我在这里记录如何在 RhinoPi X1 上测量功耗,重点是一步步定位可用数据源的过程——这套排查思路也适用于其他 Linux 开发板,思路是一个套路来的。

最终结论(先看这里)

状态 VBAT 轨功率
空闲(风扇停转) 约 1.4 ~ 1.9 W
6 核 CPU 全压(busy-loop) 约 7.0 ~ 7.7 W

数据源:/sys/class/power_supply/battery/ 下的 voltage_now × current_now
注意:这是 PMIC 之后 VBAT 电源轨的功率,不含适配器与 DC-DC 转换损耗(约 5~10%),风扇若独立供电也不计入。要"墙端"真值只能外接功率计来测试,这里只是毛估估,哈哈,就类似瞎几把猜。


第一步:确认板子型号,建立预期,我发现有个特别有意思的地方哈哈。

cat /proc/device-tree/model   # → Qualcomm Technologies, Inc. KalamaP HDK
cat /sys/devices/soc0/soc_id  # → 603
nproc                          # → 6(AidLux 容器可见 6 核)

Kalama 即骁龙 8 Gen 2 平台(QCS8550 同源)。知道 SoC 平台的意义在于:高通平台的电源管理走 PMIC + 电量计(fuel gauge),Linux 下通常通过标准 power_supply 框架暴露电池/电源遥测——这提示了下一步去哪里找。

第二步:枚举电源子系统节点

Linux 的电源设备统一挂在 /sys/class/power_supply/

ls /sys/class/power_supply/

四个候选节点,逐个判断身份:

  • battery —— 电池/电量计接口(X1 无电池,不用验证了)
  • usb —— USB 充电检测
  • ucsi-source-psy-... —— USB-C PD 协议层(pmic_glink 是高通 PMIC 的通信通道)
  • wireless —— 无线充电

顺带看 /sys/class/hwmon/(硬件监控框架),发现每个 power_supply 都有对应 hwmon 节点(hwmon1/2: usbhwmon5/6: battery 等),还有 hwmon0: pwmfan 风扇自身的监控。hwmon 是备用读数路径,与 power_supply 数据同源。

第三步:看每个节点暴露了哪些属性

ls /sys/class/power_supply/usb/
 
ls /sys/class/power_supply/battery/
 

两个候选(usbucsi)都有 voltage_now/current_now,理论上 功率 = 电压 × 电流 都能算。battery 甚至还直接给了 power_now

关键判断点:属性存在 ≠ 数据有效,必须读真实数值验证。

第四步:读数值,排除"死"节点

# usb 节点
voltage_now: 6000   current_now: 0   online: 0
# ucsi 节点
voltage_now: 0      current_now: 0   online: 0


online: 0 说明这两条供电路径当前都不在用——结合 X1 走 DC 电源口供电、没插 USB 供电的事实,usb/ucsi 是死节点,排除

再看 battery

status: Discharging   present: 1   capacity: 100
voltage_now: 4065236  (µV → 4.065 V)
current_now: -638321  (µA → -0.638 A,负值 = 放电/耗电)
temp: 240             (÷10 → 24.0 °C,合理的板内温度)

数值全是活的、物理上自洽:X1 虽无电池,但设备树沿用了 HDK 参考设计,电量计实际挂在 VBAT 主电源轨上——current_now 就是整机从 PMIC 汲取的总电流。capacity: 100 固定不变也印证了"没有真电池"。

交叉验证:手工算 V × I = 4.065 V × 0.638 A ≈ 2.6 W
注意节点自带的 power_now(89.75 W)与 V×I 不符,是固件换算口径问题——用自己算的 V×I,不用 power_now

第五步:负载对照实验,确认数据是可信的。

光有静态读数不够,要证明它随负载变化才是有效功耗计。

空闲采样(风扇停转):

B=/sys/class/power_supply/battery
for i in 1 2 3 4 5; do
  v=$(cat $B/voltage_now); c=$(cat $B/current_now)
  [ $c -lt 0 ] && c=$((-c))
  echo "P=$((v * c / 1000000000)) W 级 (精确值 $((v*c/1000000)) µW)"
  sleep 1
done
# → 1.4 ~ 1.9 W 之间小幅波动

满载采样:起 6 个 busy-loop 打满所有可见核,持续采样 15 秒:

for i in $(seq 6); do sh -c 'while :; do :; done' & done   # 记下 PID
# 每秒读 voltage_now × current_now ...
kill <所有 PID>
# → 7.0 ~ 7.7 W,峰值 7.68 W;CPU 温度 56°C → 81°C

功耗随负载跳变 ~4 倍且稳定,温度同步飙升(风扇服务在 58°C 自动拉满,工作正常)——数据源可信,说明测试有效的,就是这时候风扇吵死人,哈哈,赶紧测试完杀掉进程,不然有可能让犀牛派X1太累了,毕竟他不是干这个的。

第六步:说明一下边界

软件读数测的是 PMIC 之后的 VBAT 轨

  • 含:SoC、内存、板载外设的供电
  • 不含:适配器损耗、12V→VBAT 的 DC-DC 转换损耗(约 5~10%)、独立供电的风扇

所以报告数值时要标注"VBAT 轨"。要整机墙端功耗(产品规格书口径),唯一准确方法是在 12V DC 输入线上串功率计(DC 库仑计 / 带显示可调电源 / Type-C 场景用 POWER-Z),我的测试仅供参考哦,不是官方权威答案,不要因为这个找我麻烦哦。

复现:正式峰值测试流程

busy-loop 只能压整数流水线,真实峰值要 CPU+GPU+NPU 一起上:

# 1. 安装压力工具
sudo apt install stress-ng

# 2. 终端 A:施加组合负载,跑CPU+矩阵,还不够你臭屁的么?
stress-ng --cpu 0 --matrix 0 --timeout 120s
#    可同时跑 glmark2-es2(GPU)和 AidLux AI 推理 demo(NPU)

# 3. 终端 B:每 0.5 秒采样一次
while :; do
  v=$(cat /sys/class/power_supply/battery/voltage_now)
  c=$(cat /sys/class/power_supply/battery/current_now); [ $c -lt 0 ] && c=$((-c))
  echo "$(date +%T) P=$((v*c/1000000000)).$(( (v*c/1000000) % 1000 ))W"
  sleep 0.5
done

取采样最大值即峰值功耗(VBAT 轨),加 ~10% 估墙端。预估 CPU+GPU+NPU 三满载 VBAT 峰值在 10~15 W 区间。

排查思路小结

  1. cat /proc/device-tree/model 确认平台 → 推断 PMIC/电量计方案
  2. ls /sys/class/power_supply/ 枚举候选电源节点
  3. ls 每个节点看有没有 voltage_now/current_now
  4. 读数值online=0 或全 0 的是死节点,排除
  5. 用 V×I 手工验算,警惕 power_now 等派生值的口径问题
  6. 空闲 vs 满载对照实验确认数据随负载变化,方可采信
  7. 说明测量口径(哪条电源轨、含不含转换损耗)避免被人捶。
  8. 感谢漂移菌的亲身下场测试。
1 个赞

点赞

:hand_with_index_finger_and_thumb_crossed: