void power_set_mode (PowerMode new_mode);

gestionare energiei

void power_set_controller_mode (PowerController * controller, PowerMode new_mode);

void power_set_controller_mode_now (controller PowerController *, PowerMode new_mode);

Schimbarea modului Global Power

Funcționalitatea principală acceptată de pachetul de gestionare a energiei este schimbarea modului global de alimentare a sistemului. Acest lucru se realizează apelând funcția power_set_mode cu un singur argument, care ar trebui să fie unul dintre PowerMode_Active, PowerMode_Idle, PowerMode_Sleep sau PowerMode_Off. De obicei, această funcție va fi invocată numai în anumite scenarii:

Un sistem tipic va conține un modul de politică care este în primul rând responsabil pentru inițierea modificărilor modului de alimentare și un fir din pachetul de gestionare a energiei. Modulul de politică va numi power_set_mode, care are ca efect manipularea unei stări interne din pachetul de gestionare a energiei și trezirea firului său. Când acest thread este programat să ruleze (prioritatea sa este controlată de o opțiune de configurare), va itera asupra controlerelor de putere și va invoca fiecare controler pentru a-și schimba modul de alimentare. Există suport pentru o funcție de apel invers și pentru controlere de putere detașate.

După un apel către power_set_mode, dar înainte ca firul de gestionare a energiei să aibă șansa de a itera pe toate controlerele sau chiar înainte ca firul să fie reprogramat, modulul de politică poate decide că un alt mod de alimentare ar fi mai potrivit pentru actualul situație și apelează din nou power_set_mode. Acest lucru are ca efect întreruperea modificării de mod anterioare, urmată de firul de gestionare a energiei care repetă controlerele de putere pentru noul mod.

Dacă nu există un singur modul de politică responsabil pentru modificările modului de alimentare, orice cod poate apela power_set_mode. Dacă există mai multe apeluri în succesiune rapidă, apelurile anterioare vor fi întrerupte și sistemul ar trebui să ajungă în modul de alimentare corespunzător ultimului apel

Ca un caz special, este posibil ca un controler de putere să apeleze power_set_mode atunci când este invocat de firul de gestionare a energiei. De exemplu, un controler de putere ar putea decide că este inadecvat ca sistemul să intre în repaus, deoarece dispozitivul cu care este asociat este încă ocupat. Efectul este ca și cum modulul de politică ar fi apelat din nou power_set_mode înainte de finalizarea modificării modului.

Dacă pachetul de gestionare a energiei a fost configurat să nu folosească un fir separat, atunci comportamentul este oarecum diferit. Apelul la power_set_mode va itera acum peste diferitele controlere de putere imediat, mai degrabă decât să lase acest lucru unui fir separat, iar întreaga modificare a modului se finalizează înainte de revenirea power_set_mode. Dacă un alt fir sau un DSR apelează simultan power_set_mode, comportamentul sistemului este nedefinit. Cu toate acestea, este încă legal ca un controler de putere să apeleze power_set_mode: efectiv acesta este un apel recursiv; este detectat de sistem, iar starea internă este actualizată; apelul recursiv power_set_mode revine acum și, atunci când controlerul de putere revine la apelul power_set_mode original, detectează ce s-a întâmplat, întrerupe modificarea anterioară a modului și începe o nouă modificare a modului, așa cum a solicitat controlerul.

power_set_mode este invocat în mod normal din contextul firului. Dacă se folosește un fir separat de gestionare a energiei, acesta poate fi invocat în siguranță din contextul DSR. Dacă sistemul este configurat să nu utilizeze un astfel de fir, poate fi sau nu sigur să invocăm această funcție din contextul DSR: în esență, funcția doar iterează prin diferitele controlere de putere și documentația sau codul sursă al fiecărui controler prezent în sistemul actual va trebui examinat pentru a determina dacă acest lucru se poate întâmpla sau nu în condiții de siguranță în contextul DSR. power_set_mode nu trebuie invocat niciodată din contextul ISR.

Manipularea unui controler individual de putere

În unele cazuri, este de dorit să setați modul de alimentare al unui controler individual separat de modul pentru sistemul în ansamblu. De exemplu, dacă un dispozitiv nu este utilizat în prezent, atunci controlerul de putere asociat ar putea fi setat la PowerMode_Off, chiar dacă sistemul în ansamblu este încă activ. Acest lucru poate fi realizat apelând funcția power_set_controller_mode. Este nevoie de două argumente: primul identifică un anumit controler; al doilea specifică noul mod de alimentare dorit pentru controlerul respectiv. Funcția funcționează în același mod ca power_set_mode, de exemplu, dacă se folosește un fir separat de gestionare a energiei, atunci power_set_controller_mode funcționează manipulând o anumită stare internă și trezind acel thread. Limitările sunt, de asemenea, la fel ca pentru power_set_mode, deci, de exemplu, power_set_controller_mode nu ar trebui invocate din interiorul ISR-urilor.

Manipularea directă a unui controler de putere

În circumstanțe excepționale, poate fi necesar să invocați direct un controler de putere, ocolind firul de gestionare a energiei și funcționalitatea de nivel superior, cum ar fi funcțiile de apel invers. Funcția power_set_controller_mode_now permite acest lucru. Este nevoie de două argumente, un controler și un mod, la fel ca power_set_controller_mode .

Utilizarea power_set_controller_mode_now este periculoasă. De exemplu, nu se face nicio încercare de sincronizare cu alte modificări ale modului de alimentare care ar putea avea loc simultan. O posibilă utilizare este atunci când sistemul este trezit din modul de repaus: în funcție de hardware, de pe care sunt prezente controlerele de putere și de codul aplicației, poate fi necesar să treziți unele controlere de putere imediat înainte ca sistemul în ansamblu să fie gata să fugă din nou.