Программные методы управления энергопотреблением устройств

09/02/2011 - 13:03
Нейтан Теннис

  Создаете ли вы операционную систему, микропрограммы или даже драйверы, от того, как вы напишете программное обеспечение, будет зависеть энергопотребление  конечного устройства. 
 
   Более века назад американский инженер Артур Веллингтон придумал шуточное и ёмкое определение нашей профессии: «Инженерия - это искусство качественно выполнить за один доллар ту работу, которую плохой работник может сделать за два доллара...» Другими словами, инженерия - это поиск баланса между качеством и эффективностью.
  
  Будучи инженерами встраиваемых систем, мы должны находить этот баланс. Для этого мы оптимизируем работу наших программ таким образом, чтобы они выполнялись на более медленных и дешевых микропроцессорах. Уменьшаем размер программ, чтобы использовать память меньшей ёмкости и цены. А поскольку многие из нас пишут теперь программное обеспечение для переносных и беспроводных устройств, все в большей степени оптимизируем энергопотребление таких систем, чтобы повысить долговечность батарейных источников питания.
 
 Существует несколько программных методов, позволяющих снизить энергопотребление устройств, но в этой статье мы сосредоточимся только на  четырёх из них.
 

Режим ожидания

   Большинство современных микропроцессоров и микроконтроллеров имеют специальные режимы работы, предназначенные для снижения энергопотребления. Самым распространенным из них является режим ожидания (idle mode). В этом режиме  часть ядра микропроцессора, выполняющая команды, останавливается, а все периферийные устройства и прерывания продолжают работать. 
 
   Переключение в режим ожидания и выход из него требует небольших временных затрат и может происходить несколько раз в миллисекунду. Каждый раз, когда операционная система обнаруживает, что все процессы заблокированы в ожидании прерывания, события или тайм-аута, она должна перевести микропроцессор в режим ожидания, чтобы уменьшить энергопотребление. Так как любое прерывание может вывести микропроцессор из режима ожидания, использование этого режима позволяет программному обеспечению осуществлять интеллектуальное ожидание событий в системе. Однако не все так просто и для максимальной производительности этот способ требует тщательной разработки программы.
 
  Допустим, мы написали код, который опрашивает регистр состояния и ожидает установки флага. Возможно, мы проверяем флаг статуса FIFO буфера в последовательном порту, чтобы узнать, были ли получены данные. Или, возможно, мы контролируем двухпортовую ячейку памяти, чтобы узнать, записал ли другой процессор или устройство в системе переменную, предоставляя нам контроль над совместно используемым ресурсом. При всей полезности данного процесса, циклический опрос регистра лишает нас возможности продлить срок службы батареи/аккумулятора. 
 
  Более удачное решение состоит в том, чтобы использовать внешнее прерывание,  сигнализирующее об изменении статусного флага. В однопоточной программе это позволит перевести микропроцессор в режим ожидания. В случае возникновения прерывания, микропроцессор автоматически проснется и продолжит выполнение кода.
 
   Если событие не может быть непосредственно привязано к внешнему прерыванию, переключение микропроцессора в режим ожидания и выход из него можно выполнять по сигналу системного таймера. Этот вариант все еще предпочтительней циклического опроса. Например, вы ожидаете какое-то событие и знаете что обработаете его, проверяя статус события каждую миллисекунду. Включите системный таймер на 1 миллисекунду и переведите микропроцессор в режим ожидания. Каждый раз, когда запускается прерывание проверяйте статус события. Если статус не изменился, переводите микропроцессор снова в режим ожидания.
 
  Подавляющее большинство современных карманных компьютеров и смартфонов работает на микропроцессорах и операционных системах, использующих режим ожидания. Фактически, большинство из этих устройств переключается в режим ожидания и выходит из него многократно в течение секунды; они выходят из этого режима всякий раз, когда кто-то дотрагивается до сенсорного экрана, нажимает клавишу или когда возникает какое-либо событие.

