Зміна режиму живлення

void power_set_mode (PowerMode new_mode);

управління живленням

void power_set_controller_mode (контролер PowerController *, PowerMode new_mode);

void power_set_controller_mode_now (контролер PowerController *, PowerMode new_mode);

Зміна глобального режиму живлення

Основна функціональність, що підтримується пакетом керування живленням, полягає у зміні глобального режиму живлення системи. Це досягається викликом функції power_set_mode з одним аргументом, який повинен бути одним із PowerMode_Active, PowerMode_Idle, PowerMode_Sleep або PowerMode_Off. Зазвичай ця функція буде викликана лише в певних сценаріях:

Типова система буде містити модуль політики, який головним чином відповідає за ініціювання змін режиму живлення, і потік всередині пакета управління живленням. Модуль політики буде викликати power_set_mode, що призведе до маніпулювання деяким внутрішнім станом у пакеті управління живленням та пробудження його потоку. Коли цей потік планується запустити (його пріоритет контролюється параметром конфігурації), він буде перебирати контролери живлення та викликати кожен контролер, щоб змінити режим живлення. Існує підтримка функції зворотного виклику та окремих контролерів живлення.

Після виклику power_set_mode, але до того, як потік управління живленням мав можливість переглядати всі контролери, або навіть до того, як потік був взагалі перепланований, модуль політики може вирішити, що інший режим живлення буде більш доречним для поточного ситуація і знову викликає power_set_mode. Це призводить до скасування попередньої зміни режиму, а потім повторної ітерації потоку управління живленням над контролерами живлення для нового режиму.

Якщо немає жодного модуля політики, відповідального за зміни режиму живлення, будь-який код може викликати power_set_mode. Якщо є кілька викликів у швидкій послідовності, попередні дзвінки будуть припинені, і система повинна потрапити в режим живлення, що відповідає останньому дзвінку

Як особливий випадок, контролер живлення може викликати power_set_mode, коли його викликає потік управління живленням. Наприклад, контролер живлення може вирішити, що системі недоречно переходити в режим сну, оскільки пристрій, з яким він пов'язаний, все ще зайнятий. Ефект такий, ніби модуль політики знову викликав power_set_mode до завершення зміни режиму.

Якщо пакет управління живленням було налаштовано не використовувати окремий потік, то, очевидно, поведінка дещо інша. Тепер виклик power_set_mode буде негайно переглядати різні контролери потужності, а не залишати це в окремому потоці, і вся зміна режиму завершується до того, як power_set_mode повернеться. Якщо якийсь інший потік або DSR одночасно викликає power_set_mode, поведінка системи не визначена. Однак для регулятора потужності все ще дозволено викликати power_set_mode: фактично це рекурсивний виклик; вона виявляється системою, а внутрішній стан оновлюється; рекурсивний виклик power_set_mode тепер повертається, і коли контролер живлення повертається до початкового виклику power_set_mode, він виявляє те, що сталося, скасовує попередню зміну режиму і запускає нову зміну режиму за запитом контролера.

power_set_mode зазвичай викликається з контексту потоку. Якщо використовується окремий потік управління живленням, його можна безпечно викликати з контексту DSR. Якщо система налаштована на те, щоб не використовувати такий потік, можливо, а може і не безпечно викликати цю функцію з контексту DSR: по суті, функція просто ітераціюється через різні контролери потужності, а документація або вихідний код кожного контролера присутній у Поточну систему доведеться вивчити, щоб визначити, чи може це безпечно статися в контексті DSR. power_set_mode ніколи не слід викликати з контексту ISR.

Маніпулювання індивідуальним контролером живлення

У деяких випадках бажано встановити режим живлення окремого контролера окремо від режиму для системи в цілому. Наприклад, якщо пристрій в даний час не використовується, тоді для відповідного контролера живлення можна встановити значення PowerMode_Off, навіть коли система в цілому все ще активна. Цього можна досягти, викликавши функцію power_set_controller_mode. Він приймає два аргументи: перший ідентифікує конкретний контролер; другий визначає бажаний новий режим живлення для цього контролера. Функція працює приблизно так само, як power_set_mode, наприклад, якщо використовується окремий потік управління живленням, тоді power_set_controller_mode працює, маніпулюючи деяким внутрішнім станом і прокидаючи цей потік. Обмеження також майже такі ж, як і для power_set_mode, тому, наприклад, power_set_controller_mode не слід викликати зсередини ISR.

Безпосередня маніпуляція контролером живлення

У виняткових обставинах може знадобитися запустити контролер живлення безпосередньо, минаючи потік управління живленням та функціональні можливості вищого рівня, такі як функції зворотного виклику. Функція power_set_controller_mode_now дозволяє це. Потрібні два аргументи, контролер і режим, як і power_set_controller_mode .

Використання power_set_controller_mode_now небезпечно. Наприклад, не робиться спроб синхронізуватися з будь-якими іншими змінами режиму живлення, які можуть відбуватися одночасно. Можливе використання, коли система виходить з режиму сну: залежно від апаратного забезпечення, на якому присутні контролери живлення, і від коду програми може знадобитися пробудження деяких контролерів живлення безпосередньо перед тим, як система в цілому буде готовий знову бігти.