EOS

Programmare in real-time con VisualRTXC

VisualRTXC di Quadros system Inc. è un tools di sviluppo versatile e semplice da utilizzare, non richiede una conoscenza approfondita di programmazione, e lascia libertà d’utilizzo da parte del programmatore. In quest’articolo ne sveleremo pregi e difetti, cercando di gettare le basi per un utilizzo senza problematiche.

Ogni progettista o hobbista che si rispetti, sa benissimo che con l’implementazione nel proprio circuito di un dispositivo programmabile, oltre ad accrescerne le potenzialità, ne aumenta anche le possibilità di errore e la complessità stessa. Lo schema elettrico risulta più snello e comprensibile, ma a fronte di qualche migliaia di righe di codice, si comincia a porsi il problema se l’applicazione richiedesse realmente l’utilizzo di un integrato così complesso.

Nei miei anni dedicati all’elettronica, sia come studente che come “addetto ai lavori”, ho imparato che la risoluzione di un problema è più rapida quanto più le informazioni in proprio possesso risultano ordinate. In programmazione, fin dalla nascita di questa branca dell’ingegneria, si è cominciato ad organizzare l’esecuzione di un software come blocchi di  un  diagramma che si susseguono gli uni agli altri, meglio conosciuto anche con il nome di "flow chart". Nei tempi moderni, decine di linguaggi di programmazione differenti, per migliaia di circuiti programmabili diversi, permettono di realizzare i propri dispositivi. Non tutti gli IC hanno le medesime caratteristiche, alcuni sono più adatti per taluni modelli di impiego, altri sono più veloci, ma spesso una cosa li differenzia sostanzialmente: il linguaggio utilizzato. Seppure la maggior parte può essere programmata in Basic, C o Assembly, ci si troverà sempre di fronte a qualche errore di sintassi, o di concetto, dovuto all’utilizzo di un linguaggio rispetto ad un altro. Nel mercato, svariati compilatori differenti si prendono l’onere di fare da “interpreti” tra il proprio linguaggio di programmazione preferito e quello dell’integrato in uso, fermo restando la compatibilità con la famiglia di integrati in uso.

E LA TECNOLOGIA RTOS

RTXC Quadros RTOS prodotto da Quadros system Inc è un innovativo sistema operativo per microcontrollori pensa to per dare al progetto in opera una organizzazione real-time. In grado di gestire prodotti anche a 32 bit, risulta versatile per codici basati su una linea temporale.

LA TECNOLOGIA RTOS

Un sistema RTOS, o anche sistema operativo in tempo reale, è un OS concepito per la gestione e la realizzazione di applicazioni con supporto in tempo reale. Tipicamente impiegati in campo industriale, in applicazioni di controllo, gestione o trasferimento informazioni, trovano largo impiego dove risulta necessario ottenere una risposta dal sistema entro e non oltre un tempo preventivamente prefissato. Questi applicativi non sono necessariamente veloci, e non danno importanza al tempo di reazione del sistema stesso, ciò che interessa è solamente la risposta all’interno di uno spazio temporale prestabilito, ovvero: la gestione del processo deve essere prevedibile in ogni sua parte. Un sistema real-time deve garantire che una procedura, Task, termini entro un prefissato vincolo temporale, Deadline. Per garantire ciò è richiesto che la lista delle operazioni sia fattibile, esonerando dal caso in cui due o più task si trovino in contraddizione tra loro. Questo concetto sta alla base dell’effettivo funzionamento di un sistema in tempo-reale, e viene lasciata al programmatore.

I CAVALLI DI BATTAGLIA DELL’RTOS

Risulta ben chiaro che, mentre con i circuiti “tradizionali” si riesce a realizzare qualsiasi tipo di applicazione, con gli IC RTOS ciò non è possibile. Una volta esaminata la problematica, e accuratamente avvallato l’ammissibilità di implementare un OS real-time, si sarà certi di poter pretendere dal sistema le seguenti peculiarità:

  • Ottima lista delle funzioni consecutive Tutti i Task sono organizzati secondo una linea temporale, in ogni momento, a fronte della lettura del tempo trascorso, si riuscirà sempre a risalire alla fase in esecuzione.
  • Condivisione delle risorse Non si necessitano di risorse elevate, in quanto le funzioni si susseguono le une alle altre, lasciandosi inutilizzate le porzioni di memoria precedentemente occupate. Garanzia di esecuzione: Ogni Task ha l’obbligo di completare il proprio lavoro all’interno del ciclo di vita. Una notifica o un eventuale arresto preventivo, permetteranno di agire tempestivamente a qualsiasi problema si verificasse durante la fase operativa.
  • Prevedibilità delle chiamate di sistema:
  • Il sistema deve essere in grado di valutare i tempi di calcolo di ogni task per determinare la schedulazione fattibile, quindi ogni chiamata di sistema deve avere un tempo di esecuzione massimo ben definito in modo da non introdurre ritardi indefiniti.

