Filosofia software 1
(ovvero "la dove il soft si incontra con l'hard")
Chi è abituato a lavorare con circuiti digitali in logica cablata (porte logiche, contatori ecc...) al primo impatto "pratico" con il mondo dei microprocessori si può trovare un po' perplesso.

Nei vecchi circuiti è molto semplice capire come un segnale in ingresso percorra una serie di porte o stadi e giunga in uscita opportunamente elaborato o trasformato. Il circuito è "pensato" e costruito proprio per svolgere la funzione voluta. Questo vale per i circuiti logici, ma anche per quelli analogici (amplificatori ecc...) e perfino per quelli a relè... cambiano le tecniche e i componenti, ma il principio base della logica cablata rimane: la funzione da svolgere e la costruzione del circuito sono strettamente e rigidamente legati. Ogni stadio fisico rappresenta un passo in avanti per ottenere il risultato desiderato, ed è tutto li insieme, perfettamente visibile e rappresentabile con uno schema a blocchi.

Davanti a un sistema a microprocessore ci si trova invece di fronte a delle porte di ingresso/uscita, qualcosa entra da un ingresso e si trasforma in fantomatici bit, "sparisce" in un mare di segnali di indirizzamento, abilitazioni, dati che passano da un punto all'altro cambiando continuamente, e alla fine da un'uscita "emerge" il risultato voluto. Si perde il legame quasi "visivo" del nostro segnale, non si vede più chiaramente dove vada a finire e cosa faccia, e neppure da dove e come arrivi il segnale in uscita. Si sa solo che avviene una certa misteriosa elaborazione di un programma che si prende carico di tutto.

A mio avviso il nocciolo della questione sta proprio qui: voler ancora pensare in termini di circuiti hardware lo studio delle funzioni che si vogliono realizzare. Anche se non è del tutto sbagliato, è un po'fuorviante pensare ancora che sia il segnale esterno ad "introdursi" nei meandri del processore ed avviare una serie di reazioni che alla fine producono l'effetto voluto. Quando si pensa alle funzioni da realizzare non si dovrebbe porre il microprocessore, inteso come hardware, al centro dell'attenzione, di esso dovrebbero essere considerate solo le risorse che mette a disposizione (spazio di memoria, velocità, porte di I/O, capacità di gestire gli interrupt ecc..).

A mio avviso le cose si semplificano molto facendo un salto di livello, e portandosi ad una maggior astrazione da quello che è il supporto materiale che esegue fisicamente le operazioni, la parola chiave secondo me è PROCESSO.

Quando un processore esegue un programma si crea un processo attivo che evolve nel tempo, questo processo è proprio la funzione che si vuole ottenere, è il succo, è quello che circuitalmente si realizzava con i diversi stadi di logica cablata tradizionale. Da questo punto di vista io preferisco definire il processore un semplice infaticabile e stupido "tritabyte", che serve solo per far funzionare un processo. La CPU "non ha la minima idea" di quello che sta facendo, non può neppure sapere se sta eseguendo istruzioni che hanno un senso oppure no. Legge dalla memoria e quello che arriva esegue, sempre e comunque. Anche se non c'è collegata nessuna memoria, o se sul BUS arriva solo rumore (bit a caso), per la CPU sono istruzioni effettive e le tratta come tali.

Sta al progettista hardware collegare una memoria funzionante, e al programmatore software riempirla con sequenze sensate di istruzioni, solo a quel punto il nostro "tritabyte" farà "vivere" un processo.

L'attenzione va focalizzata sul processo, è "lui" che sa cosa deve fare con lo stato di un pulsante, è sempre lui che sa che deve accendere una lampadina o fare qualsiasi altra cosa. Naturalmente può farlo solo attraverso le risorse fisiche disponibili (le risorse di I/O collegate) e inoltre deve essere composto da quei mattoncini elementari che sono le istruzioni assembler.

Il programma in questo senso è visto come una serie di piccoli passi che noi vogliamo che il sistema esegua per realizzare il processo voluto. Una volta il circuito era tutto, adesso metà di esso è virtuale, e viene descritto via software. Il processore serve solo per rendere "attiva e reale" questa descrizione.