Сокращение событий

   Следующий метод снижения энергопотребления, который мы рассмотрим, основан на уменьшение числа событий, происходящих в системе.  В то время как интеллектуальное ожидание подразумевает как можно более частое переключение микропроцессора в режим ожидания, уменьшение числа событий позволяет удержать микропроцессор в режиме ожидание как можно дольше. 
 
   Например, вы работаете с многозадачной операционной системой, которая использует для планирования процессов кванты времени. Обычно для этих целей используется таймер, настроенный на временной интервал порядка 1 миллисекунды. Если Ваш код позволяет эффективно использовать метод интеллектуального ожидания, то операционная система будет находить возможность переводить микропроцессор в спящий режим. Конечно, прерывание, которое вероятнее всего разбудит микропроцессор в данной ситуации - будет прерыванием системного таймера. Даже если остальные процессы заблокированы в ожидании других прерываний,  внутренних событий или длительных задержек - прерывание таймера будет выводить микропроцессор из режима ожидания и запускать планировщик 1000 раз в секунду.
 
 Даже если планировщик обнаруживает, что все процессы заблокированы, и быстро возвращает микропроцессор в режим ожидания, при частом выполнении данной операции значительное количество энергии будет расходоваться впустую. В этом случае прерывания системного таймера в режиме ожидания следовало бы запретить, а пробуждение микропроцессора выполнять только при возникновении других прерываний.
 
   Конечно, обычно нецелесообразно полностью отключать прерывание таймера. В то время как большинство блокированных процессов могут непосредственно или косвенно ожидать внешних прерываний, некоторые процессы, возможно, передают управление операционной системе лишь на определенное время. Например, драйвер, может переходить в неактивный режим на 500 миллисекунд при ожидании периферийного устройства. В этом случае полная деактивация системного таймера в режиме ожидания будет означать, что процесс не возобновится вовремя.
 
 В идеале, желательно чтобы Ваша операционная система обладала возможностью  устанавливать для планировщика переменные тайм-ауты. Операционной системе известно, какие процессы ожидают внешние или внутренние события, а какие процессы запланированы  на продолжение работы в определенное время. Она может вычислить, когда запланирован запуск первого процесса, и установить системный таймера до перехода микропроцессора в  режим ожидания. Использование переменных тайм-аутов не увеличивает нагрузку планировщика и может способствовать экономии энергии и времени обработки.
 
   Переменные тайм-ауты - это только один из способов сокращения количества событий. Прямой доступ к памяти (DMA) позволяет микропроцессору оставаться в режиме ожидания в течение длительного времени, даже когда происходит обмен данными с периферийными устройствами. DMA должен использоваться в периферийных драйверах при любой возможности. Экономия может быть довольно значительной.
 
   Например, получение FIFO на последовательном порту процессора StrongARM Intel генерирует прерывание для приблизительно каждых восьми полученных байтов. При скорости обмена 115 200 бит в секунду, пакет данных в 11 Кбит отправленный на этот порт, заставлял бы ядро процессора прерываться и, возможно, выходить из режима ожидания где-то 1 500 раз в секунду.
 
  Если вы не собираетесь обрабатывать данные в этих маленьких, 8-байтовых блоках, то накладных расходы будут огромные. Желательно, чтобы DMA использовался с бОльшими объёмами буфера. Это уменьшит количество прерываний в секунду и позволит процессору находится в ждущем режиме дольше.  
 
   Использование DMA сокращает потребляемую мощность и разгружает процессор.

Контроль производительности

   Динамическая тактовая частота и регулировка напряжения питания являются еще одним способом уменьшения энергопотребления микропроцессора. Этот подход к управлению энергопотреблением основан на следующем правиле: энергия, расходуемая микропроцессором, прямо пропорциональна его тактовой частоте  и квадрату напряжения питания.

   Микропроцессоры с функцией динамического сокращения тактовой частоты являются первым шагом в экономии электроэнергии: уменьшите тактовую частоту на половину, и потребляемая мощность сократится пропорционально. Однако, используя только этот метод, реализовать эффективные стратегии энергопотребления довольно сложно, поскольку исполняемый код  при пониженной тактовой частоте потребует для своего завершения большего времени.

   Динамическое уменьшение напряжения - совсем другое дело. Все большее число микропроцессоров  позволяет с понижением тактовой частоты уменьшать и напряжение питания, а это приводит к снижению энергопотребления даже в тех случаях, когда одно только сокращение тактовой частоты ничего не дает. Фактически, пока микропроцессор не загружен, частота и напряжение могут непрерывно уменьшаться. Работа все ещё происходит, но в целом расход энергии ниже.

   Этот подход можно усовершенствовать, если учесть, что не все процессы (потоки) одинаково требовательны к пропускной способности микропроцессора. Процессы, которые эффективно используют пропускную способность, при пониженной тактовой частоте будут выполняться дольше; эти процессы используют каждый цикл, выделенный им. С другой стороны, процессы с ограничениями ввода-вывода тоже используют все циклы процессора, выделенные им, но при понижении тактовой частоты требуют для своего завершения то же самое время.

   В качестве примера рассмотрим PC карты (ранее PCMCIA), которые используются в КПК. Когда данные записываются на флэш-память, «узким местом» в системе является не скорость процессора, а физический шинный интерфейс и время, которое требуется встроенному программному обеспечению флэш-карты на стирание и повторную запись. 
 
   Конечно, желательно чтобы интеллектуальные методы ожидания, рассмотренные выше, использовались в этом случае для уменьшения потребляемой мощности, однако время ожидания часто является переменным параметром и намного меньшим, чем квант времени операционной системы. В результате интеллектуальное ожидание может затронуть  производительность, поэтому драйверы часто прибегают к опросу регистров состояния. Уменьшение тактовой частоты в этом случаях сэкономило бы энергию и не оказало бы  значительного влияния на время, необходимое для того, чтобы записать данные на карту.

   Разработчик должен понимать, когда возможно уменьшить тактовую частоту и напряжение питания, не оказывая особого влияния на производительность системы. 

