# Gestion de l'énergie des systèmes embarqués

La gestion de l’énergie dans les systèmes embarqués est fondamentale pour leur bon fonctionnement. Le nombre de ces systèmes est en augmentation constante et leurs domaines d’utilisation sont de plus en plus variés. Les contraintes sont très différentes selon que la conception porte sur un capteur environnemental, un téléphone portable ou une sonde corporelle. L’objectif principal peut être une grande longévité, une taille réduite ou encore un fonctionnement sans batterie.
En plus des sources d’énergies utilisables, l'article aborde les méthodes permettant d’analyser la consommation énergétique d'un système et donc de valider que telle méthode est plus efficace que telle autre, dans l’atteinte d'objectifs précis. Deux domaines sont pris en exemple pour pointer le fait que les objectifs peuvent grandement différer en fonction de l'utilisation qui est faite du système embarqué : les téléphones portables et les capteurs corporels.
L'optimisation de la consommation peut être réalisée selon différentes méthodes, dont certaines peuvent même être combinées. L’amélioration peut par exemple se faire au niveau matériel, en pilotant sélectivement certains composants ou périphériques. Des composants particuliers peuvent également être sélectionnés dès la conception, en fonction des objectifs recherchés. L’amélioration peut également être de type logicielle (système d’exploitation, type du code, programmation de l’applicatif…). Beaucoup d’éléments participent à la consommation énergétique, dont certains ne sont pas évidents de prime abord. En fonction de la manière de coder, par exemple, un système peut consommer plus ou moins d’énergie.

## Sources d'énergies
### Systèmes alimentés par batteries

