群里聊天真的能制造话题,哈哈,我刚才在群里扯犊子,有群友问:
然后我回复完就觉得有点儿仓促了,我赶紧检查了一下我手里的犀牛派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: usb、hwmon5/6: battery 等),还有 hwmon0: pwmfan 风扇自身的监控。hwmon 是备用读数路径,与 power_supply 数据同源。
第三步:看每个节点暴露了哪些属性
ls /sys/class/power_supply/usb/
ls /sys/class/power_supply/battery/
两个候选(usb、ucsi)都有 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 区间。
排查思路小结
cat /proc/device-tree/model确认平台 → 推断 PMIC/电量计方案ls /sys/class/power_supply/枚举候选电源节点ls每个节点看有没有voltage_now/current_now- 读数值:
online=0或全 0 的是死节点,排除 - 用 V×I 手工验算,警惕
power_now等派生值的口径问题 - 空闲 vs 满载对照实验确认数据随负载变化,方可采信
- 说明测量口径(哪条电源轨、含不含转换损耗)避免被人捶。
- 感谢漂移菌的亲身下场测试。










