IDEAST10 è la proposta COSMIC per lo sviluppo e il testing di programmi C o assembler basati su microprocessori INFINEON C166 e X166. L'ambiente comprende un compilatore, un debugger e altre utilities per facilitare il lavoro del programmatore per sistemi embedded. Insieme all'ambiente cross è proposto anche un checker Misra.
Il compilatore è conforme alle normative ANSI e ISO per C; questo rende la proposta COSMIC interessante dal punto di vista commerciale: l’aderenza a questi standard garantisce l’ affidabilità del prodotto. Il compilatore cx166 è stato realizzato specificatamente per la famiglia dei microprocessori Infineon C166; attraverso uno switch di compilazione è possibile, poi, scegliere una particolare architettura. Il back-end è stato realizzato per sfruttare al meglio le prerogative del dispositivo. Sono inoltre forniti header file per le periferiche C166/XC166; in questo modo è possibile accedere e utilizzare le periferiche mediante l’uso di mnemonici. Un altro strumento presente in questa suite è la libreria di runtime utilizzata dal linguaggio C. Oltre alla forma binaria, è fornito anche tutto il sorgente per favorire le eventuali modifiche a fronte di richieste particolari. È chiaro che questa libreria comprende tutte le funzioni di supporto tipiche di un sistema embedded oltre ad essere perfettamente ROMable. La libreria include le funzioni di gestione dei caratteri, funzioni matematiche, la possibilità di formattare i messaggi sulla seriale di uscita (opzione indispensabile per utilizzare pienamente la printf), la gestione delle stringhe e quella della memoria. Cx166 consente anche di massimizzare il controllo della nostra applicazione scritta in C e di semplificare il nostro lavoro di programmazione. Tra le possibilità offerte dall’ambiente vale la pena di ricordare per esempio questi punti:
➤ Esiste la possibilità di inserire codice assembler in modalità in-line. Questo è consentito utilizzando _asm(), attraverso questa modalità è possibile inserire istruzioni assembler direttamente nel programma C per evitare sostanziali overhead di chiamate a funzioni assembler. Un’altra possibilità è di utilizzare le direttive #asm e #endasm.
➤ Un’altra possibilità offerta dal tool è di definire funzioni C come gestori di interrupts utilizzando la keyword @interrupt. Il compilatore della Cosmic permette di manipolare zone di memoria in modalità bit-field e selezionare i bit indipendentemente dalla loro posizione: da destra a sinistra e viceversa.
➤ È possibile associare ad un oggetto C, o ad una funzione, un indirizzo assoluto. Per fare questo è necessario utilizzare la keyword @<address>. La definizione dell’indirizzo deve essere fatta appena dopo la definizione del dato o funzione. Questa prerogativa è utile per i gestori di interrupt scritti in C o per definire zone I/O mappate in memoria (memory mapped I/O). Insieme al compilatore C, l’ambiente contiene un assembler, ca166, e un linker.
L’assembler fornito con IdeaST10 e un tool completo: supporta macro, consente di includere porzioni di codice o definizioni, è in grado di ottimizzare, produce codice oggetto in formato rilocabile o assoluto. L’assemblatore supporta la sintassi C per il preprocessore, quale #include e #define; in questo modo il file incluso può essere condiviso tra i moduli C e assembly. Sia il compilatore C, che l’assemblatore, producono codice oggetto con le informazioni di debug per ZAP. L’ultimo tool che abbiamo bisogno per generare il nostro codice eseguibile o rilocabile è il linker. Il linker della COSMIC, clnk, è in grado di combinare le informazioni estratte dai moduli assembler e C, dal file di libreria ottenuti da clib per creare un eseguibile finale nel formato desiderato. Il linker permette di generare un listing file; questo contiene informazioni su ogni singolo modulo presente nella nostra applicazione con la relativa occupazione di memoria.
Altri tool disponibili
A corredo di IdeaST10 ci sono una serie di tool che permettono di svolgere il lavoro del programmatore di sistemi embedded in maniera efficiente e veloce. Object Module Inspector e Absolute Hex File Generator sono due ottimi strumenti per la manipolazione dei file.
Object Module Inspector
Il nome di questo tool è cobj. Questo strumento di lavoro permette di esaminare librerie e file oggetti rilocabili per ricavare informazioni per la symbol table. Queste informazioni sono essenziali per aiutare il programmatore nella fase di debug.
Absolute Hex File Generator
Il tool chex trasla le immagini dei file eseguibili, prodotti dal linker di IdeaST10, in uno dei formati utilizzati dai comuni ICE (In-Circuit Emulator) o dai programmatori di EPROM. I formati supportati sono, per esempio, il formato Intel hex e S-Record della Freescale (ex Motorola, ora NXP). In questo modo è possibile portare a spasso il nostro programma e utilizzare i più comune ICE o aggiornare le nostre applicazioni dai vari clienti.
Utilities di debug
Un ambiente di cross compilazione che si rispetti deve avere una serie di strumenti che possono aiutare l’utente nel suo lavoro di debug quotidiano.
È utile, per esempio, disporre del listing di ogni singolo file e un mapping file dell’intera applicazione con tutti i riferimenti di memoria. Lo strumento che possiamo utilizzare per sopperire a questa esigenza, è, senza dubbio, clst. Infatti, con clst è possibile ottenere un listing di ogni programma C che noi abbiamo utilizzato al fine di ottenere l’immagine rilocabile o il file eseguibile. Un'altra utilità di cui abbiamo l’esigenza è cprd. Questo tool estrae e visualizza informazioni di ogni singolo file, per esempio gli argomenti delle funzioni.
Gestore di libreria
È possibile utilizzare il gestore di libreria, clib, per collezionare un gruppo di file in una libreria. Di solito uno strumento del genere è utilizzato per raccogliere file con funzionalità omogenea. Con clib è possibile creare e gestire la libreria o aggiungere e togliere moduli.
Zap
L’ambiente ZAP è un debugger integrato con IdeaST10 in ambiente Windows. La sessione di test può essere condotta sfruttando il source level debugger; in questo modo, è possibile verificare il programma direttamente in linguaggio C. Zap non è solo un debugger, ma è anche un ambiente di simulazione. In pratica è possibile provare il programma senza disporre immediatamente del target. Con la versione distribuita, liberamente utilizzabile, è possibile provare fino a 4 Kbytes di codice. Zap è direttamente integrato con il cross compilatore della COSMIC (dalla versione 3.3x) e, opzionalmente, con il kernel real-time RTXC.
ZAP Debugging Features
Il debugger ZAP fornisce una serie di facility adatti specificatamente per il mondo embedded. ZAP non è un debugger intrusivo, non permette, in pratica, la modifica del codice. Le informazioni di debug sono residenti sull’host, e queste sono prodotte utilizzando i vari switch presenti nel compilatore C e nell’assemblatore. L’interfaccia che presenta ZAP è del tipo source browsing, nel senso che è possibile passare da una finestra all’altra, quindi cambiare funzionalità, per interagire con i diversi strumenti che il debugger offre. È possibile, per esempio, mettere o togliere un breakpoint, nel codice o in memoria, senza per questo cambiare la finestra di lavoro: non esiste una finestra deputata alla gestione dei breakpoint. Attraverso l’interfaccia grafica è possibile gestire le variabili, monitorare zone di memoria, gestire i breakpoint nel kernel o quant’altro. Inoltre, ZAP consente di ottenere delle rappresentazioni grafiche sulle prestazioni del sistema analizzando il comportamento del codice nel tempo. La rappresentazione del tipo code coverage può essere fatta file per file o funzione per funzione. Le informazioni che possiamo ottenere ci permettono di valutare l’efficienza del codice, in questo modo possiamo modificare porzioni di codice per ottimizzare le prestazioni. Insieme all’analisi prestazionale, con ZAP è possibile attivare l’opzione di trace a livello di linguaggio C. Un’opzione del genere permette di tracciare la sequenza delle istruzioni C per monitorarne la sua esecuzione. Esiste poi la possibilità di registrare queste informazioni per poi, in seguito, fare un’analisi statica. Un’altra possibilità è il cosiddetto Time Line Chronograms, questa caratteristica consente di ottenere un diagramma di flusso temporale delle chiamate a funzioni o dell’uso dei task. È possibile anche monitorare le sequenze di interrupt, in questo modo otteniao le informazioni sul flusso temporale del programma in esecuzione con le relative interruzioni dell’applicazione. Un’opzione del genere consente di tracciare, in maniera efficiente, il programma alla caccia di bachi o di rapporti prestazionali. Le figure 1, 2, 3 e 4 mostrano come sono presentate queste informazioni.
Ma c’è di più, ZAP fornisce un vero e proprio linguaggio a comandi con la possibilità di intervenire sulla nostra applicazione in maniera diretta e immediata. ZAP è pienamente integrabile con il kernel RTXC, in questo ambiente è possibile condurre una sessione di debug sul kernel utilizzando ZAP come se il kernel fosse una generica applicazione; è possibile monitorare/manipolare le strutture del kernel stesso.
ZAP Configurations
ZAP è disponibile per quattro differenti ambienti di debug; per questa ragione ZAP è in grado di fornire supporto per tutte le fasi di sviluppo. Le scelte possibili sono: configurazione di simulazione, di monitor, Background Debug Mode e di In-Circuit Emulator. Tutte queste alternative condividono tutte la stessa interfaccia grafica e lo stesso insieme dei comandi; in questo modo diventa oltre modo agevole cambiare sessione di lavoro.
Simulator Configuration
Nella configurazione di simulazione, ZAP integra un simulatore della CPU con la piena possibilità di debug in C. In questo ambiente non è richiesto nessun hardware di supporto. Una simile configurazione è utile per verificare un algoritmo di lavoro o quando non si disponga ancora del target finale.
Monitor Configuration
Una configurazione di questo tipo è utilizzata quando disponiamo di un EVB (Evaluation Board) o di un prototipo di lavoro. Per lavorare in questa configurazione, occorre scaricare prima sul target, via seriale, un monitor. Dopo aver messo in esecuzione questo firmware on board, con ZAP si crea l’ambiente di debug. Background Debug Mode Configuration La modalità di BDM è una tecnologia che ha avuto inizio diversi anni fa ed è una funzionalità integrata nel chip e attivata secondo una particolare configurazione. Il BDM è, essenzialmente, una modalità operativa. Questa, insieme ad un set di istruzioni dedicate, permette di accedere al chip senza interferire con il programma in esecuzione. ZAP, secondo le versioni, si interfaccia alla porta parallela del PC o di una workstation mediante un idoneo cavo.
Advanced Topics
La proposta di COSMIC non finisce qui. La casa costruttrice offre una serie di possibilità avanzate per aiutare il programmatore ad ottimizzare il codice sorgente o a dargli maggiori strumenti in sede di verifica. In questa sezione approfondiamo questo aspetto.
C Level Trace
Con il C Level Trace si ottiene uno strumento che permette di registrare una sequenza di istruzioni C. Una volta registrata la sequenza desiderata, è possibile osservare l’andamento del codice attraverso il trace per rilevare situazioni anomali o per vedere l’esecuzione stessa. Per utilizzare il C Trace occorre eseguire questa procedura: Occorre de-attivare tutte le funzioni che vogliamo escludere dal trace. In questo modo, solo le funzioni attivate sono sottoposte all’operazione. Dal menu Analyzer occorre scegliere C Trace->Begin per iniziare la modalità di trace dalla linea C corrente. Per fermare il Trace occorre inserire un breakpoint nel posto desiderato. In alternativa, è anche possibile iniziare il trace con il comando Go Till. A questo punto occorre eseguire il codice utilizzando uno dei comandi previsti dal tool. Dal menu Analyzer occorre scegliere C Trace e Stop per fermare la registrazione Con il comando C Trace-> View è possibile vedere quello che abbiamo registrato.
Performance Analysis
Sotto questo termine si nasconde la possibilità di rappresentare in maniera grafica i cicli i MCU e la code coverage. La Code coverage può essere fatta file per file, oppure task per task. Esistono diverse viste e criteri di ordinamento. Per fare un’analisi prestazionale è necessario scegliere Performance->Zero. Con Zero si resetta il clock counter, con Performance>View, dal menu di Analyzer, si apre una finestra dove è mostrata l’analisi svolta.