Un compilatore Ada per AVR

Ada è un linguaggio di programmazione nato per volontà del DoD (il ministero della difesa degli Stati Uniti) per impieghi su sistemi embedded in applicazioni di tipo militare. In seguito è stato utilizzato in svariati campi quali avionica civile, nei sistemi di controllo di volo, nella robotica…
Il linguaggio prende il nome dalla contessa Ada Lovelace, considerata la prima programmatrice della storia, e risponde, in modo stringente, ai requisiti di correttezza, sicurezza, manutenibilità e affidabilità.

CENNI STORICI

Perché il DoD impose l’uso di un linguaggio come  Ada?  Nel  1974  il  Dipartimento  della Difesa USA si accorse che i costi per lo sviluppo di software erano troppo elevati e la parte maggiore dei costi era dovuta ai sistemi “embedded”. Il Dipartimento condusse, poi, un’indagine sui vari linguaggi allora utilizzati. Da questa analisi si scoprì che due linguaggi erano maggiormente diffusi ognuno con la propria sfera d’attribuzioni: il COBOL per le elaborazioni gestionali e il FORTRAN per il calcolo scientifico e tecnico. Ma la cosa più interessante era il settore embedded. In quest’area il numero dei linguaggi era enorme: la situazione era davvero caotica.

Tutto  questo  provocava  una  dilatazione delle spese: dall’acquisto dei compilatori alle spese  di  manutenzione  e addestramento.  In una parola: nei sistemi embedded non esisteva una standardizzazione. A questo punto il Dipartimento decise di finanziare una ricerca volta a definire un nuovo linguaggio. In un primo momento si decise, in attesa di avere un unico linguaggio di programmazione, di approvare e introdurre alcuni linguaggi: CMS2Y, CMS2M, SPL/1, TACPOL, JOVIAL J3, JOVIAL J73 e, ovviamente, COBOL e FORTRAN. Il primo passo fu la creazione di un documento ufficiale di riferimento nel quale venivano esposti i requisiti: nel 1975 fu pubblicata la prima versione di Ada con la denominazione di “Strawman”. Il 1983, dopo varie fasi, il lavoro si concluse con la pubblicazione del manuale di riferimento: Language Reference Manual. Il linguaggio fu approvato anche dall’ANSI. I punti focali del linguaggio Ada possono essere così riassunti:

  • è un linguaggio fortemente tipizzato;
  • prevede una libreria di tasking system integrata con il linguaggio stesso;
  • il compilatore deve sottostare ad un processo di validazione per essere utilizzato;
  • è  supportato  il  concetto  di  modularità  e  di execption.

La distribuzione AVR-Ada è disponibile in codice sorgente e in forma binaria.

LA  DISTRIBUZIONE

L’obiettivo  della  distribuzione AVR-Ada è di utilizzare l’architettura base GCC (il compilatore GNAT). In  questa  versione  la distribuzione  ha le seguenti caratteristiche e/o limitazioni:

  • un Ada run-time system minimale;
  • una AVR support library;
  • il compilatore GNAT è basato su gcc.

Probabilmente la pecca maggiore di questa distribuzione è che l’Ada run time system (RTS) non è veramente un run-time system, ma è più un compile time system: la conseguenza di questo, è che il compilatore non supporta la gestione delle eccezioni e nemmeno un tasking system (e quindi un multithreading). Per compensare queste limitazioni, il compilatore dispone di una serie di utility che rendeno il suo uso abbastanza facile e immediato. Tali utility forniscono interfacce per l’accesso in eeprom, la gestione dei timing, la gestione delle periferiche come UART e molto altro ancora.

UN  PICCOLO ESEMPIO

Nel  listato  1  è  riportato   un esempio  scritto   in  Ada  che implementa  l’operazione  aritmetica  di  addizione  tra  due numeri.

with Ada.Text_IO,
     Ada.Integer_Text_IO;

procedure Somma is

  s : INTEGER := 0;
  N : INTEGER;

begin
  Ada.Text_IO.New_Line(Spacing => 2);
  Ada.Text_IO.Put(Item => “Dare un numero intero tra 1 e 1000: “);
  Ada.Integer_Text_IO.Get(Item => N);
  Ada.Text_IO.New_Line(Spacing => 2);

  if (N >= 1) and (N <= 1000) then
     for i in INTEGER range 1..N loop
        s := s + i;
     end loop;
     Ada.Text_IO.Put(Item => “La somma dei primi “);
     Ada.Integer_Text_IO.Put(Item => N, Width => 0);
     Ada.Text_IO.Put(Item => “ numeri interi positivi vale “);
     Ada.Integer_Text_IO.Put(Item => s, Width => 0);
  else
     Ada.Text_IO.Put(Item => “Il numero dato non e’ valido!”);
  end if;
end Somma;
Listato 1

Una volta scritto il programma per compilarlo dobbiamo utilizzare il comando

gcc –c esempio.adb

I programmi  scritti  in Ada hanno l’estensione .adb o .ads (almeno quelli della distribuzione GCC): i files con estensione .ads sono di solito gli Ada specification file, mentre quelli con .adb sono chiamati Ada body. Di  solito un  file  specification contiene dichiarazioni di variabili, di tipo, interfacce di procedure/funzioni  o  quant’altro  di accesso   globale,   mentre   la parte  body  sono,  di  solito,  le unità  di  programma  (il  body delle procedure e/o funzioni). Se ci sono errori in fase di compilazione, il compilatore produce un diagnostico sul terminale di uscita indicando la riga e la colonna dove  si  è  riscontro l’errore:

main.adb:4:06:”a”is undefined

dove 4 è il numero della riga, 06 è la colonna dov’è presente l’errore, e main.adb è il nome del file. Il messaggio “a” is undefined ci mostra l’uso scorretto della variabile “a” che è stata utilizzata ma mai dichiarata: come vediamo,  in Ada  la  diagnostica  è abbastanza precisa e completa. Se, invece, non ci sono errori in compilazione viene generato un file con estensione .ali L’operazione di linking, per produrre l’eseguibile, è attivata dal seguente comando:

gnatbl main.ali

a questo punto si ottiene il file eseguibile.

CONCLUSIONE

Questa distribuzione probabilmente non potrà essere utilizzata in applicazioni commerciali perché è ancora carente (forse ormai obsoleta), ma certamente rappresenta un valido strumento per iniziare a utilizzarlo in un sistema embedded. Questa distribuzione ha comunque il pregio di essere la prima Open per microcontrollori di fascia media piccola.

 

 

6 Commenti

  1. Giovanni Di Maria Giovanni Di Maria 6 ottobre 2017
    • Riccardo Ventrella Riccardo Ventrella 8 ottobre 2017
      • Riccardo Ventrella Riccardo Ventrella 8 ottobre 2017
  2. Riccardo Ventrella Riccardo Ventrella 8 ottobre 2017
  3. Giovanni Di Maria Giovanni Di Maria 8 ottobre 2017
    • Riccardo Ventrella Riccardo Ventrella 8 ottobre 2017

Scrivi un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *