Ottimizzare la memoria su MSP430 e μC/OS-II

Questo articolo mostra come utilizzare un Micrium C/OS-II real-time kernel su MSP430 soltanto con un piccolo consumo supplementare di memoria. Vedremo alcuni suggerimenti sull’utilizzo delle funzionalità dell’MSP430 e del Micriμm μC/OS-II per ottimizzare al massimo i progetti.

Come applicazione dimostrativa scegliamo di utilizzare un programma che effettua il lampeggio di due LED sulla scheda MSP430F5438 Experimenter Board. Ogni LED è controllato da uno specifico task. Il programma è stato sviluppato per il microcontrollore MSP430F5438A. La Experimenter Board è stata configurata via software per lavorare con questa applicazione alla frequenza di 1 MHz.

MODIFICARE L’APPLICAZIONE PER GLI ALTRI DISPOSITIVI MSP430F5XX/6XX

Per modificare l’applicazione e farla girare su un dispositivo diverso della famiglia MSP430F5xx/6xx, per prima cosa dall’ambiente di sviluppo selezionare IAR→Options→General→Options→Target per selezionare un nuovo dispositivo (Figura 1). Il secondo passo è modificare il file hal_board.h perché rispecchi le modifiche relative al dispositivo selezionato, in modo che le porte che comandano i LED siano correttamente impostate. Infine, è buona regola gestire tutti i pin inutilizzati come specificato nel documento “MSP430x5xx/MSP430x6xx Family User’s Guide” (SLAU208). La funzione halBoardInit() nel file hal_board.c mantiene tutti i pin inutilizzati configurati come uscite per ridurre il consumo di corrente.

Figura 1: selezione del dispositivo.

Figura 1: selezione del dispositivo

CLOCK

Per i sistemi alimentati a batteria esiste il solito problema, mantenere una frequenza di clock bassa riduce il consumo di potenza e prolunga la durata delle batterie. Frequenze di clock alte, invece, consentono di avere tempi di risposta veloci e capacità di processamento elevate. Risulta molto importante garantire un clock stabile indipendentemente dalla temperatura operativa e dalla tensione di alimentazione, tuttavia, per i sistemi più low cost spesso non sono necessari requisiti così stringenti sull’accuratezza del clock. Il modulo UCS (Unified Clock System) permette di confrontarsi con questi problemi e consente all’utente di scegliere tra tre segnali di clock disponibili: ACLK, MCLK e SMCLK. Tutti e tre i segnali di clock possono essere ottenuti a partire da ognuna delle sorgenti di clock disponibili (XT1CLK, VLOCLK, REFOCLK, DCOCLK, DCOCLKDIV, oppure XT2CLK), fornendo la massima flessibilità nella configurazione del clock. In generale i moduli Power Management Module (PMM), Unified Clock System (UCS), Port Map (PMAP) e i moduli Flash, sono periferiche flessibili che richiedono una inizializzazione per moltissime applicazioni. La Core Library per MSP430F5xx e MSP430F6xx mette a disposizione delle funzioni che consentono di effettuare le operazioni più comuni come, per esempio, cambiare la tensione di core per operare a frequenze più elevate, inizializzare clock o quarzi, mappare gli I/O ed eseguire scritture e cancellazioni in flash. Per eseguire le impostazioni dei vari moduli è sempre consigliabile servirsi delle funzioni fornite dalla Core Library. Per il progetto in questione i file sono disponibili nella cartella \Software\EvalBoards\TI\MSPEXP430F5438\ IAR\BSP\F5xx_F6xx_Core_ Lib. Per approfondire l’argomento è possibile scaricare il documento MSP430F5xx e MSP430F6xx Core Libraries (SLAA448).

REQUISITI DI MEMORIA PER μC/OS-II SU MSP430

Per il progetto utilizziamo la versione “Low Memory Overhead” del μC/OSII, per dimostrare che con un piccolo incremento del consumo di memoria tutto funziona correttamente su MSP430. L’applicativo, come detto, fa lampeggiare due LED sulla scheda MSPEXP430F5438, ogni LED è controllato da un task. Per il progetto si utilizza IAR versione 5.20.1, il livello di ottimizzazione viene impostato a “High [Balanced]”. In Figura 2 è possibile osservare l’utilizzo della memoria generato da questa applicazione.

Figura 2: estratto del map file.

Figura 2: estratto del map file

INTRODUCIAMO IL SISTEMA OPERATIVO

L’introduzione del sistema operativo μC/OS-II comporta le impostazioni di alcune costanti utilizzate dall’applicazione di default. I valori sono riportati nella tabella di Figura 3. Se l’applicazione viene modificata cambiando le operazioni o aggiungendo nuovi task, le costanti di Figura 3 devono essere modificate in accordo con le nuove esigenze. Un’impostazione ragionevole di questi valori è raccomandabile per mantenere un utilizzo di RAM contenuto. L’applicazione d’esempio contiene due task, AppTask1 e AppTask2. I task sono creati nel file app.c. Se vogliamo creare nuovi task possiamo utilizzare il codice riportato come template per l’aggiunta. L’aggiunta di task all’applicazione deve seguire questa procedura: 1) incrementare il valore di OS_MAX_TASK di 1 per ogni task supplementare; 2) incrementare OS_LOWEST_PRIORITY almeno di 1, ogni task deve avere una priorità differente. Ovviamente, se è il caso rivedere l’assegnazione delle priorità di tutti i task; 3) se il nuovo task utilizza semafori, mutex, code o mailbox, impostare o abilitare: OS_SEM_EN,OS_MUTEX_EN, OS_Q_EN o OS_MBOX_EN e OS_MAX_EVENTS in base alle necessità; 4) OS_MAX_MEM_PART deve essere cambiato in base alle esigenze.