Интеллектуальное завершение работы

   До сих пор мы обсуждали лишь то, что делать, когда устройство работает; теперь давайте рассмотрим, что происходит, когда устройство выключено. Большинство из нас воспринимает как данное тот факт, что мы можем включить наш КПК и продолжить работу с того места, где остановились; если мы уже наполовину ввели новый контакт, то с этого места мы и продолжим, включив КПК через неделю или месяц. Это достигается благодаря процедуре интеллектуального завершения работы (intelligent shutdown), которая «обманывает»   программное обеспечение, заставляя его "думать", что устройство  вообще никогда не выключалось.

   Когда пользователь выключает устройство, нажимая на кнопку «питание», прерывание сигнализирует операционной системе о начале завершения работы. Операционная система  сохраняет контекст выполняемых программ в памяти, а процессор переводится в режим ожидания, в котором выключается ядро и периферийные устройства. При этом некоторые важные внутренние периферийные модули, такие как часы реального времени и  динамическая оперативная память (DRAM), остаются в рабочем состоянии. 
   Когда кнопка «питание» нажимается снова, прерывание «будит» процессор. Он проверяет содержимое DRAM на предмет его целостности, вычисляя контрольную сумму, и восстанавливает свое внутреннее состояние. Если DRAM  содержит те же самые данные, что и до выключения питания, операционная система возвращается к процессу, который работал перед выключением устройства. При этом работающее приложение даже и не «замечает», что что-то произошло.
  Этот подход экономит электроэнергию, потому что позволяет избежать процедуры перезагрузки системы, требующей интенсивной работы процессора. Перезагрузка сложного устройства может занять несколько секунд, в течении которых происходит запуск драйверов. С точки зрения пользователя это время потрачено впустую, потому что в этот момент он не может пользоваться устройством. Таким образом, интеллектуальное завершения работы еще и улучшает юзабилити.

   Другой очень важный фактор в интеллектуальном завершении работы  - это минимизация потребляемой мощности в режиме ожидания. Поскольку устройство с батарейным питанием может не использоваться несколько дней, а для обновления DRAM и поддержания работы некоторых периферийный модулей процессора необходима энергия, то батареи все же будут терять часть своей мощности в течении периодов сна. 

   Уменьшение потребляемой мощности в режиме ожидания требует анализа аппаратных средств вашей системы. Например, большинство систем с батарейным питанием в режиме ожидания продолжает питать порты ввода-вывода общего назначения. В состоянии входа, выводы портов могут использоваться для пробуждения устройства; в состоянии выхода, они могут использоваться для конфигурирования внешних периферийных устройств. Внимательное рассмотрение того, как эти выводы сконфигурированы, может оказать значительное влияние на потребляемую мощность в режиме ожидания.
   Например, если вы сконфигурируете вывод микропроцессора на выход и «подтянете» его к плюсу питания, то установка на этом выводе логического нуля в режиме ожидания вызовет протекание тока через нагрузочный резистор. Если вы запрограммируете вывод на вход и он не будет ни к чему «подтянут», потенциал на нем будет «плавать», что может привести к побочным переходам логического уровня и, соответственно, повышению потребляемой  мощности. Важно проанализировать эти ситуации и конфигурировать порты ввода-вывода должным образом.

Заключение

   В этой статье мы рассмотрели некоторые программные технологии, способствующие  уменьшению энергопотребления устройств, работающих от батарей. Одни из них простые и прямолинейные, другие — требуют грамотного применения. В связи с возрастанием важности вопроса управления энергопотреблением, в будущем нас еще ожидают новые открытия в этой области.

Tennies, Nathan. "Software Matters for Power Consumption," Embedded Systems Programming, February 2003. Вольный перевод - ChipEnable.Ru 

Comments   

# TERMIN 2011-02-10 05:00
Хорошая статья, осталось закрепить новые знания практическим кодом
# Валентин 2011-02-10 08:41
спасибо! очень познавательно и живо написано!

У вас недостаточно прав для комментирования.