Automazione di Test di Sistemi Embedded Sintesi
Transcript
Automazione di Test di Sistemi Embedded Sintesi
UNIVERSITÀ DEGLI STUDI DI MILANO - BICOCCA Facoltà di Scienze Matematiche, Fisiche e Naturali Dipartimento di Informatica Sistemistica e Comunicazione Corso di Laurea Magistrale in Informatica Automazione di Test di Sistemi Embedded Sintesi Relatore: Prof. Mauro PEZZE’ Correlatori: Lorena SIMONI Giuseppe GORGOGLIONE Relazione della prova finale di: Carmine Carella matricola: 055465 telefono: +39 3294140513 e-mail: [email protected] Anno Accademico 2009-2010 Appello di Laurea 15 Luglio 2010 Introduzione I sistemi embedded sono sistemi di elaborazione progettati per una determinata applicazione e supportati da una piattaforma hardware dedicata. La loro diffusione è inarrestabile, le analisi di mercato mostrano che sono ormai presenti in ogni apparato sia in modo evidente, il cellulare e i PDA né sono un esempio, sia in modo trasparente come accade per gli elettrodomestici o le automobili. Questi sistemi sono una combinazione di hardware e software, tra loro fortemente integrati. Dal punto di vista hardware generalmente un sistema embedded è costituito da soluzioni single-chip che incapsulano molte funzionalità di un normale computer su un singolo dispositivo. Il software può essere molto diversificato, in base alla potenza computazionale dell’hardware. Nei sistemi con scarse risorse viene sviluppato, di solito, software ad-hoc dimensionato alla capacità di calcolo, invece nei sistemi che adottano hardware di classe superiore è possibile ospitare un sistema operativo e applicazioni, con interfacce utente evolute. Negli ultimi anni tali sistemi sono diventati molto complessi, ed il software contenuto in essi è diventato un elemento chiave, arrivando ad essere perfino più importante dell’hardware stesso, in quanto è la componente che permette di aumentare le funzionalità del sistema e di ottenere un minimo di flessibilità, in questi sistemi caratterizzati dall’essere poco versatili. Conseguenza diretta dell’evoluzione e della criticità del software, è la crescita della complessità e dell’importanza del processo di testing. Il testing è un processo costituito da diverse attività durante il ciclo di sviluppo del software e ha lo scopo di identificare e rimuovere i difetti per migliorare la qualità. L’automazione del testing attraverso l’utilizzo di strumenti permette di aumentare l’efficacia e ridurre il costo di questo processo che spesso è più della metà del costo totale dello sviluppo software. I sistemi embedded sono sempre più utilizzati in ambiti critici come quello avionico e aerospaziale in cui la presenza di un difetto all’interno del software può portare ad un fallimento del sistema e conseguentemente, compromettere la vita umana e provocare ingenti perdite economiche. Rispetto ad altri ambiti, quello embedded introduce requisiti di criticità nel sistema che hanno bisogno di maggiore attenzione. Il testing è uno degli elementi per garantire la qualità del sistema. Problema e Stato dell’arte L’ambito embedded introduce nuove sfide e problemi da affrontare. Esso ha delle caratteristiche peculiari che influenzano tutte le attività del processo di sviluppo. Il testing non è un’eccezione. Questo dominio estremamente complesso ha: un processo di sviluppo che considera sia la parte 1 hardware che la parte software del sistema; specifiche complesse; vincoli platform-dependent (cpu, memoria, consumo energetico, periferiche); requisiti di qualità molto stringenti; costi contenuti e vincoli di tempo che specificano un time-to-market molto breve. Inoltre, anche la caratteristica di specificità dei sistemi embedded influenza il testing. Ogni singolo settore applicativo richiede di prendere in considerazione aspetti talmente peculiari da rendere difficile l’identificazione di tecniche e strumenti di valenza davvero generale. La diretta conseguenza è lo sviluppo di approcci ad hoc. Ancora, l’utilizzo di uno strumento di automazione è vincolato da una notevole personalizzazione in cui vengono eseguiti adattamenti di basso livello all’architettura di uno specifico processore per rendere funzionante lo strumento. Data la complessità della personalizzazione, essa può concludersi con un successo o un insuccesso influenzando la raccolta e l’analisi dei risultati per valutare e migliorare la qualità. La letteratura sul testing del software, contiene innumerevoli metodologie, tecniche e strumenti che supportano il processo di testing di software tradizionale, ma esiste ancora poco per il testing di software embedded. Negli ultimi anni sono aumentati i lavoro accademici e industriali, ma questa è un’area di ricerca ancora da esplorare. Alcune domande attendono una risposta più precisa. Tra queste, quali sono i punti chiave del testing embedded?, in cosa differisce esattamente il testing embedded dal testing tradizionale? quali sono le soluzioni e gli strumenti da applicare?. Ad oggi, il testing di software di sistemi embedded è stato formalizzato solamente attraverso la creazione di tecniche e strumenti proprietari (molto costosi) e metodologie aziendali interne e di conseguenza non utilizzabili. Non esiste di fatto ancora un approccio generale, che inglobi al suo interno strumenti aventi licenze gratuite, e che raccolga pratiche comuni di test, attraverso le quali sia possibile garantire uno sviluppo software di qualità. L’ambiente di sviluppo del software embedded è diverso dall’ambiente di esecuzione, ovvero il software viene sviluppato su una macchina con risorse computazionali maggiori e architettura differente detta host, rispetto alla macchina detta target che coincide proprio con l’architettura embedded per la quale il software viene creato e sulla quale deve essere eseguito. Questa suddivisione porta ad avere due ambienti per il testing in cui applicare tecniche diverse per valutare requisiti di qualità differenti. Questi due ambienti, nel testing di software tradizionale, non esistono in quanto l’ambiente utilizzato per lo sviluppo è anche quello di esecuzione. Questa differenziazione porta al problema di definire la strategia di testing: quale test deve essere eseguito sull’ambiente host e quale sull’ambiente target? Un certo requisito di qualità deve essere valutato nell’ambiente giusto. Naturalmente questo andrà ad influenzare le tecniche di testing da utilizzare sia nell’ambiente host che nell’ambiente target. Il testing del software embedded nell’ambiente host, non evidenzia dif2 ferenze con il testing di software tradizionale. Nell’ambiente host vengono verificate le caratteristiche funzionali del software in esecuzione in un ambiente che simula la piattaforma reale, attraverso le tecniche di testing utilizzate anche nel software tradizionale: test di unità e test d’integrazione. Le maggiori differenze emergono con il testing nell’ambiente target che è effettuato in quanto bisogna considerare le dipendenze del software con l’hardware specifico per verificare che il codice operi correttamente sulla piattaforma sotto condizioni realistiche. Specialmente per i sistemi embedded è importante sviluppare tecniche e strumenti di testing per rilevare difetti nell’interazione tra hardware e software. In quest’ambiente devono essere verificate le caratteristiche funzionali del software, questa volta in esecuzione sulla piattaforma reale, dove le misure sono più affidabili, e le caratteristiche non funzionali che possono essere valutate soltanto in quest’ambiente con l’effettiva interazione del software con l’hardware dedicato. Obiettivi della tesi La prevalenza di approcci poco concreti nella scarsa letteratura sul testing di software embedded, e la presenza di approcci ad-hoc e proprietari in ambito industriale, evidenzia la mancanza di tecniche e strumenti utilizzabili in contesti differenti. Questo aumenta la necessità di un approccio generale attraverso il quale sia possibile garantire uno sviluppo software di qualità. La tesi fornisce un contributo in questa direzione, per superare i problemi di specificità del testing in questo dominio, attraverso la sperimentazione in una realtà industriale complessa e affermata, di tecniche e strumenti per il testing di caratteristiche funzionali e non funzionali di software embedded. La tesi studia alcuni problemi di qualità specifici e propone delle tecniche di testing che possono essere applicate nell’ambiente target per valutare classi di difetti rilevanti nei sistemi embedded. Inoltre, descrive l’adattamento e l’utilizzo di strumenti di automazione per applicare le tecniche, affrontando la scelta, in base a caratteristiche derivate dai vincoli imposti dall’ambiente sperimentale, la personalizzazione e l’analisi dei risultati. I risultati ottenuti dal lavoro di tesi possono essere riassunti come: • un insieme di informazioni sulla personalizzazione degli strumenti per la piattaforma ARM. Il lavoro svolto, può essere un’utile linea guida per personalizzare gli stessi strumenti su altre architetture. • un insieme di informazioni per la comunità open-source sul funzionamento degli strumenti e sulla presenza di problemi da risolvere per migliorare l’utilizzo sull’architettura specifica. • un insieme di risultati sperimentali, che convalidano le tecniche e gli strumenti di testing proposti. Il lavoro di tesi ha migliorato il pro3 cesso di testing utilizzato nell’ambiente sperimentale, aumentandone il perimetro, attraverso l’individuazione di aree di qualità non ancora esplorate e introducendo, per la valutazione di queste, strumenti di automazione che riduco i costi e i tempi del processo. Ambiente Sperimentale L’ambiente sperimentale della tesi è quello della divisione Automotive di STMicroelectronics (STM), la quale ha ideato una nuova famiglia di Systemon-Chip dal nome Cartesio con un alto livello di integrazione di device su un singolo chip. Il core è costituito dal microcontrollore ARM che permette il supporto per un vasto insieme di periferiche e interfacce di I/O. Comprende un GPS engine che lo rende un prodotto ideale per navigatori satellitari e per l’infotainment. Oltre al core viene effettuato lo sviluppo di board sperimentali che comprendono tutti i dispositivi e le interfacce con le quali il chip può interagire. La componente software è costituita dal porting del sistema operativo Linux per la piattaforma target, Baseport (BSP), che comprende principalmente lo sviluppo dei device driver necessari per la gestione dell’hardware specifico. Tutto questo costituisce un ambiente di sperimentazione del chip completo e funzionante utile per mostrare le funzionalità offerte ai committenti. Il processo di testing del BSP Linux era inizialmente costituito da test per la verifica del corretto interfacciamento del software con i device, principalmente test funzionali per le periferiche supportate dalla piattaforma. Con il lavoro di tesi sono state introdotte tecniche di test e strumenti di automazione per la valutazione di altre classi di problemi. Le tecniche di test individuate sono state applicate con l’obiettivo di valutare la qualità del codice platform-dependent. Ovvero dell’intero sistema operativo Linux l’attenzione del processo di testing è posta sull’area dei device driver, sviluppati per la gestione delle componenti hardware specifiche. Tecniche e approcci per il test Il processo di sviluppo di un sistema embedded considera le peculiarità sia dell’hardware che del software. Il testing, a sua volta, in una prima fase viene svolto separatamente per entrambe le componenti, e in una seconda fase si focalizza sulla verifica dell’interazione tra l’hardware e il software. La forte relazione tra queste due componenti del sistema embedded, in aggiunta alla presenza di vincoli real-time, rende pressoché impossibile sviluppare e testare il software indipendentemente dall’hardware su cui dovrà essere eseguito. Di qui la necessità del testing nell’ambiente target. Nell’ambito del progetto Cartesio, sono stati sperimentati approcci e tecniche per il testing in ambiente target, utili all’identificazione di classi di problemi di maggiore 4 importanza in ambito embedded, attraverso l’utilizzo di strumenti di automazione opportunamente selezionati, in base a diversi criteri individuati nell’ambiente sperimentale. Per ogni strumento è descritta in modo approfondito la personalizzazione, e in caso positivo l’applicazione e l’analisi dei risultati. Nell’ambiente target, le tecniche di testing sperimentate sono le seguenti. Test di copertura. L’analisi di copertura del codice per la verifica dell’efficacia dei test funzionali esistenti. Prestazioni del codice. Il profiling (function tracing) per la valutazione della durata delle funzioni nel processo di boot. Uso e gestione della memoria. Verifica dell’utilizzo della memoria da parte del software alla ricerca di problemi di memory leakage; Prestazioni di I/O su dispositivi a blocchi. Verifica delle prestazioni delle operazioni di I/O (lettura, scrittura) sui dispositivi a blocchi, disponibili sulla piattaforma target. L’analisi di copertura ha l’obiettivo di valutare l’efficacia dei test funzionali esistenti, in termini di quantità di copertura del kernel, identificando il cosiddetto dead code dei device driver platform-dependent, il codice che non viene esercitato durante l’esecuzione dei test. I risultati sono utili alla creazione di casi di test addizionali per esercitare il codice, quindi incrementare la copertura dello stesso e anche il livello di qualità dei device driver platformspecific sviluppati. Lo strumento scelto è Gcov. Gcov è un framework per l’analisi di copertura fornito dal compilatore Gnu Gcc. Il function tracing è una tecnica di profiling utilizzata nel caso specifico per valutare le prestazioni delle funzioni del kernel eseguite nella fase di boot del sistema. L’obiettivo è individuare le aree del processo di boot con i maggiori problemi di prestazioni, in particolare identificare le funzioni relative alla parte di codice platform-dependent eseguite nella fase iniziale del kernel, per poter intervenire e migliorare i tempi di boot, requisito importante in ambito embedded. Lo strumento utilizzato è il Function Duration Tracer che si basa sul framework di tracing di Linux, Ftrace. Il memory leakage è il principale difetto della classe degli aging-related bugs, relativo all’uso non corretto della memoria che provoca fallimenti del sistema. La causa principale di questi difetti è legata a errori di programmazione. Nei sistemi embedded, la limitata quantità di memoria fisica disponibile e il fallimento del sistema, che può avere conseguenze catastrofiche, rendono il memory leakage un problema su cui soffermarsi maggiormente in quest’ambito rispetto ad altri. Lo strumento utilizzato è kmemleak per la rilevazione nello spazio del kernel. La valutazione delle prestazioni di I/O (operazioni di lettura e scrittura) sui dispositivi a blocchi, periferiche con tecnologia a stato solido (Flash) 5 utilizzate come supporti di memorizzazione di massa nei sistemi embedded, ha l’obiettivo di individuare possibili problemi di efficienza nei relativi device driver, misurando le velocità di trasferimento dei dati. Lo strumento utilizzato in questo caso è IOzone. Risultati Per lo strumento di analisi di copertura, Gcov, la personalizzazione ha impedito l’utilizzo e la raccolta dei dati sulla copertura. In alternativa è stata effettuata un’analisi sulle cause, che ha portato alla scoperta di un bug relativo alla parte platform dependent ARM del compilatore Gcc, che esclude un problema nell’architettura stessa dello strumento. Le informazioni ottenute sono state pubblicate e inserite su Bugzilla Gcc, affinché i responsabili dello sviluppo del compilatore possano risolvere il problema e permettere l’utilizzo di Gcov anche sui sistemi embedded con architettura ARM. Il Function Duration Tracer, tra tutti gli strumenti, ha una personalizzazione che è la più difficile. Il risultato ottenuto è stato soddisfacente. Con i dati raccolti, infatti, abbiamo scoperto che la fase di boot del BSP kernel, può essere ottimizzata escludendo in fase di produzione del prodotto l’inizializzazione dei driver della porta seriale, un device che è principalmente utilizzato in fase di produzione per sviluppo, testing e debugging. Inoltre il lavoro è un contributo valido per l’integrazione diretta dello strumento nel framework Ftrace nelle future versioni del kernel e ha permesso di aggiungere al BSP il supporto per il function tracing. Kmemleak per la rilevazione dei memory leakage nel kernel, non ha avuto nessun problema per quanto riguarda la personalizzazione. Per mostrare l’utilità dello strumento abbiamo studiato e individuato i principali errori di programmazione che possono essere commessi nello sviluppo di un driver e che causano difetti di memory leak. L’applicazione dello strumento si basa sulla rilevazione di memory leak causati dagli errori identificati. Per Iozone, utile alla valutazione delle prestazioni di I/O, la personalizzazione è molto semplice. Lo strumento è stato utilizzato per verificare il miglioramento di prestazioni dei device driver tra release successive di sviluppo. In particolare è mostrata l’applicazione su una versione migliorata del driver MMC (MultiMedia Card). Organizzazione Tesi Il capitolo 1, è una breve introduzione al mondo dei sistemi embedded, presentandone le caratteristiche, fortemente condizionate dal settore applicativo, per poi delineare le principali differenze con i sistemi desktop e gli aspetti basilari da considerare nella progettazione. Saranno presentati, inoltre, alcuni dati di mercato che testimoniano la crescita del settore embedded nel 6 mercato globale, e in particolare il progresso che ha avuto in questo ambito lo sviluppo del software ed il suo utilizzo nei sistemi operativi open source, come Linux. In seguito, sarà presentata una delle principali architetture hardware e le caratteristiche del software utilizzato nei sistemi embedded. La parte finale del capitolo mostra le peculiarità, l’architettura e i principi di sviluppo dei sistemi Linux embedded. Il capitolo 2, introduce inizialmente le fasi del processo di testing dei sistemi embedded, focalizzandosi poi sulla fase di prototipazione e sul testing della componente software. Successivamente, delinea le differenze con il testing di software tradizionale. Vengono approfondite le tecniche di test che possono essere applicate nell’ambiente target. Vengono poi introdotti i livelli software di un sistema embedded, per identificare su quale concentrare maggiormente il controllo di qualità nel porting di un sistema operativo. Infine, viene descritta l’automazione del testing e la personalizzazione degli strumenti. Nel capitolo 3 è descritto l’ambiente sperimentale di STMicroelectronics. Inizialmente viene introdotto l’ambito automotive e il progetto Cartesio. Successivamente viene descritto lo sviluppo del sistema embedded, approfondendo l’ambiente utilizzato, e la componente hardware e software. Viene descritto, poi, il processo di testing e le tecniche adottate. Successivamente vengono delineati i punti di miglioramento del processo di testing, tra cui copertura di nuove classi di problemi e aumento dell’automazione. Infine sono mostrati i criteri utilizzati per la scelta degli strumenti, utili per effettuare il testing delle classi di problemi individuate. Il capitolo 4 è dedicato all’analisi dell’efficacia del test. Dopo una breve introduzione al code coverage, vengono descritti gli obiettivi dell’analisi di copertura nell’ambiente sperimentale e la scelta dello strumento. Infine viene fornita una descrizione approfondita di Gcov e della personalizzazione per l’architettura ARM. Il capitolo 5 è dedicato alla valutazione delle prestazioni del codice nella fase di boot del kernel. Vengono descritti gli obiettivi nell’ambiente sperimentale e la scelta dello strumento. Successivamente viene introdotto il framework Ftrace e descritto in modo approfondito il Function Graph Tracer, attraverso la personalizzazione per l’architettura ARM, l’utilizzo e l’analisi dei risultati sperimentali. Nel capitolo 6 viene inizialmente introdotto il software aging, e poi presentato il problema del memory leakage e le sue conseguenze. Successivamente, viene descritta la scelta dello strumento e in modo dettagliato il Kernel Memory Leak Detector (Kmemleak). Infine vengono analizzati gli errori, causa di memory leakage, che possono essere commessi nello sviluppo dei device driver e la rilevazione di questi da parte di Kmemleak. Il capitolo 7 è dedicato alla valutazione delle prestazioni di I/O sui dispositivi a blocchi. Vengono presentati gli obiettivi nell’ambiente sperimentale e la scelta dello strumento. Successivamente viene descritto IOzone e la per7 sonalizzazione per l’architettura ARM. Infine viene descritta l’applicazione per valutare un driver specifico e l’analisi dei risultati sperimentali. Infine l’appendice A, descrive in modo approfondito il processo di boot del kernel, focalizzandosi però sulla parte platform-dependent dell’architettura Cartesio. Questa appendice è di supporto in modo principale per il capitolo 6, ma anche per approfondire aspetti citati in altri punti della tesi. 8