# Sistema di sviluppo

Per sistema di sviluppo s'intende l'insieme di strumenti (kit) software e hardware necessari alla generazione del codice macchina che deve essere eseguito dal processore (implementazione del software), al suo collaudo e messa a punto (debug).

## Descrizione

L'implementazione consiste nella stesura del programma in linguaggio Assembly o di alto livello, utilizzando un editor di testo generico o specifico per quel linguaggio. Una volta scritto il codice sorgente, se in linguaggio Assembly, deve essere assemblato, cioè tradotto nell'effettivo codice macchina numerico (generalmente esadecimale). La conversione viene fatta da un Assemblatore specifico per processore, o famiglia di processori. Se codificato in alto livello, il programma deve essere compilato, per mezzo di un compilatore (o, più esattamente, cross compiler) che lo converte prima in linguaggio Assembly, e quindi nell'effettivo codice macchina, in due passaggi successivi. Anche il compilatore deve essere specifico per processore, o famiglia di processori.
Nella maggior parte dei casi, la complessità delle funzioni di un programma per microprocessore, richiede la suddivisione in moduli funzionali (o sottoprogrammi). Ciascun modulo viene quindi assemblato in modalità rilocabile (ad indirizzi non determinati). L'incorporamento di tutti i moduli assemblati agli indirizzi definitivi, viene effettuato, in un'ulteriore passaggio, da un Linker, che genera il codice macchina definitivo (codice eseguibile), in un formato opportuno per essere trasferito nella memoria del processore target, ed eseguito.
La fase di debug consiste nell'esecuzione del software sul target, in condizioni quanto più simili a quelle reali di funzionamento (emulazione), verificando (in tempo reale) che il suo comportamento ad ogni evento previsto, sia conforme alle specifiche di progetto. Nel caso di errori o anomalie, il software viene corretto, un nuovo codice eseguibile generato e trasferito in memoria, per essere nuovamente verificato. Questo processo continua fino a che il programma non sia stato completamente collaudato. Successive fasi di validazione e verifica, possono richiedere ulteriori interventi sul software da parte dello sviluppatore.
Di base un debugger deve permettere:
* Il caricamento del codice eseguibile in memoria
* L'avvio e l'interruzione del codice eseguibile
* L'esecuzione di singole istruzioni (single step)
* L'inserimento di breakpoints, eventualmente condizionati a specifici eventi
* L'ispezione e modifica di variabili, dati e registri
* L'ispezione di parti del programma
Esistono due modalità di debug: tramite emulatore in-circuit (ICE) o tramite l'interfaccia di debug integrata nel microprocessore. Per entrambe le modalità sono disponibili ambienti integrati di sviluppo (IDE) per PC, che gestiscono tutte le fasi descritte, dall'editing al debugging in alto livello. Uno tra gli IDE più diffusi è Eclipse, e molti sistemi di sviluppo sono basati su sue versioni modificate (ad esempio Code Composer Studio di Texas Instruments per i suoi DSP con Architettura ARM).
In presenza di taluni Sistemi operativi, l'implementazione ed il debug del software possono essere eseguiti sulla stessa macchina per la quale il software viene sviluppato, come processi concorrenti, avvalendosi delle risorse messe a disposizione dal Sistema Operativo.