Progettare sistemi embedded a batteria

Valutazione attuale: 4 / 5

Nell´attività di tutti i giorni ci si trova a utilizzare sistemi embedded alimentati a batteria verso i quali siamo piuttosto indifferenti. Ci si accorge del fatto che siano alimentati a batteria solo quando sia necessario ricaricarlia o sostituirla. Normalmente questa azione è anche accompagnata da un certo disappunto verso il dispositivo stesso. Progettare sistemi a batteria che possano durare giorni, come per esempio i cellulari, o addirittura anni, come gli orologi digitali e le calcolatrici, richiede accorgimenti progettuali e necessità di affrontare difficoltà tecniche a cui non siamo soliti pensare. In questa Brief Note affronteremo alcuni degli accorgimenti e problematiche tecniche che è necessario tenere a mente nella progettazione di un sistema, al fine di permettere una lunga durata della batteria.

L´esigenza di una lunga vita della batteria

A questa domanda molti risponderanno che avere una batteria che duri tanto, permetterebbe di non ricaricare il cellulare tanto frequentemente!
Effettivamente una delle esigenze che spinge molte società a investire nella ricerca di soluzioni innovative al fine di ridurre i consumi dei sistemi embedded e trovare soluzioni tecnologiche per nuove tipologie di batterie è proprio di natura commerciale. I numeri parlano chiaro, nella società moderna, praticamente tutti hanno un cellulare. La marca che può vantare prodotti che richiedano una ricarica ogni 5 giorni avrebbe un vantaggio commerciale nei confronti di prodotti che richiedono ricarica ogni 3 giorni.
Oltre a quest'aspetto dei grandi numeri ci sono molte altre applicazioni in cui avere la batteria che duri molto è vitale. Le applicazioni mediche sono probabilmente quelle più importanti. Si pensi per esempio ad un paziente con pacemaker che dovesse avere l´esigenza di dover cambiare le batterie di un sistema impiantato ogni mese! Andare sotto i ferri non è cosa da poco. Per fortuna la tecnologia è già a buon punto ed in realtà i pacemaker attualmente si cambiano circa ogni 10 anni.
Altre applicazioni importanti sono quelle in cui si abbia un sistema le cui batterie debbano essere cambiate da un operatore. Inviare una persona in un determinato luogo per la manutenzione di un sistema può essere molto costoso. Si pensi che in Germania ogni termosifone ha un piccolo dispositivo per il conteggio delle calorie utilizzate da un elemento termico. Se pensate alla popolazione di tutto il paese, immaginate quanto possa essere costoso dover cambiare le batterie ogni anno. Effettivamente questi dispositivi richiedono il cambio delle batterie ogni 10-15 anni.

Problematiche da affrontare

