2008-09-15 3 views
42

В типичном портативном или портативном встроенном системном устройстве Срок службы батареи является серьезной проблемой при проектировании H/W, S/W и функций, которые может поддерживать устройство. С точки зрения программного обеспечения, один знает о MIPS, Memory (Data and Program) оптимизированном коде. Мне известно о режиме глубокого сна H/W, режиме ожидания, который используется для часов аппаратного обеспечения в более низких циклах или для переключения целых часов на некоторые неиспользованные каналы для экономии энергии, но я ищу некоторые идеи с этой точки view:Кодирование мощного программного обеспечения

В том случае, когда мой код работает, и ему нужно продолжать выполнение, учитывая это, как я могу эффективно написать код «власть», чтобы потреблять минимальные ватты?

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

Есть ли какие-либо соображения по дизайну на высоком уровне, которые следует учитывать при проектировании структуры кода или при разработке на низком уровне, чтобы сделать код максимально эффективным (наименее энергопотребляющим)?

+0

Согласен, это не имеет смысла для меня, но это очень хороший вопрос, тем не менее :) – Teifion 2008-09-15 10:18:19

+0

Зачем :-) Из того, что я вижу, большинство приложений в карманных устройствах, не обращают внимание на жизнь батареи больше :-(К счастью, эксплуатации системы все еще делают – itj 2008-09-15 10:30:50

ответ

5

Не опробуйте. Используйте события и другие примитивы ОС для ожидания уведомляемых вхождений. Опрос гарантирует, что процессор останется активным и будет использовать больше времени автономной работы.

1

Рассмотрите возможность использования сетевых интерфейсов как можно меньше. Возможно, вам захочется собрать информацию и отправить ее в очередях, а не постоянно отправлять ее.

9

Zeroith, используйте полностью статическую машину, которая может остановиться на холостом ходу. Вы не можете победить нулевую Гц.

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

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

В-третьих, если вам необходимо опросить или выполнить действия пользователя, такие как обновление пользовательского интерфейса, спать, сделать это и снова заснуть.

Не доверяйте фреймворкам графического интерфейса, которые вы не проверяли для типа «сна и вращения». В частности, для таймера событий вы можете искусить использование для # 2.

Заблокировать поток при чтении вместо опроса с помощью select()/epoll()/WaitForMultipleObjects(). Устанавливает напряжение на шнеллер (и ваш мозг), но устройства, как правило, все в порядке. В результате вы немного измените свой дизайн на высоком уровне; он становится более аккуратным !. Основной цикл, который проверяет все то, что вы можете сделать, медленно и расточительно на CPU, но гарантирует производительность. (Гарантировано, чтобы быть медленным)

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

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

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

22
  • Как 1800 INFORMATION сказал, избегайте опроса; подписаться на события и ждать их, чтобы произойти
  • содержимое окна обновления только при необходимости - пусть система решает, когда его перерисовать
  • При обновлении содержимого окна, убедитесь, код воссоздает все недействительный регион как можно
  • с быстрым кодом процессор переходит обратно в режим глубокого сна быстрее и есть лучший шанс, что такой код остается в кэше L1
  • Работают на небольших данных в одно время, так что данные остаются в тайниках, а
  • Убедитесь, что приложение Безразлично» t делать ненужные действия, когда в фоновом режиме
  • Сделать свое программное обеспечение не только энергоэффективным, но и власть в курсе - графика обновления менее часто, когда на батарею, отключить анимацию, менее жесткий диск обмолота

И читать некоторые другие guidelines. ;)

Недавно в блогах Intel Software Blogs появилась серия сообщений под названием "Optimizing Software Applications for Power". Может быть полезно для разработчиков x86.

5

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

Например, только переключатель Bluetooth, когда вам это нужно, аналогично возможности телефона, включите яркость экрана вниз, когда он не нужен, громкость вниз и т.д.

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

+0

Я второй. Если вы используете встроенный микроконтроллер, такой как PIC, отключите периферийные устройства, которые вы активно не используете, например, аналого-цифровые преобразователи или последовательный порт. – MrZebra 2008-09-30 13:03:02

1

Посмотрите, что генерирует ваш компилятор, особенно для горячих областей кода.

1

Если у вас есть прерывистые операции с низким приоритетом, не используйте специальные таймеры, чтобы проснуться, чтобы иметь дело с ними, но иметь дело с обработкой других событий.

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

1