Les batteries électrochimiques rechargeables type lithium-ion sont utilisées comme source d'énergie dans une grande majorité de systèmes électroniques portables, comme les smartphones, ordinateurs portables ou les tablettes$^,$. Elles influent de manière significative sur le temps de fonctionnement et les performances globales des appareils$^,$.
Selon les prévisions, à l'horizon 2020, 50 milliards d'objets intelligents seront connectés à l'Internet des objets (plus de six fois la population mondiale projetée à l'époque)$^,$. La plupart de ces appareils seront alimentés par batterie pour des raisons de coût, de commodité, ou de la nécessité d'un fonctionnement autonome. Le remplacement des batteries à grande échelle étant souvent trop couteux voire irréalisable, les appareils IdO devront avoir une longue durée de vie opérationnelle : de quelques jours à plusieurs années en fonction de leur domaine d'utilisation.
L'énergie n'est que l'une des nombreuses ressources nécessaires dans l'informatique des systèmes embarqués. Elle reste cependant la seule ressource périssable, qui, une fois consommée, ne peut être réapprovisionnée que par des actions externes, comme la recharge ou le remplacement de la batterie.
La durée de vie d'un système alimenté par batterie est déterminée par la capacité de la source d'énergie (c'est-à-dire la batterie) et l'énergie qui y est puisée par le reste du système. La quantité d'énergie fournie variant de manière significative, en fonction de la façon dont elle est utilisée.
La conception de composants à faible puissance (low-power design, ultra-low-power design)$^,$ permet de réduire consommation énergétique et améliore la durée de vie de la batterie. Cependant, pour vraiment maximiser la durée de vie d'une batterie, une analyse de la source d'énergie et du système qui la consomme est nécessaire. De nombreux modèles ont été développés et permettent de saisir de manière suffisamment détaillée le comportement des batteries et aident les concepteurs de systèmes à concevoir des algorithmes et des stratégies de gestion optimales.
Les développements continus dans le domaine de la gestion de l'alimentation (DVFS, conceptions hybrides analogiques-numériques...) contribuent eux aussi à cette amélioration$^,$.

### Systèmes à récupération d'énergie

Le principe de la récupération d'énergie (energy harvesting ou energy scavenging) remonte à l'époque de la roue d'hydraulique et du moulin à vent$^,$. D'autres approches crédibles, récupérant l'énergie de la chaleur ou des vibrations, existent depuis des décennies. Néanmoins, le domaine a rencontré un regain d’intérêt depuis l'émergence des systèmes embarqués comme les téléphones portables et les réseaux de capteurs sans fils.
Les systèmes à récupération d'énergie sont des solutions qui tirent toute ou une partie de leur énergie de leur environnement. Le point important de cette énergie environnante est qu'elle a beau être potentiellement infinie, il peut y avoir une limite quant à son taux d'utilisation.
Les technologies de captage d'énergie environnementale sont multiples : capteurs solaires$^,$$^,$$^,$, éoliens, piézoélectriques ou tout autre transducteur capable de tirer de l'énergie de son environnement$^,$. L'énergie mécanique est probablement la plus répandue et se trouve dans la force du vent, le mouvement des membres, l'énergie potentielle élastique, la vibration ambiante, la rotation d'une roue de voiture, et bien d'autres. Le différentiel thermique peut également être utilisé pour générer de l'électricité. La source la plus étudiée et technologiquement mature est sans doute la lumière.
La production d'énergie varie avec le temps, en fonction de conditions environnementales qui échappent généralement au contrôle du concepteur. Les systèmes embarqués utilisant un type particulier de récolte doivent donc être intégrés à des structures (immeuble, maison, serre...) dans lesquelles ce type d'énergie est abondant. Dans certaines situations, si l'appareil est enfoui sous terre ou à l'intérieur des murs, la collecte d'énergie est difficile, mais le transfert d'énergie sans fil peut être effectué. Par exemple, la charge par induction peut être utilisée pour recevoir de l'énergie à partir d'une émission électromagnétique$^,$
Dans le cas des systèmes embarqués que l'on peut porter (smartwatch, vêtements connectés) ou implantable (médical), la source d'énergie peut provenir de l'utilisateur lui-même, parfois en complément d'une énergie environnementale disponible. Elle peut par exemple être générée à partir des mouvements ou bien de la chaleur corporelle$^,$.
En utilisant l'énergie récoltée de manière optimale, le système peut fonctionner dans un mode de neutralité énergétique, consommant uniquement l'énergie qu'il parvient à récolter. Le système peut alors continuer à fonctionner de façon pérenne et n'est limitée que par la longévité du matériel. Un système est dit à fonctionnement neutre lorsque son niveau de performance souhaité peut être maintenu indéfiniment$^,$. Cependant, même si la consommation énergétique passait en dessous du seuil de neutralité, la longévité du système n'en serait pas prolongée pour autant.

## Méthodes d'analyse énergétique d'un système embarqué

À la différence d'un système d'exploitation généraliste, un système embarqué est conçu pour réaliser une tâche particulière et définie de manière précise. Ainsi, le système embarqué peut être optimisé en fonction de ses contraintes : moindre coût, meilleure performance ou encore consommation énergétique. La consommation énergétique peut être divisée en trois catégories : la consommation liée au captage d'informations, celle liée au traitement des données et enfin celle liée à leur transmission.
Concevoir un système embarqué avec une consommation énergétique adaptable nécessite de pouvoir mesurer et ensuite prévoir cette consommation. Le but étant de maximiser les performances du système sans dépasser les limites énergétiques mises à sa disposition. Cette contrainte se nomme aussi le mode neutre en énergie (Energy Neutral Mode)$^,$.
Mesurer la faible consommation énergétique de systèmes embarqués est une tâche compliquée. Selon Nadir Cherifi et al., les méthodes d’estimation et de mesure peuvent être regroupées en trois catégories : les mesures physiques, les mesures logicielles et les simulations. La conception de systèmes embarqués nécessite des outils dans ces trois catégories pour pouvoir prévoir la consommation avant le prototypage, puis valider ensuite les résultats sur un nombre idéalement limité de prototypes ou d’architectures.
En fonction de l’équipement cible, les besoins et les contraintes sont cependant différents. Un téléphone portable a une contrainte de poids et de taille. Un capteur environnemental a des contraintes d’autonomie, de même qu’un capteur corporel mais pas forcément pour les mêmes raisons.

### Contraintes liées aux Smartphones

La consommation énergétique des smartphones et l'utilisation optimale de l'énergie sont des enjeux majeurs dans la conception de ce type de systèmes embarqués. Ils nécessitent une autonomie énergétique, assurée par l'utilisation de batteries lithium-ion. Cependant, en plus de la performance, la portabilité impose des limitations en termes de taille et de poids qui finalement viendront limiter la taille de la batterie et donc la quantité d'énergie disponible. Les améliorations visant à augmenter la capacité des batteries ne suivant pas le rythme imposé par les améliorations en micro-électronique, différents procédés destinés à augmenter la durée de vie de la batterie sont utilisés, se basant sur des modèles reliant le comportement de la batterie aux conditions de décharges liées aux consommateur d'énergie (CPU par exemple).
L'analyse énergétique via la modélisation est un prérequis essentiel pour comprendre l'impact des applications ou des composants sur un système. En fonction des estimations de puissance générées par un power-model, un plan d'optimisation énergétique peut être développé pour faciliter l'utilisation efficace de l'énergie dans les appareils mobiles.

### Contraintes liées au Médical et à la Santé

Les capteurs sans fils portables, interconnectés au sein d'un réseau BAN (Body Area Network) sont largement utilisés dans le domaine médical, collectant diverses caractéristiques physiologiques permettant de suivre en temps réel l'état de santé du patient. L'analyse énergétique de ce type de système embarqué est primordiale car elle peut affecter les fonctionnalités de l'ensemble du système et donc avoir un impact direct sur la vie du patient.
La durée de vie de ces dispositifs micro-électroniques, spécialement ceux étant implantés dans le corps est cruciale. Le remplacement ou la recharge de ces dispositifs embarqués induit un coût financier et une gêne supplémentaire non souhaitable pour le patient.
De plus, ce type de dispositifs peut également entrainer une hausse de la température corporelle ou des tissus environnants. La consommation d'énergie doit donc être réduite au minimum afin de limiter cette hausse.

### Méthodes d'analyse de la performance logicielle

Démontré en premier lieu par Tiwari et al., un même logiciel exécuté sur différents modèles de processeurs aboutira à une consommation globale différente sur chaque système. En mesurant le courant utilisé par un processeur lors de l’exécution de chaque tâche ou séquence d’instructions, il est ainsi possible de modéliser et d’évaluer le coût énergétique d’un programme.
Si on regarde le fonctionnement d’un système embarqué, la phase d’émission des informations utilise une quantité d’énergie non négligeable qui doit être prise en compte dans le fonctionnement global du programme. L’analyse de la performance logicielle et les mesures en fonctionnement réel peuvent ainsi aboutir à une décision sur le protocole à utiliser (IPv4, IPv6 ou dérivés$^,$), voire à déporter une partie du traitement des informations sur des systèmes disposant de plus d’énergie.
Des algorithmes permettent également d’analyser et de prédire de manière précise la consommation d’un système embarqué lors de l’exécution de son code$^,$.

### Méthode d'analyse de la consommation énergétique liée à l'OS

Les systèmes d’exploitation des solutions embarquées sont des éléments critiques d’environnements complexes. Ils sont porteurs de services vitaux pour le système mais ont un fort impact sur l’efficacité énergétique de la solution.
Il est important de pouvoir faire la distinction entre la consommation implicite et la consommation explicite. Cette dernière est celle liée au fonctionnement direct du système d’exploitation (exécution de ses fonctions internes), Il est possible d’analyser le cheminement des exécutions et de les classer en fonction de leur rapport efficacité/coût énergétique. La consommation implicite étant celle qui est induite par les interruptions et pauses liées aux éléments externes (planificateurs de tâches, replanification, demande d’interruption sur cause externe…).
Sur les systèmes temps réel, en fonction de l’application utilisée, le système d’exploitation peut générer une plus ou moins grande consommation d’énergie. Des travaux ont démontré qu’une adaptation de l’application peut induire une réduction de la sollicitation de l’OS et donc de la consommation.
Des outils d’analyse de consommation liée à l’OS peuvent également permettre le développement et l’amélioration de systèmes d’exploitation à énergie neutre.

### Méthodes d'analyse de la configuration du cache

La configuration du cache a un lien direct avec les performances et la consommation énergétique du système. Plus la taille de la mémoire cache augmente, moins il y a de défauts de cache (cache miss), ce qui augmente les performances du système et diminue la consommation énergétique du logiciel et de la mémoire. Cependant, l’énergie dissipée par les cache augmente en raison de sa taille.
Il est donc primordial d'avoir à disposition des modèles permettant de mesurer l'impact énergétique du cache dans un système embarqué, afin de pouvoir ensuite en minimiser les effets$^,$$^,$.
La configuration du bus et du cache sont interdépendantes et doivent donc être analysées simultanément afin d'évaluer les impacts de l'ensemble des configuration cache/bus pour une application donnée.

### Méthodes d'analyse du comportement des batteries

Le comportement réel d’une batterie lors de sa charge ou de sa décharge suit une courbe non linéaire, pouvant varier au cours du temps. Développer des frameworks plus proches de la réalité permet de simuler l’état des batteries de manière plus dynamique et de concevoir des systèmes plus robustes et fiables. De la même manière, avoir des modèles plus précis permet de concevoir ou d’optimiser des systèmes répondant à des contraintes telles que le poids ou le volume des batteries.
De nombreux modèles mathématiques ont été développés, rendant possible une simulation assez détaillée du comportement des batteries : des modèles physiques permettant de décrire les interactions ayant lieu à l’intérieur même des batteries ; des modèles empiriques, mettant en œuvre des équations au cours d’expérimentations scientifiques ; des modèles abstraits, représentant la batterie comme un système numérique, un circuit électrique, un élément d’études statistiques, ou encore des modèles mixtes, offrant des représentations simplifiées des processus physiques à l’œuvre dans les batteries.
Dans chaque catégorie, les modèles peuvent être évalués selon quatre critères de base : La précision de la prévision, la complexité de la simulation, le niveau de paramétrage nécessaire et l’utilité du résultat final.

## Optimisation au niveau matériel
### Topologie des circuits électroniques

La manière la plus efficace d'améliorer la consommation énergétique d'un système embarqué est de réduire la consommation énergétique de ses composants électroniques (microprocesseurs, mémoire, interface réseau...). Par exemple, afin de limiter leurs consommations, la plupart des microprocesseurs disposent maintenant de modes basse consommation (ou sleep modes)$^,$.
La miniaturisation des capteurs sans fil a accéléré la miniaturisation des composants (processeurs, capteurs, batteries). La conception de ces circuits à faible puissance (low energy design) permet l'utilisation de sources d'énergies plus petites et moins onéreuses tout en augmentant la durée de vie du dispositif afin de réduire les coûts lié au remplacement ou à la recharge de la batterie.
Pour concevoir des capteurs très basse consommation, il est essentiel de savoir décomposer chaque tâche de manière à minimiser autant que possible le temps de calcul nécessaire. Pour ce faire, le choix de la topologie du circuit et des éléments qui le composent est primordial. La conception de capteurs toujours plus petits, performants et peu coûteux nécessite un effort constant sur chaque décomposition de l’architecture.

### Dynamic Voltage and Frequency Scalling (DVFS)

L’énergie consommée par un processeur est approximativement proportionnelle à sa fréquence de cadencement et au carré de sa tension. Le DVFS (pour Dynamic Voltage and Frequency Scaling) consiste à adapter dynamiquement les paramètres de fréquence et de tension d’un processeur en fonction des ressources requises à un instant t. Ainsi, lorsque ces ressources ne sont pas utilisées, cette adaptation permet d’optimiser la consommation énergétique.
Entrer du texte sur un clavier ne requiert pas nécessairement toute la puissance du processeur. De même, il peut exister des périodes d’inactivité logicielle. Lorsque la puissance maximale d’un processeur n’est pas requise, la consommation moyenne peut être fortement diminuée grâce au DVFS. L’économie d’énergie permet donc d’augmenter le potentiel de calcul du processeur.
Les conditions pour l’implémentation du DVFS sont multiples. L’OS doit d’abord être capable de piloter la fréquence du processeur et ce même processeur doit pouvoir fonctionner sous différentes tensions. Ensuite, il doit exister une régulation continue entre tension et fréquence recherchée. Cette régulation peut être accompagnée de différents algorithmes dont la fonction est de prédire la charge CPU dans un avenir proche. En fonction de la prédiction, une action sur la tension d’alimentation du processeur peut alors être exécutée.
Cependant, sur des systèmes temps réel, le DVFS peut générer des dysfonctionnements. Le changement de fréquence du processeur ralenti de fait le temps de calcul et peut engendrer le dépassement de certains compteurs critiques. Pour pouvoir utiliser un algorithme DVFS, les tâches du système doivent pouvoir être planifiées et aucune des tâches en cours ne doit dépasser le délai maximal de calcul autorisé. Les algorithmes DVFS ont donc du être adaptés pour pouvoir fonctionner sans perturbation notable sur les systèmes temps réel$^,$$^,$. Un autre dysfonctionnement possible a été identifié par Zhu Dakai et al. Il s’agit de l’existence d’un lien entre la méthode DVFS et le taux de fiabilité d’un système embarqué temps réel. Selon lui, réduire la consommation énergétique de systèmes critiques en influant sur la tension ou la fréquence peut avoir un impact négatif sur la fiabilité de ce système.

### Dynamic Power Management (DPM)

L’adaptation dynamique de l’énergie est la capacité d’un système à augmenter ou diminuer sa consommation en fonction de caractéristiques extérieures. Dans le cadre de capteurs corporels, par exemple, le système doit être capable de réduire sa consommation lorsque l’utilisateur n’a pas d’activité physique. De la même manière, en fonction de l’énergie disponible, le système doit également être capable d’adapter sa consommation, au besoin en décalant les tâches les plus énergivores sur des périodes plus propices, voire en basculant le système dans un état moins consommateur d’énergie tout en limitant l’impact sur les performances.
Les gains obtenus grâce à cette méthode sont divers et dépendent des buts recherchés. La durée de vie de la batterie peut par exemple être fortement augmentée sans impact sur les performances. En complément d’une adaptation de la consommation, il est possible d’utiliser des systèmes de récupération/génération d’énergie (soleil, mouvements ou encore chaleur corporelle)$^,$. La combinaison des deux permet de réduire la taille de la batterie et donc du système embarqué.

### Condensateurs et supercondensateurs

Avec le développement des capteurs et systèmes sans batterie, le stockage et la gestion de l’énergie en provenance de sources inconstantes sont devenues des questions primordiales$^,$. Afin de bénéficier de sources d’alimentations plus stables et donc gérable sur ces capteurs sans batterie, l’utilisation de condensateurs et supercondensateurs s’est répandue$^,$$^,$.
Par rapport aux batteries, les condensateurs présentent le gros avantage d’avoir une durée de vie bien supérieure, en termeq de nombre de cycles de rechargements$^,$. Bien que les travaux de Qianao Ju et al. aient aussi pointé des inconvénients sur les supercondensateurs, il propose un algorithme pour en diminuer les effets.
Ces composants sont utilisés de différentes manières. Une première méthode est l’utilisation d’un ou plusieurs supercondensateurs pour stocker une charge qui sera directement utilisée selon les besoins du système$^,$. Si besoin en utilisant des algorithmes de gestion d’énergie. Ensuite, d’autres condensateurs peuvent être utilisés pour alimenter individuellement des périphériques ou un système de régulation d’énergie.

## Optimisation au niveau mémoire
### Scratch-Pad Memory (SPM)

L’efficacité énergétique d’un système peut être augmentée en installant des éléments mémoires pilotés par logiciel à l’intérieur des microprocesseurs (on chip memory). Cette architecture est appelée Scratch Pad Memory (SPM). Une autre mémoire « on chip » existe, appelée mémoire cache. Cependant, comparée à la mémoire cache, la SPM utilise moins d’énergie pour accéder à l’information$^,$.
Les microprocesseurs utilisent les SPM via différentes techniques. L'un des principes étant d’analyser le code et de stocker l’information là où l’efficacité énergétique sera la meilleure$^,$. Des études actuellement menées sur le sujet proposent des méthodes combinant l’utilisation des SPM avec la mémoire cache$^,$$^,$.

### Phase Change Memory (PCM)

Une technologie en cours de développement est la mémoire à changement de phase (PCM ou Phase Change Memory). Cette technologie exploite le changement de propriété physique d’un alliage sous un effet Joule (chaleur) : Le matériau change de résistivité (facteur 3 à 4) entre un état dit « cristallin » et un autre dit « amorphe ». La PCM consomme en moyenne moins d’énergie et est plus rapide en lecture qu’une mémoire DRAM. Cependant, des limitations importantes existent : le matériau a une longévité moindre due à l’altération graduelle du matériau lorsqu’on le chauffe pour le changer d’état ; la consommation énergétique est ponctuellement plus importante qu’une DRAM classique en phase d’écriture ; enfin, le délai d’écriture est également plus important qu’avec les DRAM. Les mémoires non volatiles (NVM) dont font partie les PCM sont des technologies prometteuses pour la gestion de l’énergie dans les systèmes embarqués. La comparaison avec les mémoires volatiles sont à l’avantage des NVM, même si ces composants ont des inconvénients.
L’une des solutions à ces inconvénients est la limitation du nombre d’écritures. Avant d’appliquer un changement au bit mémoire, une vérification de son état est réalisée. Si l’état actuel est le même que celui à venir, le système ne modifie pas sa valeur$^,$.
En exploitant l’état transitoire entre le mode cristallin et le mode amorphe, il est également possible de stocker plusieurs valeurs sur un même élément « binaire », soit 3 ou 4 valeurs. Cependant, bien que la capacité soit augmentée, la longévité de la mémoire est réduite et il faut mettre en place d’autres mécanismes pour l'optimiser.
Une autre méthode consiste à répartir les écritures de manière uniforme sur la surface physique de la mémoire, limitant ainsi l’échauffement localisé du composant$^,$, qui est la cause de l'altération graduelle du matériau.

### Magnetic RAM (MRAM)

Le paragraphe ci-dessous ne cite que deux types de mémoires magnétiques, bien qu'il en existe d'autres. Il s'agit des deux types les plus aboutis pour une version commerciale dans les systèmes embarqués, les autres étant des domaines en développement.

#### Spin-Transfer Torque MRAM (STT MRAM)

Parmi les mémoires non-volatiles (NVM) prometteuses pour la gestion de l’énergie dans les systèmes embarqués se trouve la STT MRAM, pour Spin-Transfer Torque Magnetic RAM. Pour cette technologie, l’élément contenant l’information binaire est un matériau ferromagnétique réparti en deux couches polarisées, séparée par un isolant. La couche inférieure est polarisée de manière fixe, la supérieure est polarisée par injection de courant en fonction de la valeur binaire recherchée (polarité identique ou contraire à celle de la couche inférieure). La lecture de la valeur se fait en mesurant la résistivité entre les deux couches.
Les techniques actuelles permettent de construire une cellule STT-MRAM avec deux valeurs (SLC, un bit) ou quatre valeurs (MLC, deux bits)$^,$.
La STT-MRAM consomme peu en moyenne, est rapide en lecture et a une grande longévité. Mais la latence et la consommation en écriture est importante, par rapport à la classique SRAM. Une technique utilisant par exemple deux modes d’écritures différents permet de réduire la latence en écriture. La consommation énergétique lors de l’écriture diminue avec l’évolution des technologies, mais ce seuil se rapproche de celui utilisé pour la lecture des cellules (qui diminue peu). Ceci provoque des erreurs et des techniques doivent également être développées pour y remédier.
Autre méthode envisagée, qui recoupe également une technique d’un paragraphe précédent : l’utilisation de STT-MRAM comme support de mémoire SPM. L’accès à ce type de mémoire consommant moins d’énergie, une modification des logiciels de gestion de la SPM permettent de réaliser cette architecture, qui peut économiser plus de 50 % de l’énergie consommée par le système.
Une étude menée par Nowak et al. en 2016 a cependant montré des propriétés intéressantes entre tension électrique, durée d’écriture et taille du composant, leur ayant permis de réduire significativement la taille des cellules sans augmenter le taux d’erreur en écriture.

#### Memristor

Son existence fut prédite en 1971 mais ce composant n’a été implémenté qu’en 2008. Il n’a pas encore d’application commerciale en l’état actuel des recherches mais promet une formidable avancée dans le domaine des mémoires en ce qui concerne le degré d’intégration, la rapidité d’accès et la faible consommation$^,$$^,$.
Le Memristor ou mémoire résistive (RRAM) est une résistance variable dont la valeur peut être modifiée par l’application d’une tension$^,$ : L’état logique est déterminé par la valeur de la résistance au moment de la lecture. Les inconvénients de cette mémoire sont une consommation et une latence élevée en écriture. Des recherches sont menées sur ces éléments, apportant des solutions envisageables pour une commercialisation, notamment en réduisant la durée de rétention des informations et la tension d'écriture. Mais des phénomènes non maitrisés en limitent pour l’instant le développement.

## Optimisation au niveau OS
### Gestion des I/O

La gestion de la consommation peut passer par la gestion des périphériques qui sont de gros consommateurs d’I/O, et donc d’énergie. Les périphériques étant gérés via des processus, en analysant l’état de ces processus au cours d’intervalles de temps, il est possible d’en déduire l’utilisation ou non d’un périphérique particulier. Sur les systèmes temps réel, l’analyse peut se révéler plus délicate et un autre algorithme peut être utilisé, permettant une prévision plus réactive aux changements du système. Cependant, la méthode proposée par Cheng et al. économise peu ou pas d’énergie sur les systèmes déjà très chargés.

### Spécialisation des OS

Les systèmes d’exploitation des solutions embarquées deviennent de plus en plus critiques et doivent subir des adaptations afin de correspondre le plus précisément possible au besoin. Il existe des OS configurables de manière très variée, permettant une utilisation sur plusieurs architectures mais nécessitant des réglages précis. Cependant, le développement peut être orienté pour dédier l’OS à un fonctionnement spécifique, comme les systèmes à énergie neutre. Dans l’exemple cité, l’OS nivelle la criticité de chaque tâche en fonction des ressources qu’elle consomme et le temps de traitement prévu. Les ressources des tâches les moins critiques pouvant alors être ré-allouées en cas de besoin à des tâches affichées comme plus critiques.

### Algorithmes de planification

Les algorithmes diffèrent dans la manière d'établir leurs prédictions (nombre d'intervalles utilisés, poids éventuel, méthode mathématique appliquée) ainsi que dans la manière d'adapter ensuite la vitesse processeur. L’un des principes est de découper l’échelle du temps en intervalles, puis d’examiner les tâches qui ont pu être traitées durant chaque période. Selon le résultat de l’analyse, l’algorithme peut décider d’augmenter ou diminuer le nombre de tâches à traiter lors du prochain intervalle en agissant sur la vitesse du processeur. Pour agir sur la fréquence du processeur, l’algorithme charge ensuite l’OS de réaliser la modification$^,$.
La modification peut être une prédiction de l’état futur ou une adaptation prédéterminée. Cela correspond a une adaptation statique ou dynamique et des études ont comparé leurs effets sur des systèmes réels. Outre le type de l’adaptation, le choix de la longueur des intervalles peut avoir de grandes conséquences sur la consommation. Si l'intervalle est trop courte, la fréquence du processeur devra être élevée pour que les tâches soient traitées en totalité. Si elle est trop longue, le processeur peut devoir fonctionner sans traiter de données, d'où une perte de ressources.
Dans le cas des systèmes à récupération d'énergie, l'énergie électrique disponible change au fil du temps et est limitée par la taille de l'unité de stockage (batterie, condensateur) et du récolteur (panneau solaire par exemple). Des algorithmes de planification permettent au système de décider dynamiquement quand être actif ou passif, afin de fournir la meilleure qualité de service sans gaspiller l'énergie.

