Colorate i vostri trace con le sequenze di Escape ANSI

Avere la possibilità di lavorare con i sistemi embedded costituisce senza alcun dubbio un’esperienza significativa e ricca di soddisfazioni. Attraverso essa è possibile avere un controllo diretto su tutte le risorse hardware, programmando e debuggando il microprocessore come anche diversi tipi differenti di periferiche. I microcontrollori odierni sono molto potenti ed integrano un ampio numero di interfacce di comunicazione: a seconda del particolare tipo di modello, essi possono offrire un’interfaccia USB, un controllore Ethernet, interfacce SPI, I2C, CAN, LIN, e così via. Esiste tuttavia una “vecchia” ma tuttora utilissima ed economica interfaccia: l’interfaccia seriale (la versione più comune è la RS232). Essa è, e probabilmente sarà ancora per lungo tempo, il tipo più comune di interfaccia di debug adottata dai progettisti che si occupano sia di software che di hardware. Esistono numerosi casi in cui apparecchiature sofisticate e tecnologicamente avanzate sono vendute ai clienti con delle interfacce di comunicazione veloci ed efficienti, permettendo anche funzionalità avanzate come il controllo remoto (ciò avviene per esempio con le interfacce Ethernet che mettono a disposizione tool di connessione e trasferimento dati come ftp, telnet, SSH, e http). Ma se occorre eseguire il debug di un’applicazione, vedere cosa avviene durante la fase di power-on, controllare o modificare lo stato di un registro, tutto quello che occorrerà sarà un semplice collegamento seriale.

Lo scopo di questo articolo è quello di mostrare come sia possibile arricchire i trace su seriale aggiungendo un tocco di originalità e distinzione: il colore. I trace colorati sono molto utili, in quanto utilizzando un opportuno software di comunicazione (come ad esempio Tera Term Pro sotto Windows oppure minicom su Linux, entrambi freeware), è possibile assegnare un diverso livello di priorità (importanza) ai trace su seriale.

Ad esempio, una possibile strategia per assegnare colori diversi ad ogni tipo di trace potrebbe essere la seguente:

  • usare il colore di default (solitamente il nero) per I trace di tipo ordinario e comune – per esempio i trace generati durante la procedura di power-on oppure durante l’esecuzione di un comando impartito dall’operatore
  • usare il colore BLU per i trace relativi ad eventi o stati particolarmente significativi oppure poco comuni – per esempio i trace generati quando un timer scatta, quando viene rilevato un evento esterno, quando viene eseguita una procedura di debug, ecc.
  • usare il colore MAGENTA per i trace che indicano condizioni anomale riscontrate durante l’esecuzione dell’applicazione – un esempio potrebbe essere la generazione di un allarme o warning riguardante una particolare funzionalità del sistema, come per esempio un warning di battery low, oppure un warning relativo all’esecuzione della procedura di aggiornamento automatico del firmware
  • usare il colore ROSSO per i trace che indicano anomalie ed errori di priorità molto elevata – per esempio per riportare un allarme di over temperature, un errore riscontrato durante un’operazione di scrittura su memoria flash, un errore riscontrato durante l’accesso a periferiche esterne, e così via.

Ma come è possibile aggiungere i colori ai messaggi di trace inviati su interfaccia seriale? La risposta a questa domanda è molto semplice: basta utilizzare le sequenze di Escape ANSI, note anche come codici di Escape ANSI. Esse consistono in una sequenza di caratteri ASCII, sempre iniziata con il carattere di Escape ESC (1B hex) seguito dal carattere di parantesi quadra aperta (5B hex), e che definisce un codice alfanumerico che controlla una funzione del display o della tastiera. Affinché le sequenze di Escape ANSI siano interpretate ed eseguite, occorre impostare il programma di comunicazione su seriale in modalità di emulazione VT100 o VT52; quest’operazione è immediata su entrambi i tool TeraTerm Pro e minicom. Il modo VT100/VT52 è necessario perchè le sequenze di Escape ANSI sono nate per essere utilizzate su terminali di tipo testo (in passato questi erano ampiamente utilizzati per connettersi ai mainframe ed ai minicomputer).

In particolare, la funzione ANSI Escape impiegata per ottenere i trace su seriale colorati è quella denominate Set Graphics Mode. Il suo scopo è quello di modificare i colori e gli attributi del testo visualizzato sullo schermo; queste funzioni rimangono attive fino alla successiva occorrenza della funzione Set Graphics Mode.

La sintassi di questa sequenza di Escape è la seguente: ESC[Value;…;Value,m, dove Value può essere uno dei seguenti valori (le tabelle seguenti non sono complete, ma i codici omessi sono quelli scarsamenti supportati):

Attributi del testo

0 Tutti gli attributi off
1 Grassetto on
4 Sottolineatura singola (solo sui display monocromatici)
5 Lampeggio (lento) on
7 Reverse video on (foreground e background vengono scambiati)
8 Concealed on (poco supportato)

Colori Foreground

30 Nero
31 Rosso
32 Verde
33 Giallo
34 Blu
35 Magenta
36 Cyan
37 Bianco

Colori Background

40 Nero
41 Rosso
42 Verde
43 Giallo
44 Blu
45 Magenta
46 Cyan
47 Bianco

Il codice

Useremo per il codice il linguaggio C, probabilmente il linguaggio di programmazione maggiormente impiegato nello sviluppo dei sistemi embedded e in genere delle applicazioni firmware. I trace possono essere generati in C usando la comune funzione printf che, sui sistemi embedded, viene solitamente rediretta sul collegamento seriale. Prima di tutto, occorrerà introdurre le definizioni relative ai colori disponibili; nel fare ciò, applicheremo le sequenze di Escape precedentemente definite agendo in tre step (in C il carattere Escape può essere emesso con la combinazione di caratteri “\e”:

  1. emettere una prima sequenza di Escape con gli attributi testo off (il primo carattere successivo alla parantesi quadra aperta deve essere 0) e colore foreground impostato come richiesto
  2. emettere la stringa associata al trace
  3. emettere una seconda sequenza di Escape con gli attribute testo off ed il colore di foreground di default

Le definizioni sono le seguenti:
#define COLOR_OFF "\e[0m"
#define RED(text) "\e[0;31m" text COLOR_OFF
#define GREEN(text) "\e[0;32m" text COLOR_OFF
#define YELLOW(text) "\e[0;33m" text COLOR_OFF
#define BLUE(text) "\e[0;34m" text COLOR_OFF
#define MAGENTA(text) "\e[0;35m" text COLOR_OFF
#define CYAN(text) "\e[0;36m" text COLOR_OFF
#define WHITE(text) "\e[0;37m" text COLOR_OFF

Alcuni esempi di utilizzo:
printf(BLUE(“This is an example of a BLUE colored trace log\n”);
printf(RED(“Fatal error writing on flash sector %d\n”, 0x1234);
printf(MAGENTA(“Power-on procedure executed in %4.4X msec\n”, 0x0570);
Quella descriita in questo articolo è soltanto l’idea si base, ed ovviamente è possible introdurre ulteriori macro in modo tale da sfruttare tutte le altre sequenze di Escape disponibili.

Riferimenti

Sequenze di Escape ANSI

One Response

  1. slovati slovati 22 febbraio 2010

Leave a Reply