Rockchip · AI & Linux Hub

Stromversorgung und Thermik

Rockchip-Leitfaden zur Leistungsanalyse: Messung, CPU, DDR und Temperaturregelung

Rockchip-Leitfaden zur Leistungsanalyse: Messung, CPU, DDR und Temperaturregelung — V1.0.1

· ArmSoM Editorial · Rockchip source documentation · 19 Min. Lesezeit

Vollständiger technischer Text aus dem chinesischen RK-KF-YF-176 und englischen RK-KF-YF-177, beide V1.0.1. Die Quelle nennt alle Chips/Kernel, ihre Beispiele betreffen jedoch RK3399, RK3126/RK816, RK3326, PX30 und ältere Linux-/Android-Frequenz- und cgroup-Schnittstellen. Für ArmSoM als Plattformreferenz behandeln: SoC, Boardversorgung, PMIC, BSP, Kernelschnittstellen und Messpunkte prüfen. Spannungen und Registerpfade nicht ungeprüft übernehmen. Alle Messwerte sind Quellenbeispiele, keine ArmSoM-Tests; keine Spannungsänderung, Kernabschaltung oder Hardwareprüfung durchgeführt. ZH-Abbildungen stammen aus dem chinesischen PDF, EN/RU/DE aus dem englischen; einige Hardwarebeschriftungen darin bleiben chinesisch.

Beibehaltene Unklarheiten: Abschnitt 1.3 druckt 80%90%, der chinesische Abschnitt 3.1 ausdrücklich ~80%-90%. Ein fehlendes Trennzeichen gilt nicht als bestätigter Bereich. Der Kommentar „10ms Periode“ steht bei cpu.cfs_quota_us=10000, „5ms Laufzeit“ bei cpu.cfs_period_us=5000: ein semantischer Widerspruch. Auch der DDR-Kommentar 40%-2%/2 ist mit downdifferential=<20> abzugleichen. Einige Quellbefehle enden tatsächlich mit einem einzelnen <; DTS-Auszüge enthalten keine schließenden Klammern. Sie bleiben erhalten, sind aber keine direkt ausführbaren Skripte. Die Schreibweise Contex, kHz-Angaben in cpustats und die Aussage, cpu.shares beeinflusse den Verbrauch nicht, wurden nicht stillschweigend korrigiert. Vor Verwendung am konkreten Kernel und Treiber prüfen.

ArmSoM Docs · Linux kernel documentation

1. Grundbegriffe

1.1 Frequenz (clk) und Spannung (voltage)

Ein SoC enthält üblicherweise viele Module, beispielsweise ARM, GPU, DDR, I2C, SPI und USB. Im Betrieb benötigt die digitale Logik jedes Moduls eine geeignete Frequenz und die zugehörige Spannung. Eine höhere Modulfrequenz erfordert eine höhere Spannung. Frequenz und Spannung sind zwei wichtige Parameter der Leistungsaufnahme.

1.2 Spannungsdomänen VD (voltage domain) und Leistungsdomänen PD (power domain)

SoC-Module bestehen normalerweise aus digitaler Logik und IO. Die Logik übernimmt Berechnungen und Zustandssteuerung, IO die Übertragung von Schnittstellensignalen. Manche Module, etwa ARM und GPU, besitzen keinen IO-Anteil. Logik und IO werden üblicherweise getrennt versorgt. Die IO-Leistungsaufnahme ist relativ konstant, während die der Logik stark von Frequenz und Spannung abhängt. Zur Optimierung wird die digitale Logik in Spannungs- und Leistungsdomänen unterteilt.

Eine Spannungsdomäne umfasst mehrere Module mit einer gemeinsamen externen Versorgung, deren Spannung unabhängig eingestellt oder abgeschaltet werden kann. Module mit ähnlichen Betriebsspannungen und geringem Verbrauch können zusammengefasst werden. Für leistungsstarke Module empfiehlt sich eine eigene Domäne: Das erleichtert die Verwaltung und verhindert, dass der Spitzenstrom die Grenze der externen Versorgung überschreitet. Die Spannung muss den höchsten Bedarf aller aktiven Module erfüllen; abgeschaltete Module zählen nicht.

