Univerzitet u Novom Sadu
Fakultet tehničkih nauka
Odsek za računarsku tehniku i računarske komunikacije
Linuks u ugrađenim sistemima i razvoj rukovalaca
Rukovanje potrošnjom
Blokovi PM-a
Postoji nekoliko blokova PM-a
Suspend and resume
CPUidle
PM u toku rada (runtime PM)
Skaliranje frekvencije i voltaže
Aplikacije
Nezavisni blokovi mogu biti poboljšani postepeno tokom razvoja
3
Radni okvir radnog takta (1/4)
Generički radni okvir za upravljanje blokovima koji koriste uređaji u sistemu
Dozvoljava referenciranje korisnika odbrojavanja takta i da se ugase nekorišćeni taktovi radi čuvanja energije
Jednostavan API je opisan u Documentation/DocBook/kernel-api/clk.html
clk_get() za uzimanje reference na takt
clk_enable() startovanje takta
clk_disable() stop takta
clk_put() oslobađanje takta
clk_get_rate() preuzimanje trenutnog stepna radnog takta
4
Radni okvir radnog takta (2/4)
Zajednički radni okvir ranog takta:
Dozvoljava deklarisanje slobodnih taktova i njihovih veza sa uređajima u stablu uređaja (preferirano) ili statičko deklarisanje u izvornom kodu (stara metoda)
Obezbeđuje debugfs prikaz stabla radnog takta
Implementiran je u drivers/clk.
5
Radni okvir radnog takta (3/4)
Sprega radnog okvira radnog takta je podeljena u dve polovine:
Common Clock Framework jezgro
Uobičajena definicija struct clk
Uobičajena implementcija clk.h API (definisan u drivers/clk/clk.c)
struct clk_ops: operacije pozvane od strane clk API implementacije
Ne bi trebalo da se modifikuje pri dodavanju novog rukovaoca
Specifična za fizičku arhitekturu
Povratni pozivi registrovani sa struct clk_ops i odgovarajućim strukturama specifičnim za fizičku arhitekturu
Mora biti napisan za svaki novi blok fizičke arhitekture
7
Radni okvir radnog takta (4/4)
Hardverske operacije radnog takta: stablo uređaja
Stablo uređaja je obavezan način deklarisanja radnog takta i njegovih resursa, a za svaki drugi rukovalac koji koristi stablo uređaja mora da se:
Parsira stablo uređaja za postavku radnog takta: preuzimaju se resursi, ali i odlike
Deklarišu compatible radni taktovi i vezuju se sa funkcijom za inicijalizaciju korišćenjem CLK_OF_DECLARE
8
Suspend and Resume
Infrastruktura u kernelu za podršku za suspend and resume
Na platformu se priključuje kroz:
prepare(), enter(), finish(), valid() funkcije u struct platform_suspend_ops
Registruje se korišćenjem suspend_set_ops() funkcije
Pogledati arch/arm/mach-at91/pm.c
Rukovaoci uređajem se priključuju kroz:
suspend() i resume() definisani u *_driver strukturama (struct platform_driver, struct usb_driver, itd.)
Videti drivers/net/ethernet/cadence/macb.c
9
Pokretanje Suspend-a
struct suspend_ops funkcije se zovu iz enter_state() funkcije u kernelu.
enter_state() se takođe brine o izvršavanju suspend() i resume() funkcija za vaše uređaje.
Izvršenje ove funkcije može biti pokrenuto iz korisničkog prostora. Za suspend RAM-a:
echo mem > /sys/power/state
Može se koristiti i s2ram apliakcija sa http://suspend.sourceforge.net/
Pogledajte kernel/power/suspend.c
10
PM u toku rada (runtime PM)
Prema kernel konfiguracionoj sprezi od rukovalaca se traži: Uključivanje funkcionalnosti za dozvolu ulazno izlaznim uređajima da budu stavljeni u stanja za čuvanje energije u toku rada (ili da budu “autosuspended”) nakon specifiranog vremenskog perioda neaktivnosti i da budu probuđene iz odgovora na wake-up događaj koji je generisala fizička arhitektura na zahtev rukovaoca.
Nova priključenja moraju biti dodata u rukovaoce: runtime_suspend(), runtime_resume(), runtime_idle()
Pogledajte prezentaciju Kevina Hilmana na ELC Europe 2010 o ovome: http://elinux.org/images/c/cd/ELC-2010-khilman-Runtime-PM.odp
11
Čuvanje energije u petlji mirovanja (stanje pripravnosti –
idle loop)
Stanje pripravnosti se dešava kada ne postoji ništa drugo pokrenuto u sistemu.
Implementirano je u svim arhitekturama u arch/<arch>/kernel/process.c
Primer za čitanje: potražite cpu_idle u arch/arm/kernel/process.c
Svaki ARM CPU definiše svoju arch_idle funkciju.
CPU može da čuva energiju:
HLT instrukcijama - dobavljanje i izvršenje instrukcija onemogućeno, takt radi
ulaženjem u NAP mod - isključen je interni takt jezgra
isključivanjem glavne vremenske kontrole (tickless systems).
Vidite još: https://en.wikipedia.org/wiki/Idle_(CPU)
12
Upravljanje u mirovanju (stanje pripravnosti)
Dodavanje podrške za više nivoa pripravnosti
Moderni CPU-ovi imaju nekoliko stanja mirovanja koja nude različita čuvanja energije vezan sa različitim kašnjenjima buđenjima
Odlika dinamičkog otkucaja (dynamic tick) dozvoljava uklanjanje periodičnog otkucaja sa ciljem čuvanja energije, i saznanje kad je zakazan sledeći događaj, za naprednije mirovanje.
Infrastruktura mirovanja CPU-a (CPUidle) za promenu stanja mirovanja:
Specifičan rukovalac za platformu koji definiše stanja mirovanja i operacije tranzicije
Upravljači nezavisni od platforme (ladder i menu)
Dostupno za x86/ACPI, nije za sad podržano od svih ARM CPU-ova
Pogledajte Documentation/cpuidle/ u izvornom kodu kernela. 13
PowerTOP
https://01.org/powertop/
Sa dinamičkim otkucajima, dozvoljava popravljanje delova kernel koda i aplikacija koji bude sistem prečesto.
PowerTOP dozvoljava praćenje ´najgorih prestupnika´
Dostupan na ARM CPU-ovima koji implementiraju CPUidle
Takođe, daje korisna uputstva za smanjivanje potrošnje energije
14
Skaliranje frekvencije i voltaže (1/2)
Skaliranje frekvencije i voltaže je moguće kroz cpufreq infrastrukturu kernela.
Generička infrastruktura: drivers/cpufreq/cpufreq.c i include/linux/cpufreq.h
Generički upravljači, odgovorni za odlučivanje frekvenicjskih i voltažnih tranzicija
performance: maksimalna frekvencija
powersave: minimalna frekvencija
ondemand: meri CPU potrošnju za podešavanje frekvencije
conservative: često bolji od ondemand. Samo uvećava frekvenciju postepeno kada CPU postane opterećen.
userspace: ostavlja odluku demonu korisničkog prostora.
Ova infrastruktura može da se kontroliše iz /sys/devices/system/cpu/cpu<n>/cpufreq/
15
Skaliranje frekvencije i voltaže (2/2)
CPU rukovaoci u drivers/cpufreq. Primer: drivers/cpufreq/omap-cpufreq.c
Moraju se implementirati operacije iz cpufreq_driver strukture i registrovati korišćenjem cpufreq_register_driver()
init() za inicijalizaciju
exit() za čišćenje
verify() za potvrdu polise odabrane od strane korisnika
setpolicy() ili target() da se zaista obavi promena frekvencije
Pogledajte Documentation/cpu-freq/ za više objašnjenja
16
PM sprega za kvalitet usluge (PM QoS interface)
Sprege kernela i korisničkog moda za registrovanje očekivanja performansi od strane rukovalaca, podsistema i aplikacija korisničkog prostora.
Postoje dva različita radna okvira za PM QoS spregu:
PM QoS klase za CPU DMA kašnjenje, mrežno kašnjenje i za mrežni protok.
Po-uređaju PM QoS API radnog okvira za upravljanje kašnjenjem po-uređaju.
Prema ovim zahtevima, PM QoS dozvoljava rukovaocima kernela da podese svoje upravljanje energijom.
Pogledajte Documentation/power/pm_qos_interface.txt
I dalje je potrebno da se odradi u većini rukovalaca. 17
Radni okvir za regulaciju
Moderne ugrađene fizičke arhitekture imaju namenski hardver odgovoran za regulaciju voltaže i struje.
Radni okvir za regulaciju dozvoljava da se iskoriste prednosti ovakvog hardvera kada delovi sistema nisu u upotrebi
Consumer sprega za rukovaoce uređajima (korisnike)
Regulator driver sprega za rukovaoce regulatorom
Machine sprega za konfiguraciju ploče
sysfs sprega za korisnički prostor
Pogledajte Documentation/power/regulator/ u izvornom kodu kernela
18
BSP rad za novu ploču
Za slučaj da vam je potreban BSP na vašoj ploči, a CPU već ima postojeću punu podršku za upravljanje energijom, potrebno je:
Kreirati definicije takta i vezati uređaje na njih
Implementirati rukovaoce (handlers) upravljanjem energije (suspend, resume) u rukovaocima za specifične uređaje na ploči
Implementirati rukovaoce (handlers) za PM u toku rada u rukovaocima
Implementirati priključivanje radnog okvira regulatora za našu ploču ako je potrebno.
Svi ostali delovi PM infrastrukture bi trebali već biti tu: suspend / resume, cpuidle, skaliranje frekvencije i voltaže.
19
Korisni resursi
Documentation/power/ u izvornom kodu Linuks kernela.
Sadrži mnogo kornisnih detalja.
http://wiki.linaro.org/WorkingGroups/PowerManagement/
Trenutni razvoj ARM platforme
Introduction to kernel power management, Kevin Hilman, Linaro
http://elinux.org/images/d/dd/Intro_Kernel_PM.svg
https://www.youtube.com/watch?v=Um0oRanCtzY
Saveti i ideje za produženje života baterije:
http://idlethread.blogspot.rs/2010/12/prolonging-battery-life-on-your.html
20