Проще говоря, сделайте как можно меньше.

0

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

Кнута книга может дать вам все варианты конкретных алгоритмов, которые необходимо сохранить память и процессор, или идти с пониженной точностью свести к минимуму ошибки округления

также провел некоторое время на проверку всех встроенных API устройства - для Например, большинство телефонов Symbian могут выполнять кодирование звука через специализированное оборудование

1

Ну, в той степени, в которой ваш код может полностью исполняться в кеше процессора, у вас будет меньше активности шины и сэкономить электроэнергию. В той степени, в которой ваша программа достаточно мала, чтобы полностью содержать данные кода + в кеше, вы получаете эту выгоду «бесплатно». OTOH, если ваша программа слишком велика, и вы можете разделить свои программы на модули, которые более или менее независимы друг от друга, вы можете получить некоторую экономию энергии, разделив ее на отдельные программы. (Я полагаю, что также возможно создать инструментальную цепочку, которая выдает связанные пакеты кода и данных в куски размером с кеш ...)

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

Transmeta была идея позволяя машине сделать некоторую оптимизацию инструкции на лету, чтобы сохранить власть ... Но это, похоже, не поможет достаточно ... And look where that got them.

3

Чтобы избежать опроса является хорошим предложение.

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

1

Установите неиспользованную память или вспышку в 0xFF не 0x00. Это, безусловно, верно для вспышки и eeprom, не уверен в s или d ram. Для proms есть инверсия, поэтому 0 сохраняется как 1 и потребляет больше энергии, 1 хранится как ноль и занимает меньше. Вот почему вы читаете 0xFF после стирания блока.

+0

Это похоже на микрооптимизацию микрооптимизации – Earlz 2009-12-10 20:49:34

0

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

0

В Linux установите powertop, чтобы узнать, как часто часть программного обеспечения пробуждает процессор. И следуйте различным советам, на которые ссылается сайт powertop, некоторые из которых, вероятно, применимы и к не-Linux.

http://www.lesswatts.org/projects/powertop/

0

Выберите эффективные алгоритмы, которые быстро и имеют небольшие основные блоки и минимальный доступ к памяти.

Поймите размер кеша и функциональные блоки вашего процессора.

Не получить доступ к памяти. Не используйте объекты или сборку мусора или любые другие конструкторы высокого уровня, если они расширяют ваш рабочий код или набор данных вне доступного кеша. Если вы знаете размер кеша и ассоциативность, выложите весь набор рабочих данных, который вам понадобится в режиме с низким энергопотреблением, и вставьте его в dcache (забудьте некоторые «правильные» методы кодирования, которые рассеивают данные вокруг в отдельных объектах или данных структуры, если это приводит к сбою кеша). То же самое со всеми подпрограммами.Поместите ваш рабочий код в один модуль, если необходимо, чтобы перечеркнуть его все в icache. Если процессор имеет несколько уровней кеша, попробуйте установить минимальный уровень кэша инструкций или данных. Не используйте блок с плавающей запятой или любые другие инструкции, которые могут активировать любые другие необязательные функциональные блоки, если вы не можете сделать хороший случай, что использование этих инструкций значительно сокращает время, в течение которого CPU выходит из спящего режима.

т.д.

0

Скорее своевременно это, статья о Hackaday сегодня об измерении потребляемой мощности различных команд: Hackaday: the-effect-of-code-on-power-consumption

Помимо этого:
- Прерывания ваших друзья
- опрос/Wait () - не ваши друзья
- Сделайте как можно меньше
- сделайте ваш код как можно малым/эффективным
- Отключите как можно больше модулей, штырьков и периферийных устройств в микро- .
. Пробег как можно медленнее. .
. Если у микрофона установлены настройки для частоты вращения шпинделя, скорости нарастания и т. Д., Проверьте их &, настройте их по умолчанию часто полная мощность/максимальная скорость.
- вернувшись к статье выше, вернитесь и измерьте мощность & посмотрите, можете ли вы ее сбросить, изменив вещи.

0

Не опрашивать, сон

Избегайте использование прожорливой области чипа, когда это возможно. Например, множители являются голодными, если вы можете сдвинуть и добавить, вы можете сэкономить несколько Джоулей (если вы не так много смещаетесь и добавляете, что на самом деле множитель выигрывает!)

Если вы действительно серьезно , я получаю отладочный отладчик, который может соотнести использование мощности с исходным кодом. Like this

Смежные вопросы