Figura 3: configurazione delle costanti per μC/OS-II.

Figura 3: configurazione delle costanti per μC/OS-II

ULTRA LOW-POWER E μC/OS-II

Quando il sistema operativo non è impegnato nell’esecuzione di un task ed è bloccato o in attesa di un evento, è raccomandabile utilizzare l’opzione low power dell’MSP430 per portare il sistema in una delle modalità di basso consumo e risparmiare potenza. La scelta della modalità è a discrezione del progettista. Nel Listato 1 viene riportato un esempio di modalità di basso consumo. Dopo che il microcontrollore è entrato in una fase di basso consumo, vi rimane finché il tick timer o qualsiasi interrupt dell’applicativo o di una periferica lo risveglia. Nell’applicazione d’esempio, il Watchdog Timer è configurato per funzionare come tick timer. L’intervallo e la sorgente di timer possono essere modificate in base alle esigenze.

/*********************************************************************
***
IDLE TASK HOOK
*
* Description: This function is called by the idle task. This hook has
been
* added to allow you to do such things as STOP the CPU to conserve power.
*
* Arguments: none
*
* Note(s): 1) Interrupts are enabled during this call.
**********************************************************************
*/
#if OS_CPU_HOOKS_EN > 0 && OS_VERSION >= 251
void OSTaskIdleHook (void)
{
#if 1
// Enter low power mode
// Enable interrupts, enter LPM0
__bis_SR_register(LPM0_bits + GIE);
__no_operation();
#endif
}
Listato 1: utilizzo della modalità LPM

MODALITÀ LOW-POWER

Le modalità operative disponibili attraverso una configurazione software sull’MSP430F5438A sono le seguenti:

  • active mode (AM): SCG1 = 0, SCG0 = 0, OSCOFF = 0, CPUOFF = 0; in tale modalità CPU, MCLK sono attivi, ACLK è attivo, SMCLK è opzionale (SMCLKOFF = 0). DCO è attivo se alimenta ACLK, MCLK, o SMCLK. Il bias del DCO è attivo se il DCO è attivo o se il DCO alimenta MCLK o SMCLK. FLL è attivo se il DCO è abilitato;
  • low-power mode 0 (LPM0): SCG1 = 0, SCG0 = 0, OSCOFF = 0, CPUOFF = 1: in tale modalità CPU, MCLK sono disattivati, ACLK è attivo, SMCLK è opzionale (SMCLKOFF = 0). DCO è attivo se alimenta ACLK, o SMCLK. Il bias del DCO è attivo se il DCO è attivo o se il DCO alimenta MCLK o SMCLK. FLL è attivo se il DCO è abilitato;
  • low-power mode 1 (LPM1): SCG1 = 1, SCG0 = 1, OSCOFF = 0, CPUOFF = 1; in tale modalità CPU, MCLK sono disattivati, ACLK è attivo, SMCLK è opzionale (SMCLKOFF = 0). DCO è attivo se alimenta ACLK, o SMCLK. Il bias del DCO è attivo se il DCO è attivo o se il DCO alimenta MCLK o SMCLK. FLL è disattivato;
  • low-power mode 2 (LPM2): SCG1 = 1, SCG0 = 0, OSCOFF = 0, CPUOFF = 1; in tale modalità CPU, MCLK sono disattivati, ACLK è attivo, SMCLK è disattivato. DCO è attivo se alimenta ACLK. FLL è disattivato;
  • low-power mode 3 (LPM3): SCG1 = 1, SCG0 = 1, OSCOFF = 0, CPUOFF = 1; in tale modalità CPU, MCLK sono disattivati, ACLK è attivo, SMCLK è disattivato. DCO è attivo se alimenta ACLK. FLL è disattivato. Un modulo periferica richiede in autonomia la propria sorgente di clock dal modulo UCS se questo è necessario per l’operatività, indipendentemente della modalità di consumo impostata. Ad esempio, se un timer seleziona ACLK come sua sorgente di clock, e il timer è attivo, allora genera un segnale di richiesta ACLK_REQ all’UCS. L’UCS di risposta abilita ACLK indipendentemente dall’impostazione LPM. Ogni richiesta di clock da parte di una periferica prevale sull’impostazione di risparmio energetico. Poiché il sistema operativo richiede un clock per il timer tick, le modalità LPM inferiori alla 3 non possono essere praticate.

μC/OS-II

Il kernel μC/OS-II è disponibile in modalità “source-available” e non “open source”. In questa modalità di licenza sperimentata da Micrium, il codice completo del kernel può essere valutato senza costi. Il codice può anche essere utilizzato gratuitamente per progetti scolastici. I progettisti che invece intendono inserire il codice all’interno di un prodotto che verrà commercializzato devono acquistare una licenza.

Scarica subito una copia gratis

Scrivi un commento

Seguici anche sul tuo Social Network preferito!

Send this to a friend