Il raggiungere lo scopo di avere un sistema che permetta una ridotta manutenzione e una lunga durata della batteria, non va ricercata solo in un’accurata progettazione del sistema elettronico, bensì anche nella batteria stessa. Per tale ragione negli ultimi decenni si è potuto assistere ad una continua evoluzione delle tecnologie utilizzate per lo sviluppo delle batterie. In questo momento le più utilizzate sono quelle a ioni litio e al Nichel Idruri metallici, perché hanno la caratteristica di una ricarica flessibile (non hanno l'effetto memoria delle vecchie batterie al Nichel di Cadmio) e hanno un buon rapporto peso energia accumulata per cm³ (le batterie al Litio sono più leggere di quelle al Nichel Idruri Metallici).  
Naturalmente l´utilizzo di una batteria piuttosto che un'altra è legata spesso ai costi del sistema che si sta progettando, oltre che alla durata desiderata.
Dopo la batteria, molte responsabilità al fine di garantire una lunga autonomia al sistema, vanno ricercate in un progetto accurato. Vediamo qualche dettaglio di alcuni degli aspetti che bisogna tenere a mente.


·    Scelta del regolatore o convertitore DC-DC.
·    Scelta dei componenti passivi.
·    Scelta dei componenti attivi.
·    Scelta del microprocessore ed architettura.
·    Sviluppo del Software.

Vediamo in maggior dettaglio i vari punti.

Scelta del regolatore o convertitore DC-DC

Niente funziona senza energia. Il più delle volte l´energia viene fornita da una batteria o gruppi di batterie in serie, al fine di ottenere il livello di tensione desiderato (i sistemi che vanno sotto il nome di energy harvesting system sono caratterizzati spesso dal non avere una batteria!).
Secondo la tensione della batteria e del sistema da alimentare è spesso necessario interporre un regolatore di tensione o convertitore DC-DC al fine di ottenere il livello di tensione necessaria al sistema stesso. Tenendo a mente che ogni componente che metteremo consumerà energia e che la quantità di energia di una batteria è limitata,  è bene evitare di usare un componente qualora non sia strettamente necessario. Per tale motivo la prima domanda da porsi è se un regolatore o convertitore è effettivamente necessario. Se si ha per esempio un microcontrollore che può operare da 1.8V a 3.6V e si fa utilizzo di una batteria litio a 3.6V, si potrebbe evitare anche il regolatore preservando l´energia che andrebbe persa dal regolatore stesso.
Qualora un regolatore sia comunque necessario per un corretto funzionamento del dispositivo (per esempio per generare una tensione di riferimento per un convertitore ADC interno) o perché la tensione della batteria è diversa da quella necessaria al sistema, bisogna scegliere il convertitore giusto.
Nel caso in cui si abbia necessità di aumentare la tensione, non si hanno molte scelte, si procede quasi sempre nell'utilizzare un alimentatore switching con tipologia boost, o altre soluzioni come pompe di carica. Nel caso si debba abbassare la tensione si può procedere sia nella scelta di un LDO (Low Drop Out Regulator) che di un alimentatore switching di tipo buck. Regolatori lineari tipo la serie 78xx, hanno tensioni di drop out dell'ordine dei 3V, per cui si capisce che non si possono utilizzare per abbassare per esempio 3.6V a 3V. In questo caso sono necessari gli LDO che hanno drop out di poche decine di mV. Per ottenere tensioni di drop out cosi basse, il pass transistor interno è di tipo MOS e non BJT come per la serie di regolatori 78xx. Nel mercato dei semiconduttori è possibile trovare LDO di tutte le salse e forme ma quelli a più elevata efficienza sono caratterizzati dall'avere costi leggermente più alti. Alcuni LDO hanno la caratteristica di avere tensioni multiple selezionabili dal microcontrollore. Per esempio per mezzo di un pin il microcontrollore potrebbe abbassare la tensione da 3.0V a 1.8V del regolatore che lo alimenta, permettendo di ridurre l´energia dissipata.
Gli alimentatori Switching hanno la caratteristica di essere molto efficienti, ma spesso quando le correnti in gioco sono di pochi mA, la loro efficienza non è molto alta per cui rimane ancora più vantaggioso un normale LDO. Per correnti dell'ordine di 50-100mA l´utilizzo di un regolatore switching potrebbe essere giustificato. Il loro svantaggio rispetto ad un regolatore lineare è il  costo più elevato e la necessità di un maggior spazio sul PCB (è infatti necessario un induttore e capacità di filtro piuttosto grande al fine di  ridurre il ripple associato all'architettura dell'alimentatore stesso). Si ricorda che le dimensioni fisiche di un alimentatore switching sono inversamente proporzionali alla frequenza di switching. Con frequenze di switching di 1MHz-2MHz e correnti di circa 50 mA è possibile realizzare un regolatore switching facendo uso di circa ¼ di centimetro quadro, ovvero comparabile con le dimensioni di un LDO. Come in precedenza i costi del sistema potrebbero far decidere per una soluzione piuttosto che un'altra, anche se da un punto di vista tecnico non dovesse essere ottimale.

Scelta dei componenti passivi

Anche se un sistema è digitale, il numero di componenti passivi presenti è spesso elevato. Si pensi per esempio ai resistori usati per la circuiteria di Reset, resistori di pull-up, resistori per filtri, condensatori di by pass. Per quanto riguarda i resistori si ricorda che l´energia dissipata al loro interno è pari al prodotto della resistenza per il quadrato della corrente.
Per sistemi a batteria è bene utilizzare resistori di decine di Kohm, per esempio 100Kohm. Valori di questo tipo non sono sempre possibili, infatti le correnti di leakage di un determinato pin potrebbero essere tanto alti che moltiplicati per il valore della resistenza potrebbero alterare il valore logico di un segnale a causa della caduta di tensione sul resistore stesso. Da questo discende che una certa cura deve essere posta nella scelta di microcontrollori con correnti di leackage molto basso (dell'ordine di decine di nA). Valori di leackage elevato possono rendere i consumi di un microcontrollore anche proibitivo per applicazioni a batteria. Si pensi se si avesse un microcontrollore con correnti di leackage di 1uA per pin e 100 pin! 100uA rischierebbero di andare in fumo!
Oltre ai resistori anche i condensatori devono essere scelti in maniera tale da limitare le correnti parassite che possono attraversarli in condizioni statiche. In particolare qualora si faccia uso di alimentatori switching, i condensatori devono avere basso valore ESR e ESL al fine da limitare l´energia che si viene a dissipare internamente a causa dello switching dei MOS e avere una buona risposta in frequenza.
Scelta dei componenti attivi
Non tutti i componenti attivi nascono per poter essere utilizzati in applicazioni portabili. Spesso il limite discende sia dai consumi che dalla tecnologia e architettura interna. Alcune problematiche associate alla progettazione di amplificatori alimentati a batteria sono state già trattate nella Brief Note BN0010. In questa sede mi limiterò a ricordare che qualora si abbia una tensione singola e ci si trovi a dover amplificare segnali duali, è necessario condizionare il segnale in ingresso aggiungendo una tensione di modo comune al fine di traslare il segnale e centrarlo rispetto al valore dell'alimentazione (se necessario). Altre problematiche associate agli amplificatori sono legate alla dinamica disponibile. Infatti amplificatori “normali” possono avere tensioni in uscita pari a quella di alimentazione meno 2V-3V. Qualora l´alimentazione sia di soli 2V si capisce che si ha un bel problema! In queste situazioni si fa spesso uso di amplificatori con ingresso e uscite Rail to Rail, ovvero il cui valore in ingresso e uscita possono assumere il valore dell'alimentazione. In base all'architettura dell'ingresso è anche possibile eccedere o scendere al disotto del valore massimo e minimo di circa 0.5V, ovvero prima che i diodi di clamping entrino in conduzione (si faccia rifermento alla Brief Note BN0010 per maggiori informazioni).
In applicazioni a basso consumo, oltre che a cercare amplificatori che consumino poco è bene cercare amplificatori con l´opzione di enable, ovvero che permettano di disattivare il dispositivo qualora non sia necessario. Questa opzione è utile averla in tutti i dispositivi che non debbano operare in maniera continua, siano essi analogici che digitali. Se tale opzione non fosse presente e il dispositivo sia a bassa potenza è possibile far uso di un pin di un microcontrollore al fine di alimentare e disattivare il dispositivo, come riportato in Figura 1 (non sono riportati i filtraggi sull'alimentazione).
 

Esempio di amplificatore alimentato direttamente dal microcontrollore


Figura 1: Esempio di amplificatore alimentato direttamente dal microcontrollore.

Qualora si debba pilotare un carico che vada oltre le correnti permesse da un´uscita di un microcontrollore è necessario far uso di un transistor o di un buffer. Al fine di ridurre la caduta di tensione ai suoi capi, minimizzando l´energia dissipata internamente, è bene far uso di transistor MOS piuttosto che transistor BJT. Diversi MOS sono ottimizzati per poter essere pilotati correttamente anche con tensioni |Vgs| inferiori a 3V.Quando si fa uso di una batteria rimovibile potrebbe essere necessario proteggere il sistema da eventuali inversioni della batteria stessa. Far uso di diodi di protezione potrebbe essere una soluzione ma è bene far uso di diodi Schottky ( Figura 2 a) al fine di avere una ridotta caduta di tensione sul diodo (si veda la Brief Note BN0002 per maggior dettagli). Altra soluzione potrebbe essere quella di utilizzare un MOS come riportato in Figura 2 b.
 

Esempi di protezione di un sistema da un'inversione della batteria


Figura 2: Esempi di protezione di un sistema da un'inversione della batteria.


Entrambe le soluzioni per quanto più efficienti di un diodo al silicio, dissipano comunque dell'energia cosa che in sistemi che devono durare 15 anni non può essere ammessa. In queste situazioni si sacrifica spesso la protezione. Una soluzione ottimale per risolvere il problema può essere di tipo non elettronica, per esempio utilizzando un connettore codificato (keyed connector), ovvero un connettore con una guida. Un'altra valida soluzione è quella di dare una forma particolare alla batteria stessa (si pensi per esempio alle batterie dei cellulari). Queste soluzioni meccaniche permettono con un costo maggiore della batteria o del connettore, di risolvere il problema dell'inversione della polarità.

Scelta del microprocessore

Quando si deve realizzare un sistema embedded, la scelta del microcontrollore è particolarmente importante, sebbene, come vedremo a breve, anche la programmazione dello stesso gioca un ruolo fondamentale. Tra i microcontrollori rinomati per i ridotti consumi si ricorda l'MSP430 (Ultra Low Power) della TI, la famiglia XLP (Extra Low Power) della Microchip, i controllori della Renesas e ST. Molte società, tra cui Microchip e Renesas, confrontano i propri microcontrollori con l'MSP430 per dimostrare di essere i migliori. A mio avviso dire che si è migliori ha poco senso visto che è sempre l'applicazione che fa di un microcontrollore il migliore o meno. I dipartimenti di marketing di ogni società, nessuna esclusa, sono sempre pronti a mostrare e mettere in miglior luce i propri componenti rendendoli i migliori, per cui è compito del progettista fare una scelta accurata leggendo il datasheet del microcontrollore, non soffermandosi solo alla prima pagina. La prima pagina del datasheet è infatti fortemente influenzata dal marketing, mentre le tabelle e grafici che caratterizzino il componente, sebbene possano saltare alcuni punti ritenuti non belli da mostrare, rappresentano un documento ufficiale di una certa importanza legale, per cui quello che viene certificato e garantito rappresenta il valore da prendere come “verità” per un confronto. Dopo essermi dilungato in questo aspetto fondamentale che soprattutto ingegneri alle “prime armi” sono soliti sottovalutare, vediamo qualche aspetto da tenere a mente durante la scelta di un microcontrollore.

Architettura

A seconda del sistema che si sta sviluppando un'architettura può risultare più vantaggiosa di altre. Si supponga di dover campionare un segnale con ADC da 10, 12 o 16 bit. Se le misure sono frequenti è bene valutare di utilizzare un microcontrollore a 16 bit piuttosto che uno a 8 bit. Questo discende dal fatto che per la natura stessa di un microcontrollore a 16 bit le letture ed elaborazione dati potrebbero essere svolte con semplici istruzioni, senza dover spezzare le letture dell'ADC in due byte.
Qualora si debbano fare letture di segnali analogici in cui un ADC ad 8 bit dovesse dare la risoluzione necessaria, il ragionamento sopra non varrebbe. In ogni modo avere solo 8 bit per l'indirizzamento potrebbe portare allo sviluppo di architetture con paginazione ovvero con spezzettamento della memoria in pagine, il che richiede d'impostare la pagina corretta prima di leggere o scrivere dati. Questo a sua volta richiede l'esecuzione di istruzioni superflue, che possono essere evitate usando architetture in cui la memoria sia lineare ovvero senza paginazione (anche architetture ad 8 bit possono non avere la paginazione della memoria programma).

Frequenza di clock

Ogni microcontrollore per funzionare ha bisogno di un clock. Dal momento che i consumi aumentano con la frequenza di clock  è bene operare alla frequenza più bassa che soddisfi le specifiche. Ciononostante qualora il microcontrollore non richieda d'essere attivo tutto il tempo, operare ad una frequenza più alta non necessariamente comporta maggiori consumi. Supponiamo che un sistema abbia un microcontrollore che stia in stato di sleep per 1s e si attivi per 5ms alla frequenza di 10MHz per svolgere determinate operazioni. Se il microcontrollore dovesse operare a 5MHz impiegherebbe sicuramente più tempo, circa il doppio. Anche se apparentemente resta attivo per più tempo i consumi sono spesso molto simili al caso in cui operi a 10MHz, infatti l'energia viene spalmata su di un tempo diverso. Questo ragionamento non sarebbe valido se il microcontrollore fosse sempre attivo, in qual caso a 10MHz consumerebbe certamente di più. Inoltre è bene considerare che questa approssimazione lineare potrebbe non valere sempre, ed in particolare tende a non valere se i tempi per cui il microcontrollore rimane attivo sono comparabili con il tempo che il microcontrollore impiega per risvegliarsi dallo stato di sleep.
Il tempo di riattivazione dallo stato di sleep o di attivazione da uno stato di prima alimentazione, sono parametri particolarmente importati nell'ambito del cosi detto energy harvesting, ovvero in quei sistemi in cui l'energia viene raccolta da ogni fonte di energia che circonda il sistema stesso (pannelli solari, trasduttori movimento).
Da quanto appena detto si capisce che per valutare effettivamente l'energia consumata dal sistema è necessario tenere a mente il tempo di attivazione o risveglio del microcontrollore, il tempo per cui viene  eseguito il codice (includendo i consumi delle periferiche attive) e il tempo per cui il microcontrollore resta in stato di sleep. In particolare quando il dispositivo è attivo i consumi sono espressi in uA/MHz o uA/MIPS (Milion of Instructions per Second) quindi oltre al tempo anche la frequenza operativa deve essere valutata. In stato di sleep la corrente è statica, ovvero un semplice numero, e dipende dalla modalità di sleep in cui è stato messo il microcontrollore. In base all'architettura del microcontrollore si possono avere stati di sleep con BOR (Brown Out Reset), con RTC (Real Time Clock) a 32KHz e con o meno il mantenimento dei dati in memoria RAM (RAM retention). Qualora i dati non siano mantenuti in RAM vi è spesso comunque la presenza di una manciata di celle RAM (2 o 4 Word) per mezzo delle quali è possibile memorizzare dei dati senza dover far uso della memoria EEPROM o Flash. Questo problema non è più presente nei microcontrollori di ultima generazione che fanno uso della memoria FRAM (Ferroelectric RAM) di cui RAMTRON e TI sono i maggiori produttori.

Internal LDO

All'interno di un microcontrollore  la CPU  (Central Processing Unit) è in generale la parte responsabile del maggior consumo. Per questo mandare in sleep il microcontrollore, pur lasciando spesso attive altre periferiche, comporta quasi sempre la disattivazione della CPU. Oltre a questa possibilità, non utilizzabile qualora sia richiesta attivamente la CPU,  è possibile alimentare la CPU ad una tensione più bassa del resto delle periferiche. Questa soluzione è frequentemente adottata da quei microprocessori ottimizzati per avere bassi consumi anche quando devono essere attivi (un esempio sono gli MSP430).  Allo stesso modo per cui la CPU riduce i consumi lavorando a tensioni più basse, è bene considerare la possibilità di alimentare l'intero microcontrollore a tensioni più basse.
Una cosa importante da tenere a mente è che la frequenza massima a cui può operare un microcontrollore dipende anche dalla tensione di alimentazione, per cui un limite minimo per la tensione di alimentazione potrebbe venire proprio dalla minima frequenza operativa. Spesso al fine di ottimizzare i consumi si riduce la frequenza del microcontrollore, questo permette di ridurre anche la tensione operativa e quindi i consumi. Tale soluzione è possibile adottarla qualora il microcontrollore supporti una variazione dinamica del clock e della tensione di alimentazione. Questi artifici non riducono però i consumi quanto mandare in stato di sleep il microcontrollore.

Periferiche intelligenti (TIMER-ADC, DMA)

All'interno di un microcontrollore la CPU  è responsabile della maggior parte del consumo. Poter tenere disattiva la CPU e poter svolgere comunque delle operazioni è una opzione di cui è  bene tener conto. Una periferica che può operare senza l'intervento della CPU  è conosciuta come periferica intelligente. In realtà di intelligente non vi è nulla, ma effettivamente ci sono casi in cui alcune periferiche possono operare senza che la CPU debba arbitrare il bus o leggere i dati. In ogni modo le periferiche devono essere comunque preventivamente impostate dalla CPU ovvero dall'applicazione che viene eseguita.
Tra le periferiche più note che possono operare da sole ci sono i Timer (tra cui anche il watch dog). Questi richiedono solo di un clock per contare e generano delle interruzioni in tempi prestabiliti. Questo permette per esempio di effettuare delle attese senza dover utilizzare dei loop di ritardo, rinomati per essere responsabili di consumi inutili. Spesso i Timer sono connessi con gli ADC interni al fine di avviare una conversione a cadenza fissa senza dover far uso della CPU. A supporto ulteriore di applicazioni in cui ADC vengono avviati per mezzo dei Timer, si può avere un modulo DMA (Direct Memory Access) che permette di spostare dati da un indirizzo ad un altro della memoria senza intervento della CPU. Dal momento che il buffer di un ADC altro non è che un registro di memoria, significa poter spostare il dato derivante da una conversione, dal buffer ad un'altra locazione di memoria RAM. Il modulo DMA può essere generalmente programmato per spostare anche più dati e solo quando un determinato numero di letture è disponibile, la CPU viene attivata per elaborare i dati raccolti. Il modulo DMA è normalmente presente a partire da CPU a 16 bit ed è praticamente sempre presente nei DSP (Digital Signal Processor). Il numero di canali disponibili per il DMA può essere importante qualora si debbano svolgere molte misure o sincronizzare molti eventi e trasferimenti dati senza che la CPU debba fare nulla, lasciandola in questo modo o in stato di Sleep o a svolgere altre operazioni in parallelo. Altra caratteristica che  è bene avere per ogni periferica  è la possibilità di attivarla o disattivarla al fine di ridurre i consumi.

Periferiche a basso consumo

Sebbene molti progetti a basso consumo sono pensati per lasciare il microcontrollore disattivo per percentuali anche superiori al 95%, ci sono comunque applicazioni in cui è necessario, seppure a bassa frequenza, mantenere attivo il microcontrollore o solo alcune parti di esso.
In questi casi, anche se la lotta tra molti produttori  di microcontrollori sia quella di mostrare bassi consumi in stato di sleep  è bene non trascurare il resto del datasheet. In particolare bisogna verificare quanto consumano le periferiche che bisognerà utilizzare nel proprio progetto. Solo con un confronto e bilancio energetico completo è possibile valutare quale microcontrollore rappresenti la soluzione   ottimale per il proprio progetto.

Leakage

Un aspetto che spesso viene ignorato  è quello relativo alle correnti di leakage, ovvero quella corrente che circola in un ingresso, pur essendo rappresentato dal gate di un MOS. Queste correnti seppur piccole possono essere non trascurabili qualora si stia parlando di microcontrollori con 100 pin. Le correnti di Leackage sono normalmente dell'ordine di 50nA-1000nA. Si capisce che nel caso in cui si abbiano 1000nA di leackage per pin, avere 100 pin porterebbe dei consumi di 100uA senza compiere nulla. Avere correnti di leackage basse permette anche di utilizzare resistori di pull-up o pull-down più grandi, riducendo cosi i consumi globali. Questo non sarebbe possibile se si avessero correnti di leackage troppo elevate. Infatti la corrente di leackage circolando sul resistore di pull-up o pull-down potrebbe alterare il livello logico o ridurre inutilmente la soglia di sicurezza per discriminare il valore dello stato logico.
Gli aspetti ora trattati non sono i soli da tenere a mente. Frequentemente altri aspetti come il package, la temperatura operativa, i costi possono far deviare una scelta da un microcontrollore perfetto a uno che lo sarebbe meno. Qualunque sia il problema, è bene tenere a mente che le specifiche tecniche devono essere rispettate e qualora questo non accada o non sia possibile bisogna avere delle ottime motivazioni al fine di proporre dei cambiamenti.
 

Sviluppo del Software

Considerando l´esistenza stessa del paragrafo potete già comprendere che oltre ad un buon hardware anche il software ha un ruolo importate al fine di ridurre i consumi.
Ci sono molti accorgimenti nella scrittura di un software che è bene tenere a mente. Alcuni possono trarre vantaggio da una particolare architettura di un microcontrollore mentre altri possono essere applicati indistintamente.
Vediamo qualche regola:
·    Come prima regola d´oro, non utilizzare mai la tecnica del polling al fine di coordinare delle operazioni in funzione di determinati eventi. Utilizzare sempre le interruzioni in maniera da poter mandare la CPU in stato di sleep sino al verificarsi di un evento.
·    Eliminare le attese per mezzo dei conteggi in loop; si usino invece i Timer interni ai microcontrollori congiuntamente alle interruzioni per far risvegliare la CPU e far svolgere le operazioni richieste.
·    Se proprio bisogna contare conta al contrario. Se per esempio devi eseguire una operazione per dieci volte:


for (i=0; i<10; i++) {

}


Conta al contrario:


for (i=10; i>0; i--) {

}


In questo modo il compilatore potrà far uso di un semplice controllo dello status register  della CPU (ovvero se il risultato dell'operazione ha generato un risultato nullo) piuttosto che confrontare il valore di i con il numero di cicli. In questo modo si riduce il codice che deve essere eseguito, dunque si risparmia energia.
·    Ottimizzare il codice in maniera da limitare il numero di operazioni e cicli di clock necessari per lo svolgimento di un’operazione.  Trarre vantaggio dai vari livelli di ottimizzazione offerti da molti compilatori.
·    A seconda delle applicazioni considerare di programmare in Assembly. Sebbene io non sia un  fanatico dell'Assembly, far durare una batteria 20 anni può richiedere il risparmio di ogni singola istruzione superflua. Frequentemente scrivere in C e utilizzare un buon compilatore può essere sufficiente ma quando i consumi del sistema girano intorno al microcontrollore, l'Assembly può essere di aiuto.
·    Utilizzare a proprio vantaggio tutto l´hardware intelligente, ovvero mettere sempre la CPU in stato di Sleep. Esempi tipici, sono l'utilizzo dei timer per sincronizzare attività quali il campionamento di un segnale analogico, utilizzo del DMA (Direct Memory Access) al fine di scrivere dati direttamente in memoria senza dover scomodare la CPU.
Dopo questa breve carrellata di suggerimenti vorrei discutere un punto chiave appena descritto, ovvero ottimizzare il codice. In diversi articoli ho affermato che ottimizzare il codice non deve essere fatto alla ceca e come punto di partenza per la scrittura del codice. Questo rimane valido anche in questa sede, ovvero ogni volta che si effettua una ottimizzazione che sacrifica la leggibilità del codice, è bene controllare se il codice più leggibile non sia già ottimizzato dal compilatore. Ciononostante molte applicazioni vengono sviluppate scrivendo poche righe di codice (100-200 righe) per cui algoritmi poco leggibili che ottimizzano il codice possono essere utilizzati purché si commenti propriamente il codice.


Ogni istruzione risparmiata, rappresenta un ciclo o più di clock risparmiati, per cui rappresenta dell'energia che potrà essere utilizzata in un secondo momento.

 

Bibliografia

1) MSP430 home page

2) PIC Home Page

3) ST Microcontroller

 

 

 


You don`t have permission to comment here!

Registrati al sito

Accedi a tutte le risorse e articoli non visibili pubblicamente, puoi registrarti con pochi passi.

Registrati al sito LaurTec.

Login