## Optimisation au niveau programmation
### Optimisation des instructions

Le choix des instructions dans le code peut avoir un impact significatif sur le coût énergétique. Une analyse des coûts énergétiques des instructions d'un processeur 486DX2 révèle que les instructions utilisant des paramètres mémoire ont un courant moyen très élevé par rapport aux instructions utilisant des paramètres de registre.
Ce type d'optimisation contribue à la conception de logiciels à faible consommation énergétique, mais leurs impacts sont étroitement liés à une architecture cible donnée. Les optimisations pour un type de processeur utilisées dans un code éco-énergétique peuvent ne pas convenir pour d'autres types de processeurs. Une analyse du niveau d'instruction doit donc être effectuée pour chaque type de processeur utilisé$^,$.

### Optimisation au niveau compilateur

Les appels de procédures sont couteux dans la plupart des architectures. La technique d'inlining des procédures peut aider à améliorer les performances et à économiser l'énergie logicielle en diminuant les surcharges (overhead) associés aux appels et aux retours. Un effet secondaire de l'inlining est l'augmentation de la taille du code. Cette augmentation nécessite en conséquence une taille mémoire plus importante, qui conduira à une plus grande dissipation d'énergie.
Les techniques d'optimisations de boucle :
* loop interchange est une technique de transformation de boucle linéaire (linear loop transformations) permettant de réduire de la puissance totale de la mémoire grâce à une meilleure utilisation du cache.
* loop unrolling permet d'augmenter le parallélisme des instructions en diminuant ou supprimant les instructions de contrôle$^,$$^,$.
* pipeline logiciel est une technique permettant d'optimiser les boucles d'un programme, de sorte que chaque itération dans la boucle soit formée à partir de séquences d'instructions choisies parmi différentes itérations du code original. Cette technique permet de diminuer le nombre d'initialisations en récupérant les instructions de différentes itérations. Par conséquent, la consommation totale d'énergie diminue.
* loop fission (loop distribution) divise une boucle (loop) contenant plusieurs instructions en plusieurs boucles contenant chacune une partie des instructions d'origines. Cette technique permet une allocation plus fine des banques mémoires et permet de générer des économies d'énergie en désactivant les banques de mémoires inutilisées$^,$.
* loop fusion combines deux boucles en une seule, ce qui améliore la réutilisation des données, réduisant ainsi l'énergie consommée par la mémoire.