I FATTORI CHE MINANO LA PREVEDIBILITÀ

Si è analizzato nella parte precedente come la Deadline svolga una funzione importante per il corretto funzionamento del firmware. Il sistema coesiste perché il progettista ha ben chiaro quanto tempo viene impiegato da ogni parte del software, assegnando in questa maniera dei valori consoni al tempo massimo di vita. Mi capita spesso di assistere a discorsi in cui si disquisisce a riguardo di sistemi real-time, Windows, Mac e Linux. I vari sostenitori si trovano ad affermare le tesi per cui ognuno di questi sopracitati sistemi operativi sia real-time, mentre l’altro no. Ebbene una cosa è sicura: nessuno di questi lo è! Nel dare forza alle proprie affermazioni, spesso si perde di vista uno degli elementi cardine che definisce un OS real-time: la possibilità di prevedere con assoluta certezza il tempo di esecuzione di ogni singolo processo. In ambienti complessi quali Windows, Mac o Linux, la lettura di un dato nell’hard disk, la copia di una valore nel registro, la modifica di una variabile di sistema, sono elementi che non assumono una valore temporale certo, ma dipendono da fattori legati alla macchina stessa. Anche in ambito ridotto, quale i microcontrollori, ci sono tecniche di elaborazione che spesso forniscono vantaggi in applicazioni “normali”, ma devono essere ignorate o disabilitate in ambito RTOS:

Il DMA: il DMA, o meglio Direct Memory Access, è un artefatto hardware che dà la facoltà a porzioni del circuito di accedere direttamente alla RAM, sorpassando eventuali dispositivi in coda. In un ambiente real-time, questa tecnologia non trova impiego in quanto il tempo d’accesso e scrittura varia ogni volta. Si preferisce l’utilizzo del Timeslice, ovvero la condivisione a tempo della memoria.

La cache: la cache risente delle stesse problematiche descritte per il DMA. L’accesso richiede una quantità di tempo, seppure minima, ma difficilmente quantificabile che obbliga il programmatore a tenerla in considerazione. Visto che la maggior parte delle istruzioni non necessita una scrittura nella cache, si preferisce non usarla.

Le memorie di massa: le memorie di massa sono il vero neo di un sistema real-time. Sono obbligatorie quando si comincia a lavorare con quantità di dati consistenti e il loro accesso è sempre un’incognita temporale. Si preferisce usare modelli di scrittura quali la segmentazione o la partizione statica della memoria, che variano minimamente i ritardi.

Gli interrupt: Generati sia da parti esterne che interne al microcontrollore, gli interrupt hanno il compito di avvisare la CPU del ricorrersi di un prestabilito evento, interrompendo l’esecuzione del codice in corso e avviando la porzione di codice precedentemente assegnata per la gestione dell’avvenimento. Anche se un interrupt delle volte può risultare molto utile, in un sistema a tempo-reale è inutilizzabile, in quanto scombussola l’intera linea temporale precedentemente determinata.

La gestione dell’energia: queste tecniche sono implementate in tutti quei sistemi alimentati a batteria. Agendo nel clock della CPU, riducono la quantità di informazioni processate al secondo e di conseguenza la dissipazione elettrica. La variazione della frequenza di lavoro modificherà anche il periodo di esecuzione di ogni singola porzione di codice, spostando avanti e indietro la deadline. In un sistema real-time risulta logico non superare una scadenza, piuttosto che consumare poca energia, proprio per questo la gestione dell’energia viene spesso accantonata.

L’RTXC QUADROS RTOS

Il RTXC Quadros RTOS rappresenta una nuova generazione di sistemi operativi real-time, progettato da zero per garantire la sempre più crescente domanda di applicabilità e versatilità. Il cuore del sistema operativo RTXC Quadros è l’architettura dual-kernel, che può essere configurata per l’impiego in una moltitudine di contesti differenti. L’aumento della potenza di calcolo anche nel settore dei microcontrollori ha impegnato i tecnici Quadros nella realizzazione di un OS impiegabile anche in applicazioni complesse, con il risultato di un’ottima versatilità con MCU a 8 e 16 bit, con la possibilità di implementazione all’interno di microprocessori a 32 bit. Quadros RTOS è organizzato fondamentalmente in quattro kernel differenti per altrettante possibili categorie di applicazioni (vedi figura 1):

Figura 1: i quattro livelli di organizzazione del kernel

Figura 1: i quattro livelli di organizzazione del kernel

