Sto considerando una situazione imminente in un progetto Linux incorporato (non ancora hardware) in cui due chip esterni dovranno condividere una singola linea IRQ fisica. Questa linea è capace nell'hardware di trigger di fronte ma non di interrupt attivati dal livello.Come vengono evitate le corse IRQ condivise in Linux
Guardando al supporto dell'irq condiviso in Linux, capisco che il modo in cui questo funzionerebbe con due driver separati è che ognuno dovrebbe chiamare il gestore di interrupt, controllare l'hardware e gestire se necessario.
Tuttavia, immagino le seguenti condizioni di gara e vorrei sapere se mi manca qualcosa o cosa potrebbe essere fatto per aggirare questo. Diciamo ci sono due sorgenti interrupt esterni, i dispositivi A e B: si verifica
- dispositivo B interrupt, IRQ va attivo
- bordo IRQ provoca gestore nucleo Linux interrupt per eseguire
- ISR per tirature dispositivo A, reperti nessun interrupt attesa
- dispositivo si verifica un interrupt, IRQ rimane maniglie (wire-O)
- ISR per tirature dispositivo B, reperti interrompere attesa, attivi e libera gestore di interrupt
- nucleo esce
- IRQ rimane attivo, non più bordi vengono generati, IRQ è bloccato
sembra che per questo da fissare, il gestore di interrupt nucleo dovrebbe controllare il livello IRQ dopo l'esecuzione di tutti i gestori, e se ancora attivo, eseguili di nuovo tutti. Linux lo farà? Non penso che il nucleo dell'interrupt sappia come controllare il livello di una linea IRQ.
Questa gara è qualcosa che può effettivamente accadere e, in caso affermativo, come posso affrontare questo?
Grazie per il consiglio. Penso che avremo intenzione di implementare un controller di interrupt in un FPGA che dobbiamo comunque avere sulla lavagna. – blueshift