2008-09-15 12 views
42

En un dispositivo de sistema embebido portátil/portátil típico La duración de la batería es una preocupación importante en el diseño de H/W, S/W y las características que puede admitir el dispositivo. Desde la perspectiva de programación de software, uno conoce el código optimizado MIPS, memoria (datos y programas). Conozco el modo de suspensión profunda H/W, el modo de espera que se utilizan para sincronizar el hardware en ciclos inferiores o la vuelta del reloj por completo a algunos circuitos no utilizados para ahorrar energía, pero estoy buscando algunas ideas desde ese punto de view:Codificación de software eficiente de energía

Donde mi código se está ejecutando y necesita seguir ejecutándose, dado esto, ¿cómo puedo escribir el código "potencia" de manera eficiente para consumir vatios mínimos?

Existen construcciones de programación especiales, estructuras de datos, estructuras de control que debería tener en cuenta para lograr el mínimo consumo de energía para una funcionalidad determinada.

¿Hay consideraciones s/w de alto nivel de diseño que se deben tener en cuenta en el momento del diseño de la estructura del código o durante el diseño de bajo nivel para hacer el código lo más eficiente posible (menor consumo de energía)?

+0

acordado, no sirve de nada para mí, pero es una muy buena pregunta, sin embargo, ¿por qué preocuparse :) – Teifion

+0

:-) Por lo que veo la mayoría de las aplicaciones en dispositivos de mano no se presta atención a la vida de la batería más :-(Por suerte, operativo sistemas todavía lo hacen – itj

Respuesta

5

No sondee. Use eventos y otras primitivas del sistema operativo para esperar ocurrencias notificables. El sondeo asegura que la CPU permanecerá activa y usará más duración de la batería.

1

Considere usar las interfaces de red lo menos que pueda. Es posible que desee recopilar información y enviarla en ráfagas en lugar de enviarla constantemente.

9

Zeroith, utilice una máquina totalmente estática que pueda detenerse cuando está inactiva. No puedes vencer a cero Hz.

Primero, cambie a un programador de sistema operativo sin marca. Despertarse cada milisegundo o así desperdicia poder. Si no puede, considere ralentizar la interrupción del planificador en su lugar.

En segundo lugar, asegúrese de que su hilo inactivo es un ahorro de energía, espere a la siguiente instrucción de interrupción. Puede hacer esto en el tipo de "sitio de usuario" poco regulado que tienen la mayoría de los dispositivos pequeños.

En tercer lugar, si tiene que sondear o realizar actividades de confianza del usuario como actualizar la IU, dormir, hágalo y vuelva a dormir.

No confíe en los marcos de la GUI que no ha revisado para el tipo de código "dormir y girar". Especialmente el temporizador de eventos que puede estar tentado de usar para # 2.

Bloquea un hilo en lectura en lugar de sondear con select()/epoll()/WaitForMultipleObjects(). Pone énfasis en el scheuler de hilo (y su cerebro) pero los dispositivos generalmente funcionan bien. Esto termina cambiando un poco su diseño de alto nivel; se pone más ordenado !. Un bucle principal que sondea todas las cosas que puede hacer termina lento y desperdicia en la CPU, pero garantiza el rendimiento. (Garantizado para ser lento)

Los resultados de la caché, lazily crear cosas. Los usuarios esperan que el dispositivo sea lento, así que no los decepcione. Menos correr es mejor. Corre tan poco como puedas. Se pueden eliminar hilos separados cuando deja de necesitarlos.

Trate de obtener más memoria de la que necesita, luego puede insertar en más de una tabla hash y guardar la búsqueda. Esta es una compensación directa si la memoria es DRAM.

Mire en un sistema en tiempo real de lo que cree que podría necesitar. Ahorra tiempo (sic) más tarde. También soportan mejor el enhebrado.

22
  • Me gusta 1800 INFORMATION dicho, avoid polling; suscribirse a eventos y esperar a que sucedan
  • actualización de contenido de la ventana sólo cuando sea necesario - dejar que el sistema decida cuándo vuelve a dibujar
  • Al actualizar el contenido de la ventana, asegúrese de que su código recrea tan poco de la región no válido como sea posible
  • con código de forma rápida la CPU vuelve al modo de sueño profundo más rápido y hay más posibilidades de que tal código permanece en la caché L1
  • operar sobre los datos pequeños a la vez lo que los datos se queda en las memorias caché, así
  • asegurarse de que su aplicación doesn' t hacer cualquier acción innecesaria cuando en el fondo
  • que su software no sólo eficiente de la energía, sino también el poder consciente - de actualización de gráficos con menos frecuencia de batería encendida, desactivar animaciones, menos disco duro golear

y leer algunos otros guidelines. ;)

Recientemente una serie de publicaciones llamado "Optimizing Software Applications for Power", comenzó a aparecer en Intel Software Blogs. Puede ser de alguna utilidad para desarrolladores x86.

5

Desde mi trabajo con teléfonos inteligentes, la mejor manera que he encontrado de preservar la duración de la batería es asegurar que todo lo que no necesita para que su programa funcione en ese punto específico está deshabilitado.

Por ejemplo, sólo activar Bluetooth cuando lo necesite, de manera similar las capacidades de teléfono, gire el brillo de la pantalla hacia abajo cuando no es necesario, baje el volumen, etc.

La energía utilizada por estas funciones generalmente superará con creces la potencia utilizada por su código.

+0

En segundo lugar. Si está utilizando un microcontrolador integrado como un PIC, desactive los periféricos que no está utilizando activamente, como los convertidores A/D o el puerto serie. – MrZebra

1

Mire lo que genera el compilador, especialmente para las áreas con código de acceso.

1

Si tiene operaciones intermitentes de baja prioridad, no use temporizadores específicos para despertar y tratar con ellos, pero tenga en cuenta el procesamiento de otros eventos.

Usa la lógica para evitar escenarios estúpidos en los que tu aplicación podría irse a dormir durante 10 ms y luego tener que volver a activarse para el siguiente evento. Para el tipo de plataforma mencionada, no debería importar si ambos eventos se procesan al mismo tiempo. Tener su propio temporizador & mecanismo de devolución de llamada podría ser apropiado para este tipo de toma de decisiones. La compensación es en complejidad y mantenimiento del código frente a los probables ahorros de energía.

1

Simplemente ponga, haga tan poco como sea posible.

0

también es algo que no es trivial para hacer es reducir la precisión de las operaciones matemáticas, ir para el conjunto de datos más pequeño disponible y si está disponible para su paquete de entorno de desarrollo de datos y operaciones agregadas.

libros de Knuth podría darle toda la variante de algoritmos específicos que necesita para ahorrar memoria o CPU, o ir con precisión reducida minimizando los errores de redondeo

también, pasado algún tiempo la comprobación de toda la API dispositivo integrado - para Por ejemplo, la mayoría de los teléfonos symbian pueden hacer codificación de audio a través de un hardware especializado

1

Bueno, en la medida en que su código se pueda ejecutar completamente en la caché del procesador, tendrá menos actividad de bus y ahorrará energía. En la medida en que su programa sea lo suficientemente pequeño como para que quepa el código + datos por completo en la caché, obtendrá ese beneficio "gratis". OTOH, si su programa es demasiado grande y puede dividir sus programas en módulos que son más o menos independientes del otro, puede ahorrar algo de energía al dividirlo en programas separados. (Supongo que también es posible crear una cadena de herramientas que amplíe paquetes relacionados de código y datos en trozos del tamaño de la caché ...)

Supongo que, teóricamente, puede ahorrar una cierta cantidad de trabajo innecesario reduciendo el número de desreferenciación de punteros y refactorizando sus saltos para que los saltos más probables se tomen primero, pero no es realista hacerlo como programador.

Transmeta tuvo la idea de dejar que la máquina haga alguna optimización instrucción sobre la marcha para ahorrar energía ... Pero eso no parece ayudar lo suficiente ... And look where that got them.

3

Para evitar el sondeo es un buen sugerencia.

