Home
Accesso / Registrazione
 di 

Colorate i vostri trace con le sequenze di Escape ANSI

tracelog_00_tn.jpg

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

 

 

Scrivi un commento all'articolo esprimendo la tua opinione sul tema, chiedendo eventuali spiegazioni e/o approfondimenti e contribuendo allo sviluppo dell'argomento proposto. Verranno accettati solo commenti a tema con l'argomento dell'articolo stesso. Commenti NON a tema dovranno essere necessariamente inseriti nel Forum creando un "nuovo argomento di discussione". Per commentare devi accedere al Blog
ritratto di hackboot

Il codice è errato non so

Il codice è errato non so come fate voi modesti a inventare codici così obsoleti, per i colori si definiscono le strutture dati giuste e si usano sequenze assembler per l'accesso alla memoria video la stessa printf è solo la chiamata ad un interrupt software che permette di stampare una stringa a video nel caso del dos è il 21h funzione 09h.

ritratto di slovati

Spiegati meglio

Hackboot, potresti essere per cortesia più preciso ed indicare dove e come il "codice è errato"? Questo codice non è stato "inventato", ma esiste da decenni (forse non hai avuto la "fortuna" di lavorare su un terminale VT100 a fosfori verdi o ambra...) e alla fine dell'articolo è riportato un link per chi volesse appronfondire l'argomento "sequenze di Escape". Inoltre, i trace "colorati" a cui si riferisce quest'articolo sono rivolti ai sistemi embedded, sui quali normalmente è sempre disponibile un'interfaccia di debug di tipo seriale. Hai provato il codice in oggetto su un sistema embedded (PIC like tanto per intenderci) con TeraTerm Pro come tool di comunicazione seriale? Sappi inoltre che le sequenze di Escape da tempo non sono più supportate dai sistemi operativi attuali (è inutile cercare di farle funzionare in ambienti di sviluppo su PC), ma questo non era l'obiettivo dell'articolo: a chi interessa colorare le printf se sta scrivendo codice in C/C++ per un PC?

Concludo dicendoti che la modestia (..."come fate voi modesti"...) è una grandissima virtù, non un difetto. Io, anche se ho studiato molto, mi ritengo comunque "ignorante" nel senso che ho sempre da imparare dagli altri (e da blog come questo) ed è proprio questo che rende la vita ed il lavoro interessanti.

 

 

Login   
 Twitter Facebook LinkedIn Youtube Google RSS

Chi è online

Ci sono attualmente 5 utenti e 75 visitatori collegati.

Ultimi Commenti