Tracing real-time su Cortex-M3

In questo articolo ci concentreremo sul Serial Wire Viewer uno strumento di tracing real-time proposto tempo fa da ARM per facilitare il debug di applicazioni sui microprocessori Cortex-M3.

Come ormai succede da molti anni l’obiettivo di ARM è di fornire a progettisti e sviluppatori dei microcontrollori sempre più potenti con funzionalità avanzate, ma che a corredo abbiano anche degli strumenti di debug efficienti e adeguati. ARM ha esteso il modulo EmbeddedICE di debug presente nei core ARM7, ARM9 e ARM11 con la nuova tecnologia di debug e trace on-chip chiamata CoreSight. CoreSight è utilizzata principalmente nei processori Cortex ed in particolare nel Cortex-M3. Nel dettaglio, un componente della tecnologia di debug CoreSight sarà il centro delle nostre attenzioni, si tratta del Serial Wire Viewer (SWV) che permette di realizzare un tracing real time.

Un pò di storia

Nel corso degli anni c’è stato un momento in cui gli emulatori in-circuit (ICEs) hanno portato la potenza degli strumenti di debug al loro massimo. Erano gli anni novanta e questi emulatori consentivano di interrompere e riprendere l’esecuzione del codice oltre che di eseguire un debug passo passo, eseguire del tracing sfruttando eventi complessi, inserire breakpoint illimitati ed altro ancora. Erano gli anni in cui dominava l’8051, gli emulatori utilizzavano un misto di chip standard e chip speciali progettati direttamente dal produttore delle MCU. Quando dei processori con più pin, cicli di bus più efficienti e soprattutto in grado di lavorare a velocità più elevate arrivarono sul mercato, gli ICEs si rivelarono inadeguati. I costruttori, ARM compresa, iniziarono ad inserire i moduli di debug all’interno dei chip e a renderli accessibili all’esterno attraverso l’interfaccia JTAG già presente su molti chip per le finalità di test. Oggi la JTAG è presente su quasi tutte le MCU. Rispetto agli ICEs l’unica caratteristica che si è persa in questa evoluzione sono state le funzionalità avanzate associate alla memoria di tracing, principalmente perché il debug non avviene più attraverso il collegamento diretto sul bus dati e sul bus indirizzi. Tutto questo, sommato alla crescente velocità dei dispositivi, ha generato un ritardo dei debugger nei confronti dei processori. Per poter portare tutti i dati di debug dall’interno all’esterno si sono fatte avanti soluzioni come simulatori o codice di debug, che però risultano intrusive facendo consumare alla CPU tempo e codice. Spesso si “consuma” una UART o un’altra interfaccia per la comunicazione dei dati di debug, ma il problema di esaminare lo stato della CPU per i sistemi real-time più sofisticati rimane un problema. Ovviamente questo ritardo dei sistemi di debug nei confronti dei processori ha causato enormi problemi ai progettisti le cui applicazioni erano a rischio bugs. Si percepiva chiara l’esigenza di portare i dati del processore fuori dal chip in tempo reale, con tanto di program counter, dati letti e scritti, registri interni, ecc... ARM fu una delle prime a fornire una risposta al bisogno degli sviluppatori.

ETM, Real-Time Trace

Alla fine degli anni novanta ARM realizzo ETM (Embedded Trace Macrocell) per visualizzare le informazioni di tracing. I dati venivano trasmessi su un bus dedicato a 4, 8 o 16 bit e catturati da un tool di debug. Questo tool esterno aveva bisogno di un hardware veloce per catturare tutte le informazioni che avanzavano alla velocità di elaborazione dell’ARM. Anche se ETM era una risposta alle esigenze dei progettisti, il costo risultava elevato e non tutti i processori della famiglia lo integravano. Gli ultimi processori Cortex-M3 della NXP, Toshiba e STMicroelectronics mettono a disposizione una porta di comunicazione ETM a 4 bit e (grazie alla tecnologia CoreSight) una porta Serial Wire Viewer. Per questi dispositivi Cortex-M3, l’ETM viene utilizzato per supportare le informazioni di debug a PC, mentre la porta SWV per leggere e scrivere dati cosi come se fossero degli eventi ad interrupt (vedi figura 1).

Figura 1: schema della tecnologia di debug per i processori Cortex.

Figura 1: schema della tecnologia di debug per i processori Cortex.

Serial Wire Viewer

Nella famiglia Cortex vengono impiegati I moduli di debug CoreSight che comprendono la porta JTAG, l’ETM, il Serial Wire Debug (SW-DB) e il Serial Wire Viewer (SWV). Non tutte le CPU della famiglia hanno l’ETM ma tutte hanno i restanti blocchi. Il Serial Wire Debug offre le stesse capacita di debug della JTAG ma con meno pin, infatti ne utilizza solamente due anziché da 4 a 7 come vuole la JTAG. Il connettore di collegamento per il SW-DB può quindi essere di dimensioni più ridotte rispetto alla JTAG a parità di funzionalità. Per esempio l’adattatore Keil ULINK2 USB-JTAG lavora con entrambe le metodologie di debug (figura 2).

 

