Salvo RTOS per PICMicro

I sistemi operativi real-time (RTOS) non sono una prerogativa di processori ad elevate prestazione e con elevata capacità di risorse, ma anche di processori ad 8-bit. In questo articolo si analizzerà l’RTOS Salvo implementato su PICMicro.

Un sistema operativo real-time o in tempo reale (abbreviato con la sigla RTOS) è un sistema operativo specializzato per il supporto di applicazioni software real-time. Questi sistemi vengono utilizzati tipicamente in ambito industriale (controllo di processo, pilotaggio di robot, trasferimento di dati nelle telecomunicazioni) o comunque dove sia necessario ottenere una risposta dal sistema in un tempo massimo prefissato. Da un punto di vista puramente teorico l’intervallo di tempo in cui il sistema operativo/applicativo deve reagire non ha importanza, infatti un sistema operativo in RT non deve essere necessariamente veloce, la cosa importante è che risponda entro un tempo massimo ben conosciuto. Un sistema in tempo reale deve garantire una elaborazione rapida dal punto di vista temporale, anche se è possibile che la risposta non sia “precisissima”. Ad esempio una funzione di calcolo può calcolare il peso di un oggetto senza giungere alla determinazione del milligrammo perché deve comunque fornire una risposta in un preciso tempo da quando si è posto il peso nella bilancia. Tale ragionamento non significa che si possono anche dare risposte errate ma che bisogna spostare l’attenzione sul tempo della risposta. Questi tipi di sistemi devono dare l’opportunità allo sviluppatore di conoscere a priori le condizioni peggiori in cui si ottiene la risposta. Viceversa un sistema operativo “tradizionale” deve garantire un’elaborazione corretta dal punto di vista logico, anche se è possibile tollerare che qualche risposta arrivi in anticipo o in ritardo. I sistemi real-time  si possono dividere in due categorie:

» I  sistemi “hard” richiedono un rigida precisione nella risposta in termini temporali, infatti il mancare una scadenza ha come conseguenza quello di invalidare il funzionamento dell’intero sistema. Un esempio di sistema “hard” potrebbe essere quello di una catena di montaggio, in cui basta che un pezzo abbia un ritardo e l’intera catena si blocca perché quel pezzo è indispensabile.

» I sistemi  “soft” si limitano ad un rispetto statistico (tolleranza) dei vincoli di tempo che, qualora prolungati, portano ad un degrado dell’applicazione. Degrado che può essere comunque tollerato, in funzione dell’importanza per l’utilizzatore in termini di costo. Sostanzialmente questa distinzione si traduce nella diversa quantificazione dei costi di una possibile inesattezza temporale del sistema. Un esempio di sistema soft real-time può essere un riproduttore DVD, in cui il mancato rispetto dei vincoli si traduce in un degrado della qualità del filmato, ma non pregiudica il proseguimento della riproduzione. Un sistema operativo real-time non è solo una prerogativa di processori ad alte prestazioni, ma anche di microcontrollori ad 8-bit come PICMicro della Microchip. Esistono differenti versioni di RTOS previsti per PICMicro. In quest’articolo si esaminerà l’RTOS Salvo. Si tratta di un sistema operativo che richiede ridotta memoria programma e dati. Esso è stato appositamente sviluppato per microcontrollori e microprocessori dotate di ridotte risorse e richiede da 5 a 100 volte meno memoria rispetto agli altri RTOS.

Che tipo di RTOS?

Salvo è un RTOS di tipo mulitasking, cooperative ed event-driven. La gestione del multitasking è basata sul concetto di priorità, con 16 livelli di priorità indipendenti. I task a cui è assegnata la stessa priorità sono gestiti in modalità roundrobin. Salvo fornisce servizi per la gestione di semafori (di tipo binario e contatori), messaggi, code di messaggi, flag di evento per la comunicazione tra differenti task e gestione delle risorse. E’ supporta una serie completa di funzioni, tra cui contextswitch, interruzione di un task, attesa di un semaforo ed altri simili. Inoltre, sono previsti anche timer per la gestione dei ritardi e dei timeout.

Un programma tipo con Salvo

Un programma tipo realizzato con Salvo è molto simile  ad altri programmi scritti per sistemi di tipo multitasking. Nel listato 1 si riporta un listato di esempio in cui sono definiti due tipi di task, con differenti livelli di priorità. Il codice riportato nel listato 1 mostra come implementare un apparato per il riscaldamento del sedile di un’automobile.

