allora, volendo programmare un microcontrollore per ricezione midi, si può facilmente gestire una routine di interruzione che non fa altro che gestire un buffer circolare, in modo da prendere tutti i messaggi midi che arrivano e passarli piano piano alla funzione che li elabora. Bene fin qui tutto ok.
ora mettiamo caso che la funziona che elabora un singolo messaggio occupi il processore per qualche tempo, diciamo 1 secondo, con l'arrivo di diversi messaggi, l'ultimo di questi verrà elaborato dopo un bel pò di tempo.
Faccio un esempio banale:
facciamo finta che la funzione prenda il messaggio Control Change appena arrivato, e qualsiasi valore abbia, faccia lampeggiare 10 volte un led ogni 100ms, quindi ogni CC provoca 1 secondo di lampeggiamento. Quindi, se durante quel secondo di lampeggiamento sono arrivati altri 10 control change, il decimo messaggio sarà elaborato dopo 10 secondi, essendosi dovuto mettere in fila

in molti casi non è quello che si vuole, ovvero, facciamo finta di dover scorrere le patch con una pedaliera, si inviano al controllore un sacco di messaggi, ma noi chiaramente stavamo solo scorrendo per raggiungere quello che intendiamo usare, invece il microcontrollore è costretto a elaborare tutto quello che riceve e che gli è dato ricevere.
Allora, cosa si può fare per evitare questo?
io pensavo di aggiungere una condizione nella routine di interrupt, del tipo "se arriva uno Status Byte del giusto canale e del giusto tipo, invece di tornare al punto in cui l'interrupt è arrivato, torna al programma principale", così facendo l'ultimo status byte fa ripartire il tutto, e non è costretto a perdere tempo con messaggi che non vogliamo elaborare.
il fatto è che per realizzare questa cosa bisogna fare una chiamata a funzione all'interno dell'interrupt, e non mi piace molto, visto che una volta che la funzione chiamata avrà finito, il programma torna all'interno dell'interrupt (o sbaglio?) e quindi una volta finita la routine interrupt torna al punto in cui l'interrupt era arrivato, insomma un vero macello!
voi che dite?