RTXC Multi-stack RTOS (RTXC/ms): il kernel RTXC/ms è pensato per quelle applicazione che richiedono una precedente scheduling delle task da utilizzare. In questo kernel, le porzioni di codice sono chiamate task, ognuna delle quali ha il proprio stack per le chiamate locali. Lo stack separato permette un rapido passaggio all’interno delle funzioni della porzione di codice, cercando di mantenere inalterato la quantità di tempo impostata nella deadline. RTXC Single Stack RTOS (RTXC/ss): l’RTXC/ss ha un’impostazione di programmazione classica, definita a singolo stack, in cui, tutte le chiamate del sistema, utilizzano il medesimo registro per le chiamate. Il kernel in questione risulta l’ideale per le applicazioni con poca disponibilità di memoria ROM e/o RAM.

RTXC Dual Mode RTOS (RTXC/dm): l’RTXC/dm, leggermente più complesso, è più versatile dei due modelli descritti in precedenza, in quanto combinazione di entrambi. Il programmatore può decidere di realizzare parti con la funzionalità a single-stack (o condiviso) e parti in multi-stack, riuscendo anche a dimezzare i tempi per ogni parte dell’esecutivo. RTXC Multiprocessing RTOS (RTXC/mp): questa categoria di kernel si indirizza verso l’architettura a multi-processore, sia con System-on-Chip (SoC) e DSP, che con un insieme di CPUs, MCU e DSP di tipo diverso. In collaborazione con il software PolyCore, questa tipologia di kernel realizza piattaforme multi-core in tempo-reale. RTOS è più di un solo supporto del multi-tasking, mette a disposizione un numero considerevole di opzioni definibili dall’utente, avvicinando il singolo integrato a ciò che più rispecchia le idee del progettista. Tutti i processori supportati avranno da parte dell’OS il più completo sostegno: gli indirizzi della cache, gli indirizzi del TCMs, la UART, i timer e la modalità a CPU multipla, ognuno verrà implementato correttamente e senza difficoltà.

IL QUADROS VISUALRTXC

La descrizione di un sistema real-time e del proprietario RTXC Quadros RTOS son state necessarie per riuscire ad affrontare VisualRTXC, l’ambiente di sviluppo visuale pensato e realizzato proprio per gestire rapidamente una programmazione di questo tipo. VisualRTXC è progettato per generare codice sorgente da uno schema ad albero (e viceversa), assistendo il progettista in tutte quelle fasi delicate che riguardano la messa in opera di una interfaccia: disegno di massima, flow chart, codice e documentazione. Il modello grafico permette di avere una visione d’assieme del progetto, intuitivo mediante piccoli disegni rappresentativi e note e pié di pagina.

I VARI LIVELLI DELL’APPLICATIVO

L’ambiente di sviluppo VisualRTXC separa la parte grafica, la gestione degli algoritmi, e la parte di codice in tre livelli distinti, ma permette a tutti di coesistere ed operare. Ognuno di questi tre livelli mantiene il proprio spazio all’interno della pagina del software, modificandosi consecutivamente quando l’utente effettua una qualsiasi variazione in ognuno di essi.

Il livello applicativo: il livello più alto tra i tre, è il livello applicativo che offre la schematizzazione della struttura del programma. In questa sezione l’utente lavorerà visualmente con le varie porzioni del kernel, come semafori o sirene, connettendo il tutto mediante cavi virtuali, rappresentanti i servizi del sistema operativo RTXC Quadros.

Il livello codice visuale: intermedio tra i tre livelli, il livello codice visuale descrive graficamente le informazioni mediante comuni simboli di uno schema ad albero. VisualRTXC genera automaticamente gli elementi che andranno a operare con la porzione di kernel. Per creare elementi in maniera autonoma, gli utenti potranno interagire con il menu options, selezionando icona, condizioni e cicli del nuovo oggetto. In caso gli strumenti in questa sezione non fossero sufficienti, è sempre possibile l’implementazione in codice C nella sezione Code Diagram.

Il livello codice testuale: Non accessibile direttamente all’interno della sezione di programmazione, troviamo il livello codice. Il programmatore avrà la facoltà di creare, attivare e modificare specifiche sezione di codice non implementate in RTXC, compilando il tutto con il VisualRTXC built-in text editor.

IL MENU PRINCIPALE

In aggiunta alle classiche opzioni presenti nel classico menu di Windows: File, Edit, View e Help, VisualRTXC include anche Project, Generate e Windows (vedi figura 2). Rispettivamente, permettono: definire le impostazioni del progetto, generare il codice sorgente e selezionare lo stile della finestra di dialogo. L’opzione Project permette di accedere alle stesse impostazioni che si avrebbero nella configurazione dell’RTXC Quadros RTOS.

Figura 2: l’ambiente di sviluppo, con il livello applicativo, il codice visuale e il codice testuale.