Nicht alle Module einer Domäne arbeiten gleichzeitig. Inaktive, aber versorgte Module verursachen Leckstrom. Deshalb wird eine Spannungsdomäne in Bereiche mit unabhängig abschaltbarer Versorgung (switch off) unterteilt. Ein abgeschalteter Bereich wird von anderen Modulen isoliert (isolation), was den Leckstrom deutlich verringert. Ein solcher Bereich heißt Leistungsdomäne.

Der RK3399 besitzt sechs VD:

  • VD_CORE_B: zwei große Contex-A72-Kerne; wegen hoher Leistungsaufnahme eigene Domäne.
  • VD_CORE_L: vier kleine Contex-A53-Kerne; ebenfalls eigene Domäne wegen hoher Leistungsaufnahme.
  • VD_LOGIC: Peripheriecontroller und Systembusse wie USB, EMMC, GMAC, SPI, I2C, EDP, VOP, AXI, AHB und APB.
  • VD_CENTER: vdpu, vepu, iep, rga und DDR-Controller.

  • VD_GPU: GPU; wegen hoher Leistungsaufnahme eigene Domäne.
  • VD_PMU: PMU, SRAM, GPIO, PVTM und weitere am Standby-/Aufwachablauf beteiligte Module.

Das Blockdiagramm folgt unten.

Spannungs- und Leistungsdomänen des RK3399

Spannungs- und Leistungsdomänen des RK3399

1.3 DCDC (Direct Current) und LDO (low dropout regulator)

Die externe SoC-Versorgung verwendet hauptsächlich DCDC und LDO. DCDC bezeichnet üblicherweise ein Schaltnetzteil mit hohem Wirkungsgrad; die Originalzeile druckt den Wert als „80%90%“ ohne eindeutiges Trennzeichen. Bei großen Strömen erhöht DCDC die Versorgungseffizienz. Beim LDO entspricht der Eingangsstrom dem Ausgangsstrom; der Wirkungsgrad ist daher Ausgangsspannung/Eingangsspannung. Bei 3.8V Eingang und 1.0V Ausgang beträgt er 1V/3.8V=26.3% und ist somit niedrig.

Beispiel RK3126+RK816: Die vier BUCK-Kanäle des RK816 versorgen ARM, LOG, DDR und IO des RK3126, da dort relativ große Ströme fließen. BUCK ist ein abwärtswandelnder DCDC-Wandler. Die sechs LDOs versorgen PLL, PHY und einige Peripheriemodule mit normalerweise kleinen Strömen. Das Versorgungsdiagramm folgt unten.

Versorgung von RK3126 und RK816

Versorgung von RK3126 und RK816

1.4 Statische und dynamische Leistungsaufnahme

Statische Leistungsaufnahme entsteht durch Transistorleckströme bei inaktiven SoC-Modulen; sie steigt mit Temperatur und Spannung. Dynamische Leistungsaufnahme entsteht durch Schaltvorgänge in den Schaltungen eines aktiven Moduls und steigt mit Frequenz und Spannung.

Formel der dynamischen Leistungsaufnahme: C ist konstant, V die Spannung, F die Frequenz.

    /* C is constant, V is voltage, F is frequency*/
    P(d)= C * V^2 * F

1.5 DVFS (Dynamic Voltage and Frequency Scaling), CPUFREQ und DEVFREQ

Höhere Betriebsfrequenz und Spannung eines Moduls erhöhen die Leistungsaufnahme. Deshalb werden beide dynamisch angepasst: im Leerlauf abgesenkt und bei hoher Systemlast angehoben.

DVFS bezeichnet die Technik zur dynamischen Frequenz- und Spannungsanpassung als Grundlage von CPUFREQ und DEVFREQ. CPUFREQ ist das Softwareframework zur dynamischen CPU-Frequenzanpassung mit mehreren Strategien; Einzelheiten stehen in „Rockchip-Developer-Guide-Linux4.4-CPUFreq-CN“. DEVFREQ übernimmt die dynamische Frequenzanpassung von Peripherie, nicht der CPU, ebenfalls mit mehreren Strategien; siehe „Rockchip-Developer-Guide-Linux4.4-Devfreq“.

2. Messung der Leistungsaufnahme

Vor der Optimierung Spannung und Strom sämtlicher Versorgungsschienen messen, die Daten analysieren und anschließend passende Maßnahmen wählen. Die Temperatur beeinflusst den Verbrauch wesentlich und muss während der Messung fortlaufend aufgezeichnet werden. Abfragebefehl:

cat /sys/class/thermal/thermal_zone0/temp

2.1 Messverfahren

Einen Widerstand R in Reihe schalten und den Spannungsabfall U messen: I=U/R. Üblich sind 0.01 Ohm; der Widerstand ist jedoch an den Strom anzupassen. Beim RK3399 EVB liegen an den Ausgängen VDD_CPU_B, VDD_CPU_L, VCC_1V8 und VCC_DDR jeweils 0.01-Ohm-Reihenwiderstände zur Spannungsmessung, wie unten dargestellt.

Strommessschaltung des RK3399 EVB

Strommessschaltung des RK3399 EVB

2.2 Messwerkzeug

Bei vielen Versorgungsschienen erhöht eine mehrkanalige Spannungs- und Stromerfassung die Messeffizienz. Das von Rockchip entwickelte Werkzeug PowerMeterage erfasst gleichzeitig Verbrauchsdaten von 20 Kanälen. Die Oberfläche ist unten abgebildet.

PowerMeterage-Oberfläche aus der Quelle

PowerMeterage-Oberfläche aus der Quelle

Hardwareanschluss von PowerMeterage:

PowerMeterage-Hardwareanschluss

PowerMeterage-Hardwareanschluss

3. Analyse der Verbrauchsdaten

3.1 Berechnung der theoretischen Leistungsaufnahme

Mit PowerMeterage den Verbrauch nach Versorgungsschienen aufschlüsseln. DCDC auf die Batterieseite umrechnen; der englische Originaltext nennt den Wirkungsgrad „80%90%“, während der chinesische Abschnitt 3.1 ausdrücklich ~80%-90% schreibt. Beim LDO sind Ausgangs- und Eingangsstrom gleich. DCDC, LDO und weitere Versorgungen auf die Batterieseite umrechnen und zur Gesamtabschätzung addieren. Große Abweichungen von der Batteriemessung können auf Leckströme hindeuten und erfordern weitere Analyse. Es folgt das Beispiel eines statischen Desktops auf dem RK3326 EVB.

Alle Schienenwerte müssen auf die Batterie (3.8V) bezogen werden. Daher ist der Vergleich von gemessenem und berechnetem Batteriestrom zweckmäßig.

Typ Versorgung Spannung (V) Gemessener Strom (mA) Berechneter Strom bei 3.8V (mA) Anmerkung
DC/DC VDD_ARM 0.96 10.20 3.23 80% Wirkungsgrad: V * I / Wirkungsgrad / Batteriespannung
DC/DC VDD_LOG 0.96 89.30 28.20 LOG-Beispiel: 0.96 * 89.3 / 0.8 / 3.8 = 28.2
DC/DC VCC_DDR 1.26 38.50 15.91  
DC/DC VCC_IO 2.99 4.50 4.43  
LDO VCC_1V8 1.81 28.80 28.80 LDO-Ausgangsstrom gleich Eingangsstrom
LDO VDD_1V0 1.00 10.90 10.90  
LDO VCC3V0_PMU 3.01 1.20 1.20  
Batterie VBAT 3.81 94.60 92.67 Berechnung nahe am Messwert

3.2 Vergleich mit dem EVB

Die einzelnen Versorgungsschienen im gleichen Szenario mit dem EVB vergleichen, um Auffälligkeiten zu erkennen. Unten steht der Vergleich des statischen Desktops auf RK3326 EVB und Kundenprototyp. ARM und LOG des Kundenboards sind auffällig und müssen weiter untersucht werden.

Typ Versorgung EVB-Spannung (V) EVB-Strom (mA) Kundenspannung (V) Kundenstrom (mA)
DC/DC VDD_ARM 0.96 10.20 1.10 212.50
DC/DC VDD_LOG 0.96 89.30 1.00 151.30
DC/DC VCC_DDR 1.26 38.50 1.27 40.50
DC/DC VCC_IO 2.99 4.50 2.99 4.80
LDO VCC_1V8 1.81 28.80 1.81 29.80
LDO VDD_1V0 1.00 10.90 1.00 10.20
LDO VCC3V0_PMU 3.01 1.20 3.01 1.40
Versorgung VBAT 3.81 94.60 3.81 191.6