### Optimisation du code

Dans la plupart des systèmes embarqués, des portions significatives de code sont répétées. Si le logiciel n'est pas écrit efficacement, on peut s'attendre à ce qu'il nécessite un plus grand nombre de cycles, consomme plus de puissance et occupe plus de mémoire.
La restructuration du code d'un programme offre le meilleur équilibre entre efficacité énergétique et automatisation. Son impact sur la consommation d'énergie tend à être élevé puisque le travail est effectué avec une vision globale du programme. En outre, les techniques utilisées sont indépendantes de la plate-forme, ce qui les rend facilement portables à différentes architectures.
L'interleaving est un mécanisme qui peut réduire la consommation d'énergie dans les systèmes utilisant la mémoire partitionnée, en regroupant les éléments de données de multiples tableaux (array) consultés simultanément en un seul espace de données commun. Ainsi, seuls les modules mémoire contenant des parties des tableaux en cours d'accès ont besoin d'être actifs.
Dans des programmes multiprocessus concurrents, des facteurs tels que la communication interprocessus (IPC), la communication de données, les changements de contexte, l'intervention du système d'exploitation peuvent affecter de manière significative la consommation énergétique globale d'une application. Les optimisations proposées par Fei et al. permettent par exemple de réaliser des économies d'énergie allant jusqu'à 37,9 % (23,8 % en moyenne) par rapport aux optimisations traditionnelles des compilateurs.

