C'è un livello di priorità che sento come se avessi invertito.
In genere, il software che comunica con la periferica è il livello di driver ed è il livello più basso di astrazione. I driver non hanno bisogno di sapere nulla sulla logica o sui dati al di sopra del loro livello, solo come comunicare con le periferiche e dove mettere i dati.
Avanti sopra di loro è più di un livello manageriale. Questo livello comunica con i driver per acquisire i dati e fare formattazione, eseguire l'ordinamento o qualsiasi altro tipo di algoritmo.
Sopra di loro, c'è il livello dell'applicazione. Questo livello viene in genere utilizzato come gestore di stato dominante o qualsiasi logica "aziendale".
Gliinterrupthardwaresonomeglioequipaggiatipergestireperiferichedibassolivello,comeunADCoundispositivodicomunicazione,invecediavereunthread/attivitàRTOS.Lagestioneelamanutenzionediquestiinterruptègestitaalmeglioallivellodelconducente.Quindii"thread" A, B, C sarebbero interrotti da interruzioni hardware.
Inoltre, voglio sottolineare che penso che tu intenda attività RTOS, che i thread b / c possano essere eseguiti contemporaneamente e che non siano tipici nello sviluppo integrato.
Mentre arrivano i tuoi dati, dovresti avere un evento / messaggio / flag / segnale dal contesto di interruzione per informare l'attività manageriale D, che i dati sono pronti per quel tipo di dati specifico. Ciò manterrà l'elaborazione dell'interrupt al minimo e ridurrà la complessità di mantenere il tuo codice sincrono sicuro.
Una coda di messaggi sarebbe la migliore, quindi hai meno paura di perdere un messaggio da una delle tue altre periferiche mentre raccogli i dati da un'altra.
Un'altra cosa da tenere a mente, è che si desidera disabilitare l'interrupt per la periferica / driver a cui si sta accedendo per i dati. Altrimenti, è possibile spostare / copiare dati, quando si riceve un'interruzione, che manipola i dati a cui si sta tentando di accedere, che potrebbero corromperli. Oppure devi configurare un buffer circolare FIFO nel driver, dove l'interrupt scrive solo su di esso, mentre il gestore legge solo da esso.
L'attività E sarebbe a livello di applicazione, in attesa che un'applicazione esterna richieda i dati o fornisca un servizio per trasmettere / trasmettere i dati a chiunque sia il consumatore.
Non sono sicuro di aver capito perché avresti bisogno del compito F o G.
Scusa se questa è una risposta prolissa, ma l'architettura software incorporata è uno spazio di conoscenza molto ampio.