3.3 Analyse der einzelnen Versorgungsschienen

3.3.1 VDD_CORE/VDD_CPU/VDD_ARM

Diese drei Namen bezeichnen dieselbe Versorgung der ARM-Kerne. Frequenz-/Spannungstabelle (opp-table) prüfen und gemessene mit eingestellter Spannung vergleichen. Zugehörige Befehle:

/* Acquire the frequency voltage table, target column means the voltage required
by some frequency */
cat /sys/kernel/debug/opp/opp_summary
 device                rate(Hz)    target(uV)    min(uV)    max(uV)
-------------------------------------------------------------------
...
 cpu0
                      408000000       950000      950000     1350000
                      600000000       950000      950000     1350000
                      816000000      1000000     1000000     1350000
                     1008000000      1125000     1125000     1350000
                     1200000000      1275000     1275000     1350000
                     1248000000      1300000     1300000     1350000
                     1296000000      1350000     1350000     1350000

/* Check the frequency scaling strategy currently used by cpufreq, cpu frequency
scaling is enabled with the default interactive strategy */
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
interactive
/* Set userspace strategy to fix the frequency of cpu, then set different
frequencies, compare the set voltage with the measured voltage */
echo userspace > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
userspace

/* Check the frequency point supported by cpufreq */
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_frequencies
408000 600000 816000 1008000 1200000 1248000 1296000

/* Set the fixed frequency */
echo 408000 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_setspeed

/* Confirm current frequency*/
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq
408000

/* Confirm current voltage, and compare with measured value, vdd_arm represents
the name of regulator, which is differnt for differnt projects*/
cat /sys/kernel/debug/regulator/vdd_arm/voltage
950000

/* Acquire current voltages of all regulators*/
cat /sys/kernel/debug/regulator/regulator_summary
 regulator                      use open bypass voltage current     min     max
-------------------------------------------------------------------------------
...
 vcc3v8_sys                       0   12      0  3800mV     0mA  3800mV  3800mV
    deviceless                                                      0mV     0mV
    vdd_logic                     0    4      0   950mV     0mA   950mV  1350mV
       dmc                                                        950mV  1350mV
       ff400000.gpu                                               950mV  1350mV
       bus-apll                                                   950mV  1350mV
       deviceless                                                   0mV     0mV
    vdd_arm                       0    2      0   950mV     0mA   950mV  1350mV
       cpu0                                                       950mV  1350mV
       deviceless                                                   0mV     0mV
...

CPU-Auslastung prüfen und auffällige Tasks oder Interrupts untersuchen.

/* Use top command to check the task loading, the output of top with different
versions will have difference, this version of top supports to check the thread
and the running cpu of the thread */
top -m 5 -t
User 51%, System 2%, IOW 0%, IRQ 0%
User 712 + Nice 0 + Sys 33 + Idle 634 + IOW 0 + IRQ 0 + SIRQ 0 = 1379

/* PR column represents currently running cpu of the thread, the sum of all cpu
loading percentage is equal to 100%, so the highest loading percentage of each
cpu is 100%/NR_CPU, the highest loading percentage of each CPU of SoC with 4
cores is 25% */
  PID   TID PR CPU% S     VSS     RSS PCY UID      Thread          Proc
 2631  2631  3  25% R   3104K    552K  fg root     busybox         busybox
 2632  2632  2  25% R   3104K    552K  fg root     busybox         busybox
 2633  2633  1   3% R    740K    400K  fg root     top             /data/top
  255   476  0   0% S  15492K   4988K  fg system   HwBinder:255_1  /vendor/bin/hw/android.hardware.sensors@1.0-service
  419   478  1   0% S 3770752K 256884K  fg system   SensorService   system_server

