Sistema di debug avanzato per Linux Embedded

Nuovo appuntamento con la rubrica Firmware Reload. Lauterbach consolida il sistema di sviluppo TRACE32 per Linux con la nuova versione PowerView per QT-Linux.

figura1: La soluzione Lauterbach per il debug di sistemi Linux embedded e Android.

Figura 1: La soluzione Lauterbach per il debug di sistemi Linux embedded e Android

L’esigenza di adottare architetture di CPU multi-core nasce dal tentativo di risolvere i problemi di consumo energetico e conseguente dissipazione di calore, che si presentano quando si aumenta la frequenza di lavoro di una CPU a singolo core. Inoltre, la tendenza tecnologica a ridurre la geometria di un chip aumenta sempre più i problemi di progetto, dovuti al manifestarsi di fenomeni parassiti (effetti capacitivi, correnti di dispersione, etc.). Una prima risposta a questi problemi consiste nel definire nuove architetture di CPU, dotate per esempio di super pipeline oppure di tipo superscalare. Nel primo caso si riduce ogni stadio della pipeline in unità più piccole. Nel secondo caso si aumenta il numero di pipeline facendole lavorare in parallelo. Questo tipo di soluzione comporta una serie di problemi, in particolare circa le condizioni di stallo della pipeline e della complessità della sincronizzazione. Un’altra tendenza è quella di aumentare le unità logico-aritmetiche (ALU), rendendo possibile l’elaborazione contemporanea di più istruzioni, ciascuna delle quali opera su dati diversi. Si parla in questo caso di architettura MIMD (Multiple Instruction Multiple Data).

Un’architettura MIMD a singolo core risulta comunque molto complessa a livello progettuale. La soluzione oggi comunemente più adottata per risolvere i problemi sopra citati è quella di sviluppare vere e proprie architetture multi-core, realizzando quindi diverse unità più piccole al posto di una sola più grande. In questo caso la complessità di progetto si sposta dal singolo core al sistema di comunicazione e di bilanciamento del carico di elaborazione dei core. Dal punto di vista energetico, la disponibilità di più core permette anche lo spegnimento temporaneo delle unità meno attive, che risulta molto più semplice rispetto allo spegnimento di singoli circuiti di un solo core. Inoltre, i core di una CPU possono anche essere realizzati in modo asimmetrico, dedicando ogni singolo core a un compito specifico. Non è raro il caso in cui una CPU multi-core sia composta da un’unità microcontrollore e da un DSP.

Nei casi in cui il bilanciamento del carico di lavoro non sia realizzato a livello hardware, la potenza elaborativa delle architetture multi-core può essere opportunamente sfruttata solo se esiste un supporto da parte di un sistema operativo. Il multiprocessing può quindi essere classificato in due modi: sono possibili soluzioni asimmetriche (AMP, Asymmetrical Multi Processing) in cui l’assegnamento dei task a un singolo core è definito univocamente in fase progettuale; oppure soluzioni simmetriche (SMP, Symmetrical Multi Processing) in cui ogni task è assegnato a un core dinamicamente, da parte di un sistema operativo SMP, sulla base di politiche di assegnamento definite nel sistema operativo stesso. In questo caso tutti i core devono essere dello stesso tipo.

figura2: Per il debug di sistemi AMP viene avviata una singola istanza di TRACE32 per ogni core.

Figura 2: Per il debug di sistemi AMP viene avviata una singola istanza di TRACE32 per ogni core

 

figura 3: Per il debug di sistemi SMP una singola istanza di TRACE32 controlla tutti i core

Figura 3: Per il debug di sistemi SMP una singola istanza di TRACE32 controlla tutti i core

 

figura 4 Il trace di sistemi AMP viene visualizzato su GUI distinte. È comunque possibile sincronizzare le diverse interfacce.

Figura 4: Il trace di sistemi AMP viene visualizzato su GUI distinte. È comunque possibile sincronizzare le diverse interfacce

DEBUG AMP E SMP

Lauterbach supporta il debug di sistemi AMP mediante istanze separate del software TRACE32, una per ogni core. Ciò consente di gestire opportunamente CPU contenenti diverse architetture di core. È, tuttavia, possibile fermare o avviare contemporaneamente le applicazioni in esecuzione sui diversi core, che spesso operano interagendo fra loro. Invece, per il debug di sistemi SMP, Lauterbach fornisce una singola istanza del software TRACE32 in grado di controllare tutti i core. L’interfaccia utente mostra di volta in volta le informazioni di interesse per il debug di un’applicazione, riconoscendo autonomamente il core su cui è allocata. La visualizzazione può comunque essere spostata su un altro core. L’assegnamento dei breakpoint è risolto posizionandoli su tutti i core, poiché non è possibile sapere a priori su quale core sarà in esecuzione l’applicazione al momento del breakpoint. Quando un core si ferma a un breakpoint, anche gli altri core vengono fermati. Se il programma è riavviato, tutti i core ripartono insieme.

figura 5: nei sistemi SMP si utilizza una sola shared memory per memorizzare i dati di trace di tutti i core.

Figura 5: Nei sistemi SMP si utilizza una sola shared memory per memorizzare i dati di trace di tutti i core

 

Figura 6: E’ possibile rappresentare in forma grafica i dati di trace, distinguendo in base al core di esecuzione.

Figura 6: E’ possibile rappresentare in forma grafica i dati di trace, distinguendo in base al core di esecuzione

TRACE AMP E SMP