## Optimisations au niveau application

La gestion de l'énergie au niveau de l'application est une source importante d'optimisation énergétique$^,$$^,$$^,$.
Les travaux menés par Flinn et al. ont souligné l'importance et la faisabilité de la gestion de l'énergie au niveau de l'application. Leur système surveille l'offre et la demande énergétique. Lorsque l'énergie est abondante, l'application favorise l'expérience utilisateur. À l'inverse, lorsque l'énergie vient à manquer, l'application bascule en mode économie d'énergie. L’économie d’énergie est en moyenne de 36 %. Si l’énergie est suffisante, leur système est cependant capable de s’adapter aux variations d’une autre ressource : la bande-passante. Le système détecte une baisse de débit via un indicateur calculé en interne (nommé "fidélité") puis modifie l’application pour optimiser l’expérience utilisateur.
La programmation éco-énergétique (energy-aware programming) est une voie prometteuse suscitant un intérêt croissant$^,$$^,$. Ces méthodes et techniques permettent de mettre en place des comportements d'application alternatifs en fonction du mode de fonctionnement énergétique.
Eon est un système de programmation éco-énergétique, permettant aux programmeurs de construire des programmes à partir de code écrit dans différents langages. Il permet de faire correspondre simplement des flux de contrôles par rapport à des états énergétiques du système. Eon n'exécute que les flux autorisés par le programmeur pour un état énergétique donné. Ceci permet d’adapter les fonctionnalités du système à chaque mode d’énergie disponible.
Green est un système permettant d'estimer le coût énergétique des boucles et fonctions des programmes. Il permet aux programmeurs de spécifier une perte de QoS maximale qui sera tolérée et fournit des garanties statistiques que l'application répondra à cette cible. Green génère une version d'étalonnage du programme qu'il exécute pour construire un modèle de QoS quantifiant l'impact de l'approximation. Ce modèle est permet ensuite de synthétiser une version approximative du programme qui répondra à une cible de QoS spécifiée par l'utilisateur. Les résultats expérimentaux démontrent que la version verte de ces applications fonctionnent nettement mieux et consomment moins d'énergie avec seulement une petite perte de QoS.
ENT est un autre langage de programmation, qui permet de mettre en place une gestion de l'énergie au niveau de l'application, de manière proactive et adaptative. La conception proactive permet aux programmeurs, d'appliquer leurs connaissances de l'application à la gestion de l'énergie, en caractérisant statiquement le comportement énergétique de différents parties du code dans différents modes de fonctionnement. La conception adaptative permet de retarder cette caractérisation jusqu'à l'exécution, ce qui permet de capturer dynamiquement le comportement du programme en fonction de son état, de ses paramètres de configurations, le niveau de la batterie ou la température CPU.
Ce mélange de typage statique ou dynamique permet de réguler, via des erreurs de compilation ou d'exécution, les interactions entre les programmes et éventuellement d'exposer ou éliminer des "bugs énergétiques" (par exemple, un fragment de programme spécifiquement défini pour un mode «batterie haute » mais accidentellement utilisé dans le mode de "Batterie faible").

## Impacts liés à l'utilisateur

Différentes études ou enquêtes ont été menées afin de comprendre les interactions entre les utilisateurs et les batteries de leurs ordinateurs portables ou leurs smartphone. Banerjee et al. constate par exemple que la plupart des recharges sont effectuées alors qu'une quantité d'énergie conséquente subsiste et que ces recharges sont la plupart du temps dictées par le contexte (lieu et heure) plutôt que par le niveau de charge restant.
Selon Rahmati et al., une indication de charge inexacte de la batterie d'un smartphone et un affichage insuffisant des informations, conduisent à une sous utilisation des réglages d'économie d'énergie, à une mauvaise exploitation de l'énergie de la batterie et à un mécontentement des utilisateurs.