/* Use cpustats to observe the frequency change of cpu */
cpustats
Total: User 600 + Nice 0 + Sys 3 + Idle 591 + IOW 0 + IRQ 0 + SIRQ 0 = 1194
  408000kHz 0 +
  600000kHz 0 +
  816000kHz 0 +
  1008000kHz 0 +
  1200000kHz 0 +
  1248000kHz 0 +
  1296000kHz 0 +
  1416000kHz 0 +
  1512000kHz 1200 = 1200 /* within the statistic time, there are 1200 system
jiffies in total, 1512M running for 1200 jiffies */
/* from below, we can see the loading status of each cpu, including user mode,
kernel mode, interrupt and idle time */
cpu0: User 0 + Nice 0 + Sys 1 + Idle 294 + IOW 0 + IRQ 0 + SIRQ 0 = 295
cpu1: User 299 + Nice 0 + Sys 1 + Idle 0 + IOW 0 + IRQ 0 + SIRQ 0 = 300
cpu2: User 1 + Nice 0 + Sys 1 + Idle 296 + IOW 0 + IRQ 0 + SIRQ 0 = 298
cpu3: User 300 + Nice 0 + Sys 1 + Idle 0 + IOW 0 + IRQ 0 + SIRQ 0 = 301

/* check the ratio of running time for each frequency through cpufreq node, time
unit: jiffies */
cat /sys/devices/system/cpu/cpu0/cpufreq/stats/time_in_state
408000 718186
600000 548
816000 368
1008000 1578
1200000 1104
1248000 84
1296000 101
1416000 678
1512000 47495

/* check the inturrupt quantity of all peripherals */
cat /proc/interrupts
           CPU0       CPU1       CPU2       CPU3
  1:          0          0          0          0     GICv2  29 Edge     arch_timer
  2:     181898     165057     636772     839244     GICv2  30 Edge     arch_timer
  5:     180743      39000      28905      65189     GICv2  62 Level     rk_timer
 13:     260634          0          0          0     GICv2  39 Level     ff180000.i2c
 14:     354805          0          0          0     GICv2  40 Level     ff190000.i2c
 15:          0          0          0          0     GICv2  41 Level     ff1a0000.i2c
...

3.3.2 VDD_GPU

Für VDD_GPU hauptsächlich die Frequenz-/Spannungstabelle sowie die Übereinstimmung von Mess- und Sollspannung über devfreq-Knoten prüfen. Bei manchen SoCs besitzt die GPU keine eigene VD, sondern liegt in VDD_LOGIC; dann ist dessen Spannung zu prüfen.

/* acquire the frequency voltage table */
cat /sys/kernel/debug/opp/opp_summary
 device                rate(Hz)    target(uV)    min(uV)    max(uV)
-------------------------------------------------------------------
...
 platform-ff400000.gpu
                      200000000       950000      950000      950000
                      300000000       950000      950000      950000
                      400000000      1025000     1025000     1025000
                      480000000      1100000     1100000     1100000
                      520000000      1150000     1150000     1150000
...

/* check the frequency scaling strategy currently used by gpu devfreq, gpu
frequency scaling is enabled with the default simple_ondemand strategy */
cat /sys/class/devfreq/ff400000.gpu/governor
simple_ondemand

/* Set userspace strategy to fix the frequency of gpu, then set different
frequencies, compare the set voltage with measured voltage */
echo userspace > /sys/class/devfreq/ff400000.gpu/governor
cat /sys/class/devfreq/ff400000.gpu/governor
userspace

/* check the frequency points supported by gpu devfreq */
cat /sys/class/devfreq/ff400000.gpu/available_frequencies
520000000 480000000 400000000 300000000 200000000

/* set the fixed frequency */
echo 200000000 > /sys/class/devfreq/ff400000.gpu/userspace/set_freq

/* confirm current frequency */
cat /sys/class/devfreq/ff400000.gpu/cur_freq
200000000

/* confirm current voltage, and compare with measued value */
cat /sys/kernel/debug/regulator/vdd_gpu/voltage
950000

/* check gpu loading */
cat /sys/class/devfreq/ff400000.gpu/load
0@200000000Hz

ff400000 ist die GPU-Registeradresse; daher hängt der Name ff400000.gpu vom Chip ab.

3.3.3 VDD_LOGIC

VDD_LOGIC enthält normalerweise viele Module und ist für die Verbrauchsverwaltung in mehrere PD unterteilt. Betriebsfrequenzen und Ein-/Aus-Zustände der Module prüfen.

cat /sys/kernel/debug/clk/clk_summary
   clock                         enable_cnt  prepare_cnt        rate   accuracy phase
----------------------------------------------------------------------------------------
 xin24m                                   9           10    24000000          0 0