#include <salvo.h>
typedef unsigned char t_boolean;
typedef unsigned char t_temp;
/* Local flag. */
t_boolean warm = FALSE;
/* Impostazioni funzioni di temperatura. */
extern t_temp UserTemp( void );
extern t_temp SeatTemp( void );
extern t_boolean CtrlTemp( t_temp user, seat );
/* Priorità moderata (8) */
void TaskControl( void )
{
          while (1) {
                 warm = CtrlTemp(UserTemp(), SeatTemp());
                 OS_Yield();
          }
}
/* Priorità elevate (3) */
void TaskStatus( void ){
         /* initialize pulse output (low). */
         TX_PORT &= ~0x01;
         while (1) {
                OS_Delay(100);
                TX_PORT |= 0x01;
                OS_Delay(5);
                TX_PORT &= ~0x01;
                if (warm) {
                      OS_Delay(5);
                      TX_PORT |= 0x01;
                      OS_Delay(5);
                      TX_PORT &= ~0x01;
            }
      }
}
/* Inizializzazione Salvo, creazione ed assegnazione */
/* delle priorità dei task ed avvio del multi-tasking */
int main( void ){
       OSInit();
       OSCreateTask(TaskControl, OSTCBP(1), 8);
       OSCreateTask(TaskStatus, OSTCBP(2), 3);
       while (1) {
              OSSched();
       }
}
Listato 1

Il microcontrollore  in questo caso è integrato all’interno del sedile e richiede solo 4 fili per la comunicazione con il resto dell’elettronica a bordo auto: power, ground, RX (per ricevere il valore della temperatura misurata dal sensore) e TX (per indicare lo stato). La temperatura desiderata è mantenuta tramite Task-Control(). TaskStatus() ha il compito di indicare, ogni secondo, se il sedile ha raggiunto la temperatura desiderata; invierà un impulso singolo ogni 50ms se la temperatura non è ancora raggiunta, oppure un impulso doppio ogni 50ms in caso contrario. E’ importante notare da questo semplice esempio che durante l’esecuzione di questo codice, il controllo della temperatura è eseguito anche durante le chiamate dei delay (OS_Delay()) contenute nella funzione Ta skStatus() . La chiama di OS_Delay(), infatti, non causa come nella programmazione “tradizionale”, lo stallo del processore per un tempo pari al ritardo introdotto. Quello che succede è che il  sistema operativo (Salvo)  indica che durante queste attesa il processore può dedicarsi ad eseguire task di minore priorità. Questo consente di ottimizzare al massimo le limitate risorse della CPU.

Quali  sono le risorse  utilizzate?

La quantità di ROM necessaria nel processore dipende da quante funzioni di Salvo si decide di utilizzare. La più piccola applicazione muli-tasking richiede l’uso di poche centinaia di istruzioni. L’uso di Salvo al pieno delle sue funzionalità può richiedere l’uso di 1000 istruzioni. Negli R TOS convenzionali è richiesto un’elevata quantità di RAM per la gestione dello stack di ciascun task. Con Salvo non è necessario questo tipo di gestione, pertanto si riduce notevolmente l’ammontare di RAM utilizzata.

Creare un’applicazione con Salvo RTOS e MPLAB IDE

Creare il primo  progetto

Seguire  i passi di seguito descritti:

■  1-Creare un nuovo progetto selezionando Project/Project Wizard e scegliere il PICMicro  da utilizzare, nel caso specifico PIC18C452 (vedere figura 1). Fare click su Next.

Figura 1: selezione del PICMicro.

Figura 1:
selezione
del PICMicro.

2-Selezionare il compilatore  C18 (figura 2). Fare click su Next ed inserire  il nome del progetto.

Figura 2: selezione del compilatore C18

Figura 2: selezione del compilatore C18

■  3-Aggiungere al progetto i file c:\salvo\src\mem.c e c:\salvo\ex\ex1\main.c (figura 3).

Figura 3: aggiunta dei file al progetto.

Figura 3: aggiunta dei file al progetto.

4-A questo punto è necessario impostare i parametri di compilazione. Selezionare ProjectBuild OptionsProject. Le impostazioni necessarie per il tab General sono riportate in figura 4. Nel tab MPLINK Linker, accertarsi che sia selezionata l’opzione Generate map. Nel tab MPLAB C18 accertarsi che sia selezionato l’opzione General della combobox Categories.

Figura 4: impostazioni di compilazione.

Figura 4: impostazioni di compilazione.

5-Aggiungere  il file di libreria di Salvo appropriata per il  PIC18C452: cioè sfc18sfa.lib. Per fare questo selezionare Add Files nella sezione file di libreria, impostare il percorso c:\salvo\lib\mcc18 e quindi selezionare  il suddetto file di libreria.

6-Per utilizzare i file di libreria specificati al punto precedente, è necessario aggiungere al progetto un file header chiamato salvocfg.h. Questo file dovrebbe contenere semplicemente:
#define OSUSE_LIBRARY TRUE
#define OSLIBRARY_TYPE OSF
#define OSLIBRARY_GLOBALS OSF
#define OSLIBRARY_CONFIG OSA
#define OSLIBRARY_VARIANT OSNONE

7-A questo punto il progetto dovrebbe essere pronto per la compilazione. Per le prime prove è possibile  utilizzare il simulatore incluso nell’ambiente di sviluppo MPLAB e successivamente passare ad una prova pratica su PICMicro.

 

 

Scrivi un commento

EOS-Academy