legacy wrote:se riduci a zero il context switch necessario per eseguire la ISR e fai forte uso di variabili globali, p.e. puntatori alla FIFO, direi due cose
1) la latenza aggiunta dalla CPU e' molto bassa e confrontabile al piu' con un paio di istruzioni macchina, il che significa qualche colpo di clock (5 o 6 nel caso peggiore di architetture NON pipelined multiciclo) alla frequenza del CPU_clock che e' ordine dei Mhz, quindi relativamente poca cosa.
2) e in ogni caso, se a te da fastidio una qualsiasi cosa aleatoria, la latenza in oggetto e' sistemica, quindi non dovrebbe darti noia perche' volendo puoi anche correggerla (anticipando)
Ok, grazie per i suggerimenti.
Ricapitolando, uso il contatore esterno del bit clock per gestire l'interrupt e comunicare alla cpu che deve avanzare al successivo bit sulle porte utilizzate per alimentare DL e DR del dac. Nel frattempo ho anticipato, nel senso che il bit è già presente all'uscita al momento del bit clock sul dac, l'interrupt farà avanzare il successivo.
Devo comunque fare in modo che sia la cpu ad abilitare il contatore solo quando il primo bit è presente, e a disabilitarlo in caso di eventi esterni che interrompono il flusso continuo dei dati, ma questo dovrebbe essere semplice da realizzare con poche porte logiche.
Il clock a 44.1 kHz sarà un'operazione completamente esterna alla cpu, dal momento che si verificherà quando i contatori raggiungeranno 256 e si resetteranno, continuando a leggere i bit in base al bit clock. Devo solo verificare dal datasheet del dac quali fronti utilizzare e se deve esserci un ritardo tra il latch dell'ultimo bit ed il clock sul pin LE che abilita il dac ad aggiornare gli switches. Rimane comunque tutto esterno al micro.
Non dovrebbero esserci in effetti problemi di latenza, dal momento che il bit clock avrà una frequenza molto più bassa della cpu.
Qual è il modo più efficace per implementare tutto questo nel micro?
Presumo l'interfaccia SDIO per leggere il file system della sd card.
Quali porte dovrei utilizzare per l'IO, 1 input per l'interrupt da clock esterno, 1 output per abilitare i contatori, 2 output per i dati da passare al dac (canale destro e sinistro)?
Non credo di poter utilizzare la SPI per i dati, dato che sulla base board mi sembra essercene 1 sola, insufficiente per alimentare simultaneamente i due canali del dac.