...
    pll_gpll                              1            1  1200000000          0 0
       gpll                               9           20  1200000000          0 0
          clk_sdio_div50                  1            1   100000000          0 0
             clk_sdio                     1            5   100000000          0 0
                sdio_sample               0            1    50000000          0 0
                sdio_drv                  0            1    50000000          0 180
          clk_emmc_div50                  1            1   300000000          0 0
             clk_emmc                     1            5   300000000          0 0
                emmc_sample               0            1   150000000          0 42
                emmc_drv                  0            1   150000000          0 180
...

Ein-/Aus-Zustand jeder PD prüfen.

cat /sys/kernel/debug/pm_genpd/pm_genpd_summary                                <
domain                          status          slaves
    /device                                             runtime status
----------------------------------------------------------------------
pd_gpu                          off
    /devices/platform/ff400000.gpu                      suspended
pd_vi                           off
    /devices/platform/ff4a8000.iommu                    suspended
pd_vo                           on
    /devices/platform/ff460f00.iommu                    active
    /devices/platform/ff470f00.iommu                    suspended
    /devices/platform/ff2e0000.video-phy                suspended
    /devices/platform/ff450000.dsi                      active
    /devices/platform/ff460000.vop                      active
    /devices/platform/ff470000.vop                      suspended
    /devices/platform/ff480000.rk_rga                   suspended
pd_vpu                          off
    /devices/platform/ff440440.iommu                    suspended
    /devices/platform/ff442800.iommu                    suspended
    /devices/platform/vpu_combo                         suspended
pd_mmc_nand                     on
    /devices/platform/ff380000.dwmmc                    unsupported
    /devices/platform/ff390000.dwmmc                    unsupported
    /devices/platform/ff3b0000.nandc                    active
pd_gmac                         off
pd_sdcard                       off
pd_usb                          on
    /devices/platform/ff300000.usb                      active

Das DDR-Modul liegt üblicherweise in VDD_LOGIC und benötigt relativ viel Leistung. Wie die GPU verwendet es devfreq; Frequenz-/Spannungstabelle und Messspannungen prüfen. DDR besitzt zusätzliche Stromsparparameter wie pd_idle, sr_idle, odt-Schaltung und weitere Timing-Einstellungen. Die Abstimmung ist komplex; dafür die ausführliche DDR-Dokumentation verwenden.

cat /sys/kernel/debug/opp/opp_summary
 device                rate(Hz)    target(uV)    min(uV)    max(uV)
-------------------------------------------------------------------
 platform-dmc
                      194000000       950000      950000      950000
                      328000000       950000      950000      950000
                      450000000       950000      950000      950000
                      528000000       975000      975000      975000
                      666000000      1000000     1000000     1000000
...

/* ddr uses dmc_ondemand frequency scaling strategy by default */
cat /sys/class/devfreq/dmc/governor
dmc_ondemand

Weitere Befehle zur Frequenz- und Spannungseinstellung entsprechen GPU devfreq.

3.3.4 VCC_DDR

VCC_DDR versorgt hauptsächlich DDR-Bausteine und den DDR-IO-Anteil des SoC. Frequenz, Auslastung, Stromspareinstellungen und DDR-Typ beeinflussen den Verbrauch. Selbst unter gleichen Bedingungen können Bausteine verschiedener Hersteller deutlich unterschiedliche Leistungsaufnahmen haben.

3.3.5 VCC_IO

VCC_IO versorgt hauptsächlich die IO-Pads des SoC und einige Peripheriegeräte. Betriebszustand und Leckströme der Peripherie sowie übereinstimmende Pinzustände prüfen, beispielsweise einen High-Ausgang des SoC bei einem angeschlossenen Low-Pin der Peripherie.

3.4 Typische Szenarien

3.4.1 Statischer Desktop

Hauptsächlich arbeitet das Anzeigemodul. CPU, GPU und DDR sollten auf minimale Frequenzen und in Stromsparzustände wechseln; VDD_CPU, VDD_GPU und VDD_LOGIC auf die niedrigsten opp-table-Spannungen. clk_summary und pm_genpd_summary prüfen und sicherstellen, dass WIFI, BT und weitere Peripherie ausgeschaltet sind. Der statische Desktop bildet die Grundlage anderer Szenarien und sollte zuerst optimiert werden.

3.4.2 Videowiedergabe

Hauptsächlich arbeitet der Videodecoder VPU/RKVDEC; die GPU ist normalerweise ausgeschaltet. Insbesondere DDR-Frequenz und VDD_LOGIC-Spannung prüfen.