El consumo de energía de un microprocesador es más o menos proporcional a su frecuencia de reloj y al cuadrado de su voltaje de alimentación. Si tienes la posibilidad de ajustar estos desde el software, eso podría ahorrar algo de energía. Además, apagar las partes del procesador que no necesita (por ejemplo, la unidad de punto flotante) puede ayudar, pero esto depende mucho de su plataforma. En cualquier caso, necesita una forma de medir el consumo de energía real de su procesador, para que pueda descubrir qué funciona y qué no. Al igual que las optimizaciones de velocidad, las optimizaciones de potencia deben perfilarse cuidadosamente.

1

Configure la memoria o el flash sin usar en 0xFF no en 0x00. Esto es cierto para flash y eeprom, no estoy seguro acerca de s o d ram. Para los proms hay una inversión, por lo que un 0 se almacena como un 1 y consume más energía, un 1 se almacena como un cero y toma menos. Es por eso que lees 0xFFs después de borrar un bloque.

+0

Parece que las micro optimizaciones de micro optimizaciones – Earlz

0

Haga su trabajo lo más rápido posible, y luego vaya a un estado inactivo esperando que ocurran interrupciones (o eventos). Intente hacer que el código se quede sin caché con el mínimo tráfico de memoria externo posible.

0

En Linux, instale powertop para ver con qué frecuencia el software despierta la CPU. Y siga los diversos consejos a los que se vincula el sitio powertop, algunos de los cuales probablemente también sean aplicables a sistemas que no sean Linux.

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

+0

¿Sabes qué pasó con la [anunciada versión 2.0 de PowerTop] (http://lwn.net/Articles/421733/)? El enlace ya no está disponible. – JJD

+1

respuesta muy tardía que probablemente se resuelva fácilmente con google, pero v2.0 es lanzado. https://01.org/powertop/ –

0

Elija algoritmos eficientes que son rápidos y tienen pequeños bloques básicos y accesos a la memoria mínima.

Comprenda el tamaño de caché y las unidades funcionales de su procesador.

No acceda a la memoria. No use objetos o recolección de basura u otras construcciones de alto nivel si expanden su código de trabajo o conjunto de datos fuera de la caché disponible. Si conoces el tamaño de caché y la asociatividad, diseña todo el conjunto de datos de trabajo que necesitarás en el modo de bajo consumo y colócalos en el dcache (olvida algunas de las prácticas de codificación "adecuadas" que dispersan los datos en objetos o datos separados) estructuras si eso causa basura en la memoria caché). Lo mismo con todas las subrutinas.Ponga su código de trabajo establecido todo en un módulo si es necesario para rayarlo todo en el icache. Si el procesador tiene múltiples niveles de caché, trate de caber en el nivel más bajo de instrucción o caché de datos posible. No utilice la unidad de coma flotante ni ninguna otra instrucción que pueda encender otras unidades funcionales opcionales a menos que pueda argumentar que el uso de estas instrucciones acorta significativamente el tiempo que la CPU está fuera del modo de suspensión.

etc.

0

En lugar oportuno esto, artículo sobre Hackaday hoy acerca de la medición del consumo de energía de los distintos comandos: Hackaday: the-effect-of-code-on-power-consumption

Aparte de eso:
- Las interrupciones son sus amigos
- Sondeo/espera () no son sus amigos
- Haga lo menos posible
- haga que su código sea lo más pequeño/eficiente posible
- Apague tantos módulos, pines, periféricos como sea posible en el micro
- Ejecutar tan lento como sea posible
- Si el micro tiene configuraciones para la fuerza de arrastre del pin, velocidad de giro, etc. verifíquelos & configúrelos, los valores predeterminados son a menudo potencia máxima/velocidad máxima.
- volviendo al artículo anterior, regrese y mida la potencia & vea si puede soltarlo alterando cosas.

0

No Poll, dormir

Evitar el uso de las áreas que consumen mucha energía del chip cuando sea posible. Por ejemplo, los multiplicadores están hambrientos de poder, si puede cambiar y agregar puede ahorrar algunos Joules (¡siempre y cuando no haga tanto cambio y agregue que en realidad el multiplicador es un triunfo!)

Si realmente habla en serio , Obtengo un depurador con reconocimiento de energía, que puede correlacionar el uso de energía con su código fuente. Like this

Cuestiones relacionadas