2013-01-21 16 views
5

Scrivo codice per un sistema embedded (Cortex M0) e non ho tutti i lussi di mutex/spinlock/ecc. C'è un modo semplice per aggiungere dati a un buffer condiviso (log-file) che verrà scaricato su disco dal mio ciclo Main()?Buffer interrupt

Se c'è un solo produttore (1 interrupt) e singolo consumatore (anello principale), potrei usare un buffer semplice in cui il produttore aumenta la "testa" e il consumatore la "coda". E sarà perfettamente al sicuro. Ma ora che ho più produttori (interrupt) mi sembra di essere bloccato.

Potrei assegnare a ciascun interrupt un proprio buffer e combinarli in Main(), ma ciò richiederà un sacco di RAM e complessità extra.

+0

Avete qualche tipo di libreria run-time con cui vi collegate? Forse contiene funzioni "atomiche"? O di non esiste tale funzione/libreria, quindi la CPU potrebbe avere istruzioni per confrontare e aumentare/diminuire i valori atomicamente? Questi possono essere usati per la tua implementazione di semafori o mutex. –

+0

@JoachimPileborg È una CPU NXP LPC11U35 ed è collegata alla libreria RedLib, che non fornisce funzioni atomiche per quanto ne so. – Muis

+0

Non ho familiarità con la struttura di interrupt di questo sistema. Ma i tuoi interrupt hanno la stessa priorità o c'è un ordine gerarchico? Ad ogni modo, sembra che tu possa semplicemente usare uno stack per un buffer. O puoi prevedere un problema di overflow dello stack con questa soluzione? –

risposta

5

È possibile implementare questo tramite un semplice ring buffer (array circolare), in cui si disattivano le fonti di interrupt hardware durante l'accesso. Ha solo bisogno delle funzioni init, add e remove.

Non sono sicuro di come l'MCU in questione gestisce gli interrupt, ma molto probabilmente rimarranno in sospeso, purché si attivi/disattivi solo l'interrupt della particolare periferica hardware. A seconda della natura della tua applicazione, puoi anche disabilitare la maschera dell'interrupt globale, ma è piuttosto rozzo.

Generalmente, non è necessario preoccuparsi di perdere gli interrupt, perché se il codice che gestisce gli interrupt in arrivo è più lento della frequenza di interruzione, nessun software al mondo lo risolverà. Dovresti accettare perdite di dati o aumentare l'orologio della CPU per evitare tali scenari. Ma ovviamente dovresti sempre cercare di mantenere il codice all'interno dell'ISR il più compatto possibile.

+0

Per un singolo produttore/singolo consumatore, non è necessario disattivare le interruzioni o bloccare l'accesso, a condizione che il produttore sposti solo il puntatore di testa e che il consumatore muova solo il puntatore di coda. – Lou

+0

@Lou Questo non è corretto a meno che l'accesso non sia atomico, il che non è il caso qui. – Lundin

+0

@Lunding: accesso a ciò che non è atomico? Un interrupt sta scrivendo su una variabile, l'altro lo sta leggendo. Per un processore a 32 bit come Cortex M0, non mi aspetto che tu possa ottenere scritture o letture parziali a 32 bit. – Lou