3.4.3 Spiele

Hauptsächlich arbeiten CPU und GPU. Auslastung, Frequenzänderungen und korrekte VDD_CPU-/VDD_GPU-Spannungen analysieren.

3.4.4 Tiefschlaf

Normalerweise sind VDD_CPU und VDD_GPU abgeschaltet; VDD_LOG versorgt nur bestimmte Aufwachmodule. Daher besonders IO, DDR-Bausteine und Peripherie untersuchen.

4. Optimierungsstrategien

4.1 CPU-Optimierung

cpufreq-Parameter anpassen.

/* the default frequency scaling strategy used is interactive, relative
parameters are as follows: */
ls -l /sys/devices/system/cpu/cpu0/cpufreq/interactive
go_hispeed_load     /* when the loading is larger than go_hispeed_load and the
frequency is smaller than hispeed_freq, directly jump to hispeed_freq */
hispeed_freq        /* when jumping from low frequency to high frequency, need to
jump to hispedd_freq first */
above_hispeed_delay /* when the frequency is larger than hispeed_freq, the time
duration before each frequency increase */
min_sample_time     /* after each frequency increase, if it is to reduce the
frequency next time , the time duration before frequency reduce */
target_loads        /* the target loading of the frequency scaling */
timer_rate          /* the loading sampling time,unit:us */
timer_slack         /* the loading sampling time after cpu entering idle */
boost               /* when the frequency is smaller than hispeed_freq, keep
boost to hispeed_freq */
boostpulse          /* when the frequency is smaller than hispeed_freq, boost to
hispeed_freq, keep a while */
boostpulse_duration /* time duration of boostpulse, unit:us */
io_is_busy          /* whether to compute io wait to cpu loading */

Wichtige Parameter: hispeed_freq, target_loads und timer_rate. Für hispeed_freq eine passende Übergangsfrequenz wählen, die die CPU mit optimalem Verbrauch im mittleren Bereich hält; zu hohe oder niedrige Werte begünstigen Sprünge auf hohe Frequenzen. Größere target_loads- oder timer_rate-Werte erleichtern niedrige Frequenzen und verringern sowohl Verbrauch als auch Leistung.

Einige CPUs abschalten und die maximale CPU-Frequenz begrenzen.

/* close cpu2,cpu3 */
echo 0 > /sys/devices/system/cpu/cpu2/online
echo 0 > /sys/devices/system/cpu/cpu3/online

/* set the max frequency of cpu0 to 1200MHz */
echo 1200000 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq

Bei ARM-Big-Little-SoCs lassen sich rechenintensive Tasks mittels CPUSET an die energieeffizienteren kleinen Kerne binden. Auch bei SMP können Tasks auf bestimmte CPUs konzentriert werden, damit andere Stromsparzustände erreichen. Dadurch können die aktiven CPUs jedoch häufiger hohe Frequenzen benötigen und den Verbrauch sogar erhöhen.

/* create group of litte core*/
mkdir /dev/cpuset/little

/* set cpu used by group of little core */
echo 0-3 > /dev/cpuset/little/cpus

/* add pid=1111 task into the group of little core */
echo 1111 > /dev/cpuset/little/tasks

/* Android system creates several groups by default, the framework layer puts the
tasks into differenct groups, you can adjust cpus of each group, analyze the
power consumption */
ls /dev/cpuset
background
foreground
system-background
top-app

Ergänzende Erläuterungen aus der chinesischen Quelle: background enthält Hintergrundaufgaben; foreground enthält Vordergrundaufgaben; system-background enthält Hintergrundaufgaben auf Systemebene; top-app enthält die Vordergrundaufgabe mit Eingabefokus. Die englische Quelle nennt diese Gruppen ohne diese Kommentare.

CPU-Zeit rechenintensiver Tasks über CPUCTL begrenzen; CONFIG_CFS_BANDWIDTH muss aktiviert sein.

/* create the group of bandwidth limitation */
mkdir /dev/cpuctl/mygroup

/* set the cycle of bandwidth limitation as 10ms */
echo 10000 > /dev/cpuctl/mygroup/cpu.cfs_quota_us