Il trace real time di un’applicazione permette di rilevare rapidamente e sistematicamente condizioni di malfunzionamento particolarmente complesse, che si verificano solo in condizioni run-time. È, inoltre, possibile ottenere informazioni statistiche, come l’analisi di copertura del codice eseguito e, avendo a disposizione anche informazioni sul tempo di esecuzione, il profiling della durata delle singole funzioni, in modo da verificare la corrispondenza con eventuali requisiti temporali. Molti sistemi rendono disponibile anche il trace di dati di interesse dell’utente, ad esempio l’informazione sul processo correntemente in esecuzione in un sistema operativo multiprocessing. Lauterbach realizza il trace di sistemi AMP in modo indipendente per ogni core. Ogni singola istanza del software TRACE32 permette di visualizzare le informazioni di trace del core corrispondente. È comunque possibile sincronizzare le diverse viste grazie all’utilizzo di un unico riferimento temporale. Invece, nei sistemi SMP, Lauterbach utilizza un’unica memoria di trace condivisa fra tutti i core. È quindi possibile visualizzare le informazioni di trace contemporaneamente per tutti i core, oppure distinguendo fra i singoli core o addirittura per singoli task.

Figura 7: L’awareness di Linux permette di esaminare l’utilizzo delle risorse del sistema operativo, come ad esempio i task in esecuzione

Figura 7: L’awareness di Linux permette di esaminare l’utilizzo delle risorse del sistema operativo, come ad esempio i task in esecuzione

LINUX AWARENESS

Il riconoscimento delle strutture dati rilevanti di un sistema operativo e dei suoi meccanismi di gestione delle risorse (awareness) permette a un debugger di offrire all’utente funzionalità avanzate di controllo del software. Nel caso di Linux utilizzato su sistemi embedded, i debugger Lauterbach forniscono un’integrazione molto sofisticata con il sistema operativo, in grado di mostrare le condizioni di utilizzo delle principali risorse allocate. Per garantire queste funzionalità, l’awareness riconosce la configurazione dell’MMU del processore, sapendo che Linux opera in uno spazio di memoria virtuale. Si noti che il meccanismo di demand paging di Linux comporta che un’applicazione possa essere fisicamente non presente in memoria, fintanto che le singole pagine contenenti istruzioni o dati non vengano richieste per l’esecuzione. Il supporto a Linux in Lauterbach permette di effettuare il debug di un processo utente a partire dal suo avvio. Se il processo utilizza librerie dinamiche (shared objects) Linux le carica nello spazio di indirizzamento del processo.

Occorre tenere presente che anche le librerie dinamiche vengono caricate da Linux nel momento in cui le loro istruzioni sono utilizzate per la prima volta. Con i debugger Lauterbach è inoltre possibile il debug dei threads che compongono un processo. In questo caso è sufficiente caricare una sola volta le informazioni simboliche associate al processo. Il kernel di Linux è compilato in modo da consentire il collegamento di moduli aggiuntivi, che possono essere caricati dinamicamente. Con Lauterbach è possibile effettuare il debug di un modulo a partire dalle funzioni di inizializzazione. È inoltre facilitato il debug delle eccezioni di segmentation violation, mediante l’assegnamento dei breakpoint necessari per identificare l’eccezione e la possibilità di caricare temporaneamente i registri del processore con lo stato macchina che ha provocato l’eccezione, così da facilitare l’analisi del problema. Al momento in cui l’esecuzione viene ripresa, vengono ripristinati i registri originali. È anche possibile associare dei breakpoint a un singolo task ed eseguire per un singolo task il trace del flusso di programma. Nel caso in cui il processore fornisca funzionalità di trace dei dati, è possibile tracciare il cambio di contesto dei singoli task, con il supporto del sistema operativo.

Figura 8: Soluzioni realizzative per la GUI TRACE32 con diversi Look & Feel.

Figura 8: Soluzioni realizzative per la GUI TRACE32 con diversi Look & Feel

INTERFACCIA GRAFICA

La GUI PowerView di TRACE32 è disponibile su diverse piattaforme host: PC Microsoft Windows e Linux, sia a 32 bit che a 64 bit, MAC OS-X, workstations HP/SPARC. La GUI per Linux è stata originariamente sviluppata su librerie Motif, in conformità alla diffusione di questo standard negli anni passati. Ma attualmente molti produttori si stanno ormai orientando a soluzioni più moderne, come GTK+ o Qt. Anche Lauterbach, pur mantenendo la distribuzione del prodotto TRACE32 con GUI Motif, a partire da novembre 2012 ha iniziato a rilasciare un’interfaccia grafica PowerView basata su framework Qt.

La GUI può essere configurata per operare in MWI (Multiple Window Interface), con finestre e box di dialogo indipendenti dalla finestra principale di avvio, oppure in MDI (Multiple Document Interface), con elementi grafici liberi di muoversi solo all’interno della finestra principale. E', inoltre, personalizzabile in molti modi: abilitando o disabilitando statusbar e toolbar; posizionando la toolbar o la command-line in zone diverse dello schermo; aumentando o riducendo la dimensione degli elementi di un dialog. E’ anche possibile modificare lo stile della GUI, selezionando uno fra gli stili predefiniti oppure con Look & Feel Windows, CDE, Motif. La GUI può utilizzare qualunque font a larghezza fissa già installato. Con la realizzazione di una GUI Qt, TRACE32 raggiunge in ambiente Linux prestazioni confrontabili con quelle già fornite su host PC Windows, non solo in termini di resa grafica, ma anche come funzionalità generali disponibili, soprattutto nei menu contestuali.

Scarica subito una copia gratis

Scrivi un commento

Send this to a friend