Dal punto di vista dei compilatori C per PIC, il mercato offre veramente una moltitudine di prodotti, sia di fascia commerciale che gratuiti. Non c’è che l’imbarazzo della scelta e spesso l’utente, specialmente se principiante, può trovarsi in difficoltà nell’affrontare una simile scelta.
Per chi programma per professione spesso il criterio di scelta è dettato dalla disponibilità di documentazione aggiornata, del supporto tecnico nonché la qualità del prodotto, caratteristiche tipiche di un prodotto commerciale e molto rare in uno gratuito. E’ meglio utilizzare un compilatore gratuito o commerciale? In teoria un software commerciale garantisce un servizio di supporto tecnico, aggiornamenti ed altri servizi, ma può capitare che un prodotto gratuito sia tecnicamente più performante di uno a pagamento. Un consiglio valido ed efficace è quello di provare diversi compilatori utilizzando le versioni trial per quelli commerciali. Normalmente tali versioni sono limitate, ma sufficienti per la valutazione della bontà del prodotto. Il test dovrebbe essere eseguito su un grande numero e varietà di prove e di programmi, controllando le performance su svariati parametri, come i calcoli in virgola mobile, le librerie esterne e la gestione di dispositivi.
Cosa guardare in un compilatore
Un compilatore è un vero e proprio strumento di lavoro. Sono molte quindi le caratteristiche da guardare e da scegliere come preferenziali e, a volte, decisive. La scelta di un buon compilatore, quello che soddisfa tutte le proprie esigenze di programmazione, è spesso legata al risultato che si vuol ottenere. Se si utilizza un compilatore per creare piccoli prototipi o listati di estrema semplicità, qualsiasi tipo può andar senz’altro bene. Ma se le esigenze crescono e occorre ottenere il massimo dal prodotto, allora la scelta diventa molto più complessa e merita certamente una piena e ponderata meditazione.
Il costo
Una delle caratteristiche da guardare è ovviamente il prezzo. E’ universalmente noto che i prodotti gratuiti o molto economici sono i più desiderati. Anche perché, almeno nell’ambito informativo, il termine gratuito non è sempre sinonimo di bassa qualità. Anzi. Come detto prima, un’azienda che produce prototipi per la clientela, deve assicurare una grande professionalità e affidabilità nelle proprie realizzazioni. Questo obiettivo è raggiunto utilizzando mezzi estremamente sicuri e attendibili. Pertanto l’acquisto di un compilatore che soddisfi tutte le esigenze, prima tra tutte una buona assistenza tecnica, è di primaria importanza. Per i principianti e gli studenti il discorso è leggermente diverso. In questo caso è il budget a fare da padrone. La maggior parte di essi rivolge quindi la propria attenzione sui prodotti gratuiti. Per piccoli progetti sono spesso sufficienti anche le versioni di prova. Tali versioni hanno delle limitazioni che di solito riguardano il codice, ad esempio:
» Impossibilità di produrre un codice eseguibile HEX superiore ad una dimensioni predefinita (tipicamente 2K);
» Listati sorgenti limitati alle prime 30 linee di programma;
» Eseguibili prodotti senza alcuna ottimizzazione;
» Eseguibili prodotti con una pausa iniziale indesiderata che lo rende quasi inutilizzabile per scopi professionali;
» Limiti temporali nell’utilizzo dell’ambiente di sviluppo;
» Mancata implementazione delle variabili long e a doppia precisione, previste invece nelle versioni regolarmente acquistate;
» Molte funzioni avanzate (per esempio quelle relative alla gestione di LCD, RS232 o I2C) sono disabilitate;
» Documentazione tecnica completamente assente.
La velocità di compilazione
Un compilatore deve garantire una buona velocità di compilazione. Questo perché gli sviluppatori, nello scrivere il software, modificano e ricompilano il codice centinaia di volte e, in fase di compilazione, l’attesa potrebbe essere snervante. Se ad esempio un’applicazione ha richiesto 80 compilazioni per la messa a punto ed ogni compilazione ha impiegato mediamente 13 secondi, si deduce che per le fasi di compilazione sono stati impiegati (persi) circa 17 minuti. Per un’azienda è bene dunque affrontare anche questo aspetto nella scelta del prodotto. Naturalmente il più veloce compilatore non è detto che sia anche il migliore sul mercato.
Il Sistema Operativo
Tale aspetto è molto importante. E’ estremamente soddisfacente il fatto che il proprio compilatore possa funzionare su diversi sistemi operativi. Il fatto che il tecnico programmatore lavori in Windows o Linux non assume più alcuna importanza e ciò facilita anche la trasportabilità del lavoro da un sistema ad un altro senza particolari difficoltà.
Sistema di sviluppo
Esistono semplici compilatori che si limitano a prendere in pasto il listato sorgente e a produrne il relativo eseguibile, e null’altro. Vi sono poi compilatori, ben più complessi, che gestiscono il progetto in tutte le sue fasi ed in questo caso è più corretto parlare di ambiente di sviluppo. Solitamente un buon sistema di sviluppo prevede i seguenti tools:
» Possibilità di gestire un progetto;
» Editor di testo intelligente, in grado di riconoscere le parole chiave del linguaggio e i tipi di dato;
» Sistema completo di debug e test del codice;
» Convertitore tra vari sistemi di numerazione;
» Calcolatrice;
» Help in linea interattivo;
» Programmatore di MCU;
» Rappresentazione completa del codice Ascii;
» Editor di Ram e Eeprom incorporati;
» Possibilità di esportare il codice in vari formati (txt, pdf, html, ecc…);
» Emulatori o editor di displayLCD e GLCD;
» Emulatori di display a 7 segmenti;
» Tool di creazione caratteri personalizzati o immagini personalizzate;
I tipi di dati
Poter trattare vari tipi di informazioni, secondo le proprie esigenze, è un fatto molto importante. Si è detto prima che alcuni compilatori “in prova” non forniscono la completa gestione di tutte le tipologie di da to previste. Un buon compilatore pertanto dovrebbe dare la disponibilità, a seconda anche del tipo di microcontrollore utilizzato, dei tipi di dato dal punto di vista della memoria occupata da esso e dal range numerico previsto. Un classico compilatore C dovrebbe prevedere almeno le tipologie riportate nella tabella 1.
Naturalmente esistono compilatori che non adottano e prevedono alcuni tipi di dati, come ad esempio il tipo Long. In questo caso sarà l’utente a dover implementare un proprio sistema di creazione di numeri a 4 byte con la opportuna matematica per effettuare correttamente tutte le operazioni di storage e decodifica.
Il rispetto dello standard
Un compilatore che rispetta lo standard del linguaggio C (almeno quello ANSI) permette la completa portabilità del codice. Questo aspetto è estremamente utile, specialmente quando l’utente utilizza diversi compilatori. Rispettare lo standard quindi vuol dire che il proprio codice può essere compilato su diversi compilatori e su diverse piattaforme senza effettuare alcuna modifica del listato (almeno in teoria). Lo standard è spesso garantito se i propri programmi non sono particolarmente complessi e si limitano ad utilizzare il linguaggio nella sua forma più generica. Quando invece si cominciano ad usare funzioni personalizzate, librerie particolari rivolte all’utilizzo di display, memorie, protocolli di comunicazione e sistemi di conversione, tale standard tende a ridursi in maniera inevitabile.
Implementazione della ricorsione
La ricorsione permette ad una funzione di richiamare se stessa un numero finito di volte, fino al verificarsi delle condizioni di blocco. E’ una prerogativa di pochi compilatori e, in ogni caso, il sistema deve prevedere una gestione ottimale dello stack. Implementando le funzioni ricorsive si deve prestare sempre attenzione sia al numero di iterazioni che al numero di funzioni che la funzione stessa richiama.
Inserimento dell’Assembler
Questa possibilità, detta “Assembler Inline” è molto comoda, specialmente per chi conosce l’assembler. Permette infatti di scrivere normalmente un listato in linguaggio C, con la possibilità di inserire all’interno del codice C sezioni scritte nel linguaggio a basso livello. Questo è utile quando si devono indirizzare pochi valori direttamente a registri macchina, in modo da aumentare la velocità di esecuzione e di ridurre l’occupazione di memoria dell’eseguibile, o per eseguire parti di programma caratterizzate da particolari restrizioni temporali.
Esempi
Un compilatore corredato di molti esempi applicativi, semplifica notevolmente l’apprendimento delle tecniche di programmazione. Gli esempi infatti, specialmente se vari e numerosi, spiegano in dettaglio molti utilizzi pratici su diversi argomenti e studiarli approfonditamente vuol dire capitalizzare positivamente il tempo impiegato nella loro lettura. Solitamente i compilatori di buona qualità prevedono la presenza di esempi (anche se di ridotte dimensioni) che vertono su tutti gli argomenti della programmazione a microcontrollore, compresi gli utilizzi delle librerie personalizzate e la programmazione dei dispositivi.
Documentazione
Se un compilatore non è provvisto di documentazione, evitate di utilizzarlo. La documentazione costituisce infatti la risorsa più importante del programmatore e spesso è inutile cercare notizie su Internet o altre fonti alternative. Solitamente si tratta di documenti in formato PDF, CHM o HLP, ma molti prodotti prevedono anche il comodo e universale formato TXT, consultabile con qualsiasi programma. Nei compilatori comprensivi di tool di sviluppo, di solito la documentazione si trova in linea ed è contestuale alla posizione del cursore nell’ambito del codice sorgente.
Funzioni matematiche
Sono quelle che occupano gran parte della memoria del microcontrollore. Prevedono infatti la risoluzione di problemi matematici, il più delle volte a virgola mobile, per i quali il micro non ha supporto. Si tratta pertanto di ambienti per l’implementazione di una sorta di coprocessore matematico che inevitabilmente sfocia in una generazione di eseguibili di dimensioni enormi. Usate con molta cautela queste librerie, laddove siano previste. I più bravi potranno invece creare da soli le funzioni matematiche necessarie, cercando di ottimizzarle al massimo.
Funzioni per la RS232
Molto importanti sono le funzioni per la gestione del protocollo RS232, comprese le funzioni di invio e ricezione dati. Essendo ormai uno standard consolidato, anche se abbastanza datato, viene adottato da tutte le periferiche esterne e dai dispositivi anche più moderni. Un buon compilatore dovrebbe prevedere queste funzioni, anche se il loro utilizzo tende a lievitare la dimensione dell’eseguibile prodotto.
Funzioni per il ritardo
Le funzioni per la generazione di un ritardo sono sempre usate in un’applicazione. I ritardi sono spesso utilizzati in porzioni di codice in cui è prevista l’interazione con l’uomo. Nel valutare le funzioni di ritardo occorre considerare due aspetti fondamentali:
» La risoluzione minima, ossia il ritardo minimo gestibile dalla funzione;
» La precisione del ritardo, specialmente nei tempi brevi.
Utilizzare ambienti operativi capaci di generare ritardi con la massima precisione, permette la creazione di prototipi molto sofisticati. Un esempio? Come gestire un sistema di sincronismi TV, se il compilatore non permette di generare le pause con assoluta precisione?
Debugger
Anche questo costituisce un elemento presente nei compilatori di fascia. Non stiamo chiaramente a spiegare il significato e la funzione che esso ricopre, basti dire che si possono avere due diversi livelli di azione di un debugger:
» A livello di codice sorgente C;
» A livello di codice binario.
Di solito nei compilatori e sistemi di sviluppo è presente la prima categoria. Un buon debugger deve sempre premettere l’esecuzione passo passo, l’utilizzo dei breakpoint e la possibilità di consultare il valore delle variabili e dei registri di memoria in tempo reale.
Auto composizione di un progetto
Tramite la procedura di Wizard l’utente può creare un nuovo progetto in modo molto semplice in quanto le opzioni del progetto vengono selezionate automaticamente con l’autocomposizione. In questa fase l’utente viene guidato nella scelta del tipo di controllore, delle cartelle di lavoro, dei fuses dell’hardware e della velocità di clock del sistema.
Help contestuale nell’IDE
Un buon Help sensibile al contesto è sempre utile, naturalmente negli ambienti di sviluppo dotati di IDE. Infatti l’utente ha la possibilità di richiedere informazioni supplementari su un certo comando o la sintassi di una particolare funzione, semplicemente premendo (di solito) il tasto F1 sulla zona desiderata del codice sorgente.
Conclusioni
Questa rassegna di comparazioni ha permesso di illustrare le differenze sostanziali tra i numerosi compilatori C che esistono. La scelta di un buon compilatore è un passo a volte decisivo. Si può comunque raggiungere l’obiettivo di decretare quale compilatore soddisfa le proprie esigenze, dopo averli provati pesantemente con più applicazioni. Il nostro consiglio è allora il seguente: spendete molto tempo nella preliminare rassegna dei potenziali strumenti di lavoro e vedrete che alla fine tale fase verrà ampiamente ripagata sia in qualità che in soddisfazione.
Tabella 2, dovè?
Grazie per il commento. La tabella 2 non fa parte di questo articolo. Modificheremo la parte finale.
Nel corso dei vari anni ho provato tantissimi compilatori per PIC, sia commerciali, demo e freeware.
Devo dire che ho sempre trovato la soluzione ai miei problemi. Ovviamente i prodotti commerciali hanno sempre esaudito qualsiasi mia richiesta, ma anche nel campo del Freeware la qualità che si riscontra è davvero tanta.