/* within each cycle, total running time of the tasks in the group cannot exceed
5ms, this value can be larger than cfs_quota_us, because it is the total running
time of multiple cpus */
echo 5000 > /dev/cpuctl/mygroup/cpu.cfs_period_us

/* add relative tasks into the group */
echo 1111 > /dev/cpuctl/mygroup/tasks
echo 1112 > /dev/cpuctl/mygroup/tasks

/* cpu.shares means to limit the bandwidth of the task through weight, used for
performance optimization, without affecting the power consumption */
/dev/cpuctl/mygroup/cpu.shares

4.2 DDR-Optimierung

Szenarioabhängige Frequenzanpassung: unterschiedliche DDR-Frequenzen für 4K-Video, Aufnahme, zwei Displays und weitere Szenarien konfigurieren.

/* scenario definition */
include/dt-bindings/clock/rk_system_status.h
#define SYS_STATUS_NORMAL       (1<<0)
#define SYS_STATUS_SUSPEND      (1<<1)
#define SYS_STATUS_IDLE         (1<<2)
#define SYS_STATUS_REBOOT       (1<<3)
#define SYS_STATUS_VIDEO_4K     (1<<4)
#define SYS_STATUS_VIDEO_1080P  (1<<5)
...

/* configure the frequencies for different scenarios in dts */
arch/arm64/boot/dts/rockchip/px30.dtsi
dmc: dmc {
    compatible = "rockchip,px30-dmc";
    ...
    system-status-freq = <
        /*system status         freq(KHz)*/
        SYS_STATUS_NORMAL       528000
        SYS_STATUS_REBOOT       450000
        SYS_STATUS_SUSPEND      194000
        SYS_STATUS_VIDEO_1080P  450000
        SYS_STATUS_BOOST        528000
        SYS_STATUS_ISP          666000
        SYS_STATUS_PERFORMANCE  666000
    >;
    ...

/* acquire the current scenario */
cat /sys/class/devfreq/dmc/system_status
0x401

Lastabhängige Anpassung: Auslastung überwachen und DDR-Frequenz automatisch regeln. Dies kann die Leistung verringern; mit der Szenariosteuerung kombinieren und bei Bedarf eine feste Frequenz verwenden.

/* configure the parameter of frequency scaling with loading in dts, need to open
dfi node to monitor DDR utility ratio */
dmc: dmc {
    compatible = "rockchip,px30-dmc";
    ...

    /* use dfi to monitor the utility ratio of DDR */
    devfreq-events = <&dfi>;

        /*
     * the threshold of frequency scaling:
     * when the utility ratio is over 40%, adjust to the highest frequency.
     * when the loading is less than 40% and larger than 40%-20%, maintain
current frequency.
     * when the loading is less than 40%-20%, it will adjust the frequency to a
certain value to make the loading to be around 40%-2%/2.
     */
    upthreshold = <40>;
    downdifferential = <20>;

/* check the DDR loading of current system */
cat /sys/class/devfreq/dmc/load                                       <
33@528000000Hz

Ausführliche DDR-DEVFREQ-Konfiguration und -Optimierung: „Rockchip-Developer-Guide-Linux4.4-Devfreq“.

4.3 Optimierung der Temperaturregelung

Ab einer bestimmten Temperatur steigt die Leistungsaufnahme stark, besonders bei hoher Spannung. Hardwarekühlung verbessern. Die softwareseitige Temperaturstrategie so abstimmen, dass starke Temperaturschwankungen vermieden werden. Hohe Spannung bei hoher Temperatur per Software begrenzen.

&cpu0_opp_table {
    /* when the temperature is over 85 degree, limit the max voltage of cpu to
1.1V */
    rockchip,high-temp = <85000>;
    rockchip,high-temp-max-volt = <1100000>;

    /* or directly limit the max frequency to avoid the high voltage */
    rockchip,high-temp-max-freq = <1008000>;
};

4.4 Optimierung der Versorgung

Bei Abwärtswandlung mit großem Spannungsabfall und Strom empfiehlt sich DCDC, um Wirkungsgrad zu erhöhen und Verbrauch zu senken. Beispiel: 3.3V Eingang, 1.0V–50mA Ausgang.

Versorgungstyp Eingangsstrom Leistungsaufnahme
LDO 50mA 165mW
DCDC (80% Wirkungsgrad) 18.9mA 62.4mW

Dieses Thema entdecken → · Lernpfade →