Figura 2: l’ambiente di sviluppo, con il livello applicativo, il codice visuale e il codice testuale.

TOOLBARS

VisualRTXC offre al programmatore una varietà di attrezzi utili allo sviluppo. L’apertura, la modifica, il salvataggio e la stampa del progetto potranno essere raggiunti facilmente anche mediante comode scorciatoie da tastiera. Ci sono sistemi per visualizzare in maniera personalizzata le varie parti dell’interfaccia del programma, organizzando le finestre in cascata o in porzioni di schermo. Di alta utilità, e disponibili in apposite icone, sono i tools personalizzati di VisualRTXC pensati per specificare mediante un click del mouse le connessioni tra codice e oggetti. L’opzione kernel service è automaticamente ristretta alla classe della funzione che lo invoca, eliminando una delle possibili fonti d’errore che si incontrano con la programmazione tradizionale.

FINESTRA DI LAVORO

La finestra di lavoro si compone di due modalità differenti di visualizzazione. Ogni spazio, Layer, è un elenco gerarchico organizzato ad albero che mostra i componenti fondamentali dell’ambiente in uso. La pagina Diagramma (Diagram), nel Layer View è una rappresentazione grafica dei vari strati di lavoro, mostrando il flusso dei dati e  la struttura dell’applicazione in opera. L’utente progetta i vari Layer inserendo oggetti dalla Toolbars descritta precedentemente, e mediante l’RTXC Quadros kernel object provvederà a collegare le varie strutture.

DEFINIZIONE DEGLI OGGETTI

Nel Layer Diagram l’utente potrà specificare se i propri oggetti sono di tipo dinamico o statico. Ogni oggetto statico avrà delle proprietà ben definite e fondamentali che dovranno essere specificate oppure lasciate di default. D’altro canto, gli oggetti dinamici vengono creati all’avvio dell’esecuzione del codice eseguendo appositi servizi nel kernel in uso. VisualRTXC supporta l’uso della dinamicità nella maggior parte delle classi.

CODE WINDOWS E CODE DIAGRAM

La vera parte di programmazione con la quale l’utente interagirà nelle parti del sistema, è rappresentata da queste porzioni dell’ambiente di sviluppo. Mentre con il Layer Diagram si avrà solamente una rappresentazione visuale del firmware, in queste sezione avviene la gestione temporale dei vari servizi annessi al progetto. Il Code Diagram (vedi figura 3) punta a raffinare le varie proprietà e funzioni delle singole Task o eccezioni specificate proprio nel livello superiore. Appare come un semplice flow-chart che accetta i simboli maggiormente usati in questi schemi. Ogni pezzo dello schema ad albero è definito mediante un’apposita sezione scritta in codice C. La sequenza delle operazioni comincia dall’alto e procede verso il basso, evidenziando il blocco in esecuzione con un contorno rosso. Nel caso si inserisse un blocco vuoto, si visualizzerà un rettangolo senza nessun descrizione, in maniera che l’utente provvederà mediante l’editor di testo compreso in VisualRTXC, ad implementare il codice necessario. La Code Windows, ovvero la sezione dove è contenuto tutto il codice in C, a differenza dei vari Layer e della sezione Diagram, non è accessibile direttamente dall’utente. L’unica possibilità per effettuare cambiamenti è proprio una modifica apportata al Code Diagram. Questa restrizione è importante se si pensa che una delle percentuali di errore più elevate durante una programmazione è causata da incongruenze nella sintassi. I file di intestazione, o header file (quel li con estensione .h), vengono automaticamente inseriti quando necessari, e in fase di compilazione conterranno le proprietà degli oggetti.

Figura 3: l’interfaccia della finestra code diagram.

Figura 3: l’interfaccia della finestra code diagram.

L’HELP

Il comodo Help disponibile nel menu principale è realizzato in maniera intuitiva, esauriente e comoda. Permette un’organizzazione alfabetica e una semplice ricerca dei lemmi al suo interno, l’unico neo è che le informazioni sono scritte in inglese. Al primo utilizzo verrà proposta la procedura di introduzione guidata che fornirà una panoramica generale al software, interrompibile in qualsiasi momento, ma sempre disponibile nel Help del menu principale.

CONCLUSIONI

La pratica e qualche codice di esempio sono caldamente consigliati per imparare a familiarizzare con l’ambiente di lavoro. I firmware creati con VisualRTXC si affacciano maggiormente verso la programmazione ad alto livello, anche se, adottando il linguaggio visuale o il C, non si levano all’utente tutti i pieni controlli dell’integrato in uso. Per chi fosse intenzionato all’utilizzo, o volesse semplicemente provare a sviluppare codici con VisualRTXC, è disponibile nel sito di Quadros una versione demo per 30 giorni con tutte le funzionalità.

Scrivi un commento

EOS