|
Esercizio# 5 - Processi paralleli (Parallel processing) - Output.spin
Negli esercizi precedenti è stato finora utilizzato un solo cog per l'esecuzione del programma e quindi per il lampeggio di uno o più led in sequenza. Questo modo di funzionamento è chiamato "processo seriale" (serial processing), in quanto il cog in uso ha eseguito il lampeggio del primo led, e al termine dell'esecuzione, ha eseguito il lampeggio del secondo led e così via.
Supponiamo ora di voler far lampeggiare i led simultaneamente, collegati su pin diversi e con velocità diverse. Il codice di seguito riportato, per questo esercizio, introduce una nuova istruzione che ha lo scopo di 'attivare' un nuovo cog in parallelo a quello già in funzione e assegnargli un compito, ossia quello di eseguire il lampeggio di un secondo led contemporaneamente al lavoro del primo cog (parallel processing).
|
{{Output.spin
Lampeggio simultaneo di due leds.}}
VAR
long Stack[9] ' Dimensione delle stack per il nuovo cog
PUB Main
cognew(Toggle(16, 3_000_000, 10), @Stack) 'Lampeggio pin 16 (10 volte)
Toggle(17, 2_000_000, 20) 'Lampeggio pin 17 (20 volte)
PUB Toggle(Pin, Delay, Count)
{{Inverti lo stato del Pin tante volte quanto indicato in Count, e
attendi il tempo Delay tra una inversione e l'altra.}}
dira[Pin]~~ ' Imposta il registro di direzione
repeat Count ' Ripeti tante volte quanto in Count
!outa[Pin] ' Inverti lo stato logico del Pin
waitcnt(Delay + cnt) ' Attendi i cicli indicati in Delay
|
In questo programma è stato reintrodotto il blocco 'VAR' in quanto è necessario impostare una variabile indicizzata dimensionata con un valore di "spazio necessario" per le operazioni di stack del nuovo cog.
Il metodo Main (il primo ad essere eseguito dal cog 0), attiva un nuovo cog tramite l'istruzione 'cognew', passando come parametri il nome del metodo che questo dovrà eseguire (Toggle) più il nome della variabile indicizzata da utilizzare come stack (passata come indirizzo). Il nome del metodo da eseguire, verrà passato con tutti i suoi parametri necessari per il lampeggio del led (pin=16, Delay=3.000.000, Count=10). Il prefisso '@' prima del nome della variabile indica al compilatore che la variabile da passare al metodo non si riferisce al suo valore, ma al suo indirizzo di memoria, così da permettere alla routine di programma che riceverà questa informazione, la possibilità di poter manipolare l'intero contenuto, semplicemente modificando (o leggendo) i dati a partire dall'indirizzo di memoria passato. Dopo aver attivato e assegnato il compito da eseguire al nuovo cog, il cog 0 continuerà l'esecuzione del suo programma, facendo lampeggiare il suo led collegato al pin 17 per 20 volte utilizzando lo stesso metodo passato al nuovo cog (Toggle). Quindi in questo esempio abbiamo visto come utilizzare due cog contemporaneamente, facendo eseguire lo stesso lavoro per entrambi utilizzando gli stessi metodi, ma utilizzando parametri diversi (Pin, Delay e Count).
|

|
Quando il programma viene eseguito dal propeller, il primo cog (cog0) carica l'interprete SPIN nella sua memoria RAM per l'esecuzione del metodo Main, successivamente all'esecuzione della istruzione COGNEW, viene attivato il cog immediatamente disponibile (in questo caso il cog 1) caricando anch'esso l'interprete nella sua memoria RAM. Entrambi eseguiranno il metodo TOGGLE leggendo le istruzioni dalla memoria principale (Main RAM), ma utilizzando per ciascuno di essi, un loro 'spazio personale' (stack) e parametri diversi (Pin, Delay e Count).
|
|