Ecco che possiamo tornare alle affermazioni di prima: dove va a finire il segnale che entra in una porta di ingresso? Il segnale non entra! E' il processo che lo "guarda" attraverso la porta, lo sente come un bit e decide cosa fare. E' il processo la causa di tutta l'attività, è lui che sa cosa si deve fare e quando. Processore e memorie servono solo a farlo "vivere", le porte di I/O sono i suoi "occhi" e le sue "braccia".

Pensando in questo modo, processore e memorie in un certo senso svaniscono, e rimane solo un processo attivo che può interagire con il mondo attraverso dei fili. Il punto di contatto tra il soft e l'hard (tra il processo e le tensioni fisiche sui fili) sono le istruzioni IN e OUT. Un processo è infatti chiuso e isolato nel suo mondo soft, fatto di registri, bit e celle di memoria. Con un'istruzione OUT può però "materializzare" il valore soft di un registro (i bit), facendolo comparire come tensioni su una porta di uscita. Allo stesso modo può acquisire il valore logico delle tensioni da una porta di ingresso con l'istruzione IN. Tutta l'elaborazione viene poi fatta su bit o numeri in memoria, che rappresentano ciò che è presente a livello di tensione sulle porte di I/O. Con IN e OUT abbastanza frequenti si mantiene aggiornata la rappresentazione interna con la realtà esterna, e si può quindi parlare di un sistema di controllo real time.

Il processo incorpora e rende funzionante l'idea del programmatore, la logica cablata diventa così "immateriale" o "virtuale" (seppur materialmente ben presente sotto forma di cariche elettriche nelle celle di memoria), e di essa rimangono solo le appendici iniziali e finali, i fili di ingresso uscita. Si può dire che il processore effettua una simulazione funzionante della logica, al punto da poter ritenere del tutto indistinguibili la simulazione dall'effettiva presenza della logica cablata.
 
Controllo hardware tradizionale, tutta la logica di funzionamento è contenuta nella rete di controllo cablata sulla destra. 

Qui sotto vediamo un sistema di controllo a microprocessore: il processo simula a tutti gli effetti le funzionalità delle rete precedente. Attraverso le porte di I/O vi è il collegamento virtuale tra il sistema da controllare e la rete simulata.

Naturalmente limitare un processo a semplice "sostituto" di una rete a logica cablata, sebbene sia già molto più flessibile nelle modifiche, è ancora limitativo. Il software consente di fare un'enorme salto di livello nella complessità delle funzioni realizzabili, come la scrittura su display, la trasmissione dati tra diversi sistemi, l'acquisizione ed elaborazione di informazioni complesse e strutturate, il dialogo uomo/macchina...

Il software insomma diventa il centro, e il sistema hardware a microprocessore serve solo per renderlo funzionante, trasformandolo da statica sequenza di istruzioni in processo attivo.

Il programmatore deve conoscere, oltre alle singole istruzioni che gli serviranno per descrivere passo passo il processo, anche gli indirizzi delle porte di I/O, l'utilizzo che vuole fare di ogni bit di queste, e lo spazio a disposizione in memoria in cui salvare i dati di lavoro.

Un circuito che viene controllato da un sistema a microprocessore (il controllo avviene attraverso delle porte) potrebbe essere controllato da un qualsiasi sistema hardware, a patto che i fili di I/O siano sempre gli stessi e svolgano la stessa funzione.

Questo mostra ancora una volta come quello che conta alla fine è il processo realizzato, e non tanto l'hardware specifico, questo può diventare importante solo se sono richieste prestazioni particolari, vuoi in termini di velocità, vuoi in termini di risorse di memoria o di dimensioni o di consumo. Va sempre verificato se il sistema hardware è adatto all'applicazione che si vuole realizzare, infatti i limiti alle prestazioni di un processo sono direttamente legati ai limiti dell'hardware che lo ospita.


Pagina e disegni realizzati da Claudio Fin
Ultimo aggiornamento 23-9-2000