Figura 2: adattatore Keil USBJTAG sulla board STM32.

Figura 2: adattatore Keil USBJTAG sulla board STM32.

Il SWV è simile ad una porta ETM a un bit. Un solo pin supplementare è necessario chiamato Serial Wire Output (SWO). I tre pin (SW-DB and SWO) condividono lo stesso connettore della JTAG. Andando al sodo vediamo cosa il SWV permette di fare al progettista, le informazioni fornite e le principali funzionalità sono riassunte di seguito:

» Campionare il valore del Program counter.
» Ottenere informazioni sui cicli di lettura e scrittura dei dati.
» Ottenere valori di variabili e periferiche.
» Memorizzare informazioni su contatori di eventi.
» Tracciare entrata e uscita dalle interruzioni.
» Timestamps e cicli di utilizzo della CPU.

Nessun codice di debug è necessario all’interno del programma e nessun ciclo di attesa è richiesto. La principale differenza tra il SWV e l’ETM è che quest’ultimo ha un throughput più elevato, ma il SWV può fornire un numero considerevole di informazioni di trace senza investimenti in un costoso hardware esterno. La Keil propone il RealView MDK-ARM (Microcontroller Development Kit) con il supporto del SWV senza costi aggiuntivi. L’MDK utilizza mVision3 e l’IDE (Integrated Development Environment) Keil, di seguito presi come riferimento per mostra re le funzionalità del SWV. La Keil propone anche il supporto ETM utilizzando l’adattatore Signum Systems JTAGJetTrace e il Segger J-Trace.

ITM, Instrumentation Trace Macrocell

Il blocco ITM visibile anche in figura 1, è utilizzato dal programma utente per scrivere dati sulla porta SWO. Questi dati possono essere visualizzati sia sul Trace Records che nella finestra del Serial Wire Viewer (figura 3).

Figura 3: finestre di Trace Records e del Serial Wire Viewer.

Figura 3: finestre di Trace Records e del Serial Wire Viewer.

Un esempio del codice per scrivere utilizzando l’ITM e mostrato di seguito, l’intrusione nel programma utente è veramente marginale. Basta scrivere all’indirizzo dell’ITM e il CoreSight automaticamente invia i dati alla porta SWO e il uVision li visualizza come in figura 3.

//Definisco il puntatore
#define ITM_Port32(n) (*((volatile un- 
signed long *)(0xE0000000+4*n)))
//Scrivo nella porta ITM
int SendChar (int ch) {/* Write to SWO*/ 
while (ITM_Port32(0) == 0); ITM_Port8(0) = ch;
return (ch);
}

Utilità delle trace

Le trace sia che siano realizzate con ETM o con SWV sono un potentissimo strumento di debug. Problemi che possono richiedere ore, giorni o addirittura settimane in progetti di grandi dimensioni possono essere individuate in pochi istanti grazie all’utilizzo delle trace. In maniera particolare quando l’effetto del bug si presenta molto tempo dopo o quando lo stato di sistema cambia velocemente. In generale l’utilizzo delle trace permette di rilevare possibili bug senza interrompere l’esecuzione del programma, senza utilizzare la tradizionale tecnica di debugging “stop and go”. In generale i problemi facilmente rilevabili grazie all’ausilio delle trace sono:

» Problemi ai puntatori.
» Istruzioni non consentite e data aborts (come per esempio scritture non allineate).
» Riscritture del codice, scritture inaspettate in memoria, corruzioni di stack
» Dati oltre i limiti, variabili e array non inizializzati.
» Stack overflow.
» Interpretare uscite o reset inattesi.
» Protocolli di comunicazione e problemi di tempistiche.
» Profiling del codice.

In aggiunta per i sistemi con RTOS, si possono tracciare il numero dei task, i semafori, i messaggi e le altre informazioni tipiche di un sistema operativo. Tutto questo senza interrompere il processore.

 

Conclusioni

Il Serial Wire Viewer fornisce un metodo a basso costo per ottenere le informazioni interne delle MCU grazie alla tecnologia ARM CoreSight. Per debug più approfonditi ETM rimane il punto di riferimento, ma per ricercare problemi occasionali attraverso il tracing, il Serial Wire Viewer rimane imbattibile per performance e facilità d’utilizzo, senza considerare il fatto di averlo immediatamente disponibile e pronto all’uso.

 

 

2 Commenti

  1. Stefano Lovati Stefano Lovati 6 marzo 2019
  2. Giordana Francesca Brescia Giordana Francesca Brescia 6 marzo 2019

Scrivi un commento

EOS-Academy