Descript: un embedded scripting language

Descript è un tool tutto italiano per il controllo e la manutenzione di schede embedded. E' un ottimo strumento per scrivere routine di test e fare sessioni di debug on board liberando il progettista hardware dalla necessità di conoscere un linguaggio evoluto, come il C, o l'assembler: il linguaggio utilizzato in Descript è molto simile al basic.

Il tool Descript è uno strumento di lavoro open interamente italiano, ed è stato sviluppato partendo dall’architettura Motorola 68k (Freescale, ora NXP). Esistono porting anche per Coldfire e il suo nome deriva dalla fusione delle parole debug e script. Con Descript è fornito anche un BSP (Board Support Package), in questo modo è possibile portare il tool su differenti architetture o linee di comunicazioni. Il tool viene distribuito con tutti i sorgenti
secondo la licenza GPL.

Funzioni  predefinite

Descript dispone di cinque funzioni:

ABS(x) restituisce il valore assoluto di x.

RND(x) restituisce un valore pseudocasuale tra 1 e x.

SIZE(x) restituisce  il numero degli oggetti utilizzati nel programma, in questo modo informa l’utente della disponibilità di spazio nel suo buffer interno.

WRITEn address data scrive in memoria (in uno dei tre formati Long-word, Word o Byte) un valore in memoria (data) all’indirizzo specificato (address), in questo modo: writel 2000,4.

READn(address) Legge dalla memoria (anche in questo caso in uno dei tre formati Long-word, Word o Byte) un valore della dimensione richiesta dall’indirizzo specificato (address). Per esempio:

A = readL(1000).

Con lo script trace si ha la possibilità di controllare il flusso del programma, in questo modo è possibile controllare se l’esecuzione dello script risponde alle esigenze preposte.

Alcuni comandi

Rispetto ai compilatori, o alcuni interpreti, in Descript non è necessario dichiarare una variabile prima di utilizzarla. Infatti, è sufficiente assegnare alla variabile un valore senza dichiarazione, così:

A=234-5*6

A= A/2

X=A-100

@(X+9)=A-1

Per stampare sul terminale di uscita è necessario utilizzare  il commando Put con un argomento:
Put “Hello World” - stampa una stringa Put A - stampa la variabile A.
Quando si vuole stampare una stringa, Descript accoderà alla stessa l’accoppiata CR-LF (carriage return e line feed). Il commando complementare è Get, questo acquisisce un carattere dalla seriale di ingresso con: Get a. Quando il comando viene eseguito è visualizzato sul terminale di uscita il prompt, il nome della variabile, “A: “ e rimane in attesa di un carattere in ingresso. Nel listato 1 possiamo vedere un breve esempio.

10 put “Dammi un 5 “
20 get a
30 if a = 5 goto 100
40 put “Ti avevo chiesto un 5…”
50 goto 20
100 put “grazie”
140 end
Listato 1

Il commando call è utilizzato per richiamare una subroutine in assembler,  il suo argomento identifica l’indirizzo di memoria della subroutine: CALL 1000. La routine assembler può utilizzare tutti i registri del microprocessore, ma l’unica cosa che occorre tenere presente, al termine della sua esecuzione, è che deve restituire lo stack così come lo ha trovato in ingresso. Per  tor nare  a  Descript  è  necessario utilizzare l’istruzione <return to sub-routine> propria dell’assembler, per esempio <rts>. Con bye si restituisce il controllo ad un monitor residente o al sistema operativo. Con la coppia For e Next si esegue un ciclo iterativo. Un esempio tipico di questo comando è il seguente:

FOR X=A+1 TO 3*B STEP C-1.

La variabile x è inizializzata a A+1, la condizione di fine del ciclo è subito dopo l’istruzione To (3*B), mentre C-1 rappresenta la granularità dell’incremento di X. Con questa istruzione, Descript registra in un suo buffer di lavoro il valore della variabile X, il numero della linea e la posizione del comando. Quello che viene eseguito è il  corpo dell’istruzione, ed identificato tra For e Next. In caso di granularità a 1 non è necessario inizializzare il valore di Step. Nella coppia Repeat-Until, invece, la condizione d’uscita è espressa dopo il comando until. In ogni caso la tabella 1 contiene una lista dei comandi previsti da Descript.

Per fermare l’esecuzione del programma, o il listing sul terminale d’uscita, può essere utile far ricorso alla combinazione control-C sulla tastiera. Con control-S si sospende  il listing sul terminale d’uscita e per riprendere la stampa dei caratteri basta premere un tasto qualsiasi. Descript è in grado di gestire tre condizioni d’errore:

syntax erro r ; e sempio: 200 A=B+3, C=(3+4?. X=4

comando sconosciuto; esempio: 10

A=B*C?+2 il risultato dell’operazione  eccede il massimo consentito; 10 GOTO 400? la linea 400 non esiste; comando non eseguito; in questo caso potrebbe non esserci abbastanza memoria per eseguire l’operazione. Per esempio, il buffer interno è pieno. Insieme al messaggio d’errore viene anche visualizzato  il numero di linea e un punto interrogativo nella posizione in cui si è riscontrato l’errore. Esistono un gruppo di comandi che permettono di controllare la periferica di comunicazione: load, save, put e get. Con il comando save si ha la possibilità di immagazzinare in un file i programmi realizzati con Descript. In questa distribuzione lo script viene messo in un file, chiamato “a”, nella cartella c:\pppp.   Con l’uso, invece, del comando load si carica uno script da un file (chiamato “b”) e deve essere presente nella cartella c:\pppp. Gli script possono essere verificati utilizzando delle facility fornite da Descript: notrace, trace, step, break, nobreak. L’operazione inversa è notrace: l’opzione di traccia viene disabilitata. Un’altra possibilità per il debug è l’uso di step, con questo comando lo script viene eseguito una istruzione alla volta. L’ultima possibilità è il ricorso alla facility di breakpoint, in questo caso si ha la possibilità di  inserire un breakpoint su una qualsiasi linea del sorgente Descript o, viceversa, si ha la possibilità di disabilitare l’opzione. Si utilizzano, rispettivamente,  i comandi break e nobreak.

Eseguire Descript

Il tool Descript può essere messo direttamente in memoria non volatile o può essere lanciato da un programma residente o, ancora, attraverso l’uso di un sistema operativo. Dal sito della rivista è possibile scaricare una versione per il simulatore della Teesside: in questo caso, una volta messo in esecuzione  il simulatore (c:\e68k), è necessario utilizzare il comando Lo con il nome del file (lo descript) e successivamente  il comando go. Per uscire da Descript si utilizza il comando bye. Il  listato 2 mostra un esempio di Descript per la gestione di un interrupt.

10 put “esempio …”
20 event 8,100
….
100 a = a +1
120 e_evt
130 end
Listato 2

In questo esempio all’occorrenza di ogni interrputs, vettore 8, è eseguita la routine di Descript della riga 100 La gestione dell’ISR prevede l’incremento della variabile A e, subito dopo, il ritorno nel programma principale attraverso l’uso dell’istruzione e_evt.

 

 

Una risposta

  1. Giovanni Di Maria Giovanni Di Maria 4 dicembre 